Merge "Ensure the editing textarea is not higher than browser's viewport"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 6 Mar 2017 23:25:32 +0000 (23:25 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 6 Mar 2017 23:25:32 +0000 (23:25 +0000)
1706 files changed:
.eslintrc.json
.stylelintrc
.travis.yml
CREDITS
Gemfile
Gemfile.lock
Gruntfile.js
HISTORY
RELEASE-NOTES-1.29
api.php
autoload.php
composer.json
docs/extension.schema.v1.json
docs/hooks.txt
docs/uidesign/child-selector-emu.html
img_auth.php
includes/AjaxDispatcher.php
includes/Block.php
includes/Category.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/HeaderCallback.php [new file with mode: 0644]
includes/HistoryBlob.php
includes/Html.php
includes/LinkFilter.php
includes/Linker.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/MergeHistory.php
includes/MovePage.php
includes/NoLocalSettings.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Preferences.php
includes/PrefixSearch.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/Setup.php
includes/Title.php
includes/TitleArray.php
includes/TitleArrayFromResult.php
includes/WatchedItemQueryService.php
includes/WatchedItemQueryServiceExtension.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RollbackAction.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiPageSet.php
includes/api/ApiPurge.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiResult.php
includes/api/ApiUnblock.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.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/mk.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.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/api/i18n/zh-hant.json
includes/auth/ThrottlePreAuthenticationProvider.php
includes/cache/BacklinkCache.php
includes/cache/LinkBatch.php
includes/cache/MessageCache.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/collation/Collation.php
includes/collation/CollationEt.php
includes/collation/IcuCollation.php
includes/compat/Timestamp.php [new file with mode: 0644]
includes/content/ContentHandler.php
includes/content/FileContentHandler.php
includes/content/TextContentHandler.php
includes/content/WikiTextStructure.php
includes/content/WikitextContentHandler.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/db/CloneDatabase.php
includes/db/DatabaseMssql.php [deleted file]
includes/db/DatabaseOracle.php
includes/db/MWLBFactory.php
includes/db/ORAField.php [new file with mode: 0644]
includes/db/ORAResult.php [new file with mode: 0644]
includes/debug/MWDebug.php
includes/debug/logger/monolog/AvroFormatter.php
includes/debug/logger/monolog/KafkaHandler.php
includes/debug/logger/monolog/LogstashFormatter.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksUpdate.php
includes/diff/DifferenceEngine.php
includes/diff/WordAccumulator.php
includes/exception/ErrorPageError.php
includes/exception/MWExceptionHandler.php
includes/exception/UserNotLoggedIn.php
includes/export/WikiExporter.php
includes/export/XmlDumpWriter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLForm.php
includes/htmlform/fields/HTMLUsersMultiselectField.php [new file with mode: 0644]
includes/http/Http.php
includes/http/MWHttpRequest.php
includes/import/WikiImporter.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MssqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerName.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/WebInstallerUpgrade.php
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/ckb.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/he.json
includes/installer/i18n/hi.json
includes/installer/i18n/ia.json
includes/installer/i18n/ko.json
includes/installer/i18n/mg.json
includes/installer/i18n/mk.json
includes/installer/i18n/nl.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/uk.json
includes/installer/i18n/vi.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/CategoryMembershipChangeJob.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/libs/CSSMin.php
includes/libs/CryptHKDF.php
includes/libs/HttpStatus.php
includes/libs/IP.php
includes/libs/StatusValue.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/HTTPFileStreamer.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/mime/mime.info
includes/libs/objectcache/RESTBagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WANObjectCacheReaper.php
includes/libs/objectcache/WinCacheBagOStuff.php
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseDomain.php
includes/libs/rdbms/database/DatabaseMssql.php [new file with mode: 0644]
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/position/DBMasterPos.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php [new file with mode: 0644]
includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/defines.php
includes/libs/rdbms/encasing/Blob.php
includes/libs/rdbms/encasing/IBlob.php [new file with mode: 0644]
includes/libs/rdbms/encasing/LikeMatch.php
includes/libs/rdbms/encasing/MssqlBlob.php
includes/libs/rdbms/encasing/PostgresBlob.php
includes/libs/rdbms/field/Field.php
includes/libs/rdbms/field/MssqlField.php
includes/libs/rdbms/field/MySQLField.php
includes/libs/rdbms/field/ORAField.php [deleted file]
includes/libs/rdbms/field/PostgresField.php
includes/libs/rdbms/field/SQLiteField.php
includes/libs/rdbms/lbfactory/ILBFactory.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/ILoadMonitor.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php
includes/libs/rdbms/loadmonitor/LoadMonitorNull.php
includes/libs/replacers/Replacer.php
includes/libs/time/ConvertibleTimestamp.php [deleted file]
includes/libs/time/TimestampException.php [deleted file]
includes/libs/time/defines.php [deleted file]
includes/libs/xmp/XMP.php
includes/libs/xmp/XMPInfo.php
includes/libs/xmp/XMPValidate.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPager.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/DjVuImage.php
includes/media/FormatMetadata.php
includes/media/Jpeg.php
includes/media/MediaHandler.php
includes/media/SVGMetadataExtractor.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/PageAcrhive.php [new file with mode: 0644]
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/pager/ReverseChronologicalPager.php
includes/parser/BlockLevelPass.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/output/ProfilerOutputDb.php
includes/rcfeed/FormattedRCFeed.php [new file with mode: 0644]
includes/rcfeed/RCFeed.php [new file with mode: 0644]
includes/rcfeed/RCFeedEngine.php
includes/rcfeed/RedisPubSubFeedEngine.php
includes/rcfeed/UDPRCFeedEngine.php
includes/registration/Processor.php
includes/registration/VersionChecker.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/SearchIndexFieldDefinition.php
includes/search/SqlSearchResultSet.php
includes/session/SessionManager.php
includes/session/SessionManagerInterface.php
includes/session/SessionProvider.php
includes/site/DBSiteStore.php
includes/site/Site.php
includes/skins/BaseTemplate.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPageFactory.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialLog.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/SpecialMovepage.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserLogout.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWatchlist.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/NewPagesPager.php
includes/specials/pagers/ProtectedPagesPager.php [new file with mode: 0644]
includes/specials/pagers/UsersPager.php
includes/tidy/Balancer.php
includes/upload/UploadBase.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserArray.php
includes/user/UserArrayFromResult.php
includes/user/UserGroupMembership.php
includes/user/UserRightsProxy.php
includes/utils/AutoloadGenerator.php
includes/utils/BatchRowIterator.php
includes/utils/MWCryptHKDF.php
includes/widget/DateInputWidget.php
includes/widget/UsersMultiselectWidget.php [new file with mode: 0644]
includes/widget/search/BasicSearchResultSetWidget.php
includes/widget/search/InterwikiSearchResultSetWidget.php
includes/widget/search/InterwikiSearchResultWidget.php [new file with mode: 0644]
includes/widget/search/SearchFormWidget.php
includes/widget/search/SearchResultSetWidget.php [new file with mode: 0644]
includes/widget/search/SimpleSearchResultSetWidget.php [new file with mode: 0644]
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageAr.php
languages/classes/LanguageKsh.php
languages/classes/LanguageLa.php
languages/classes/LanguageMl.php
languages/classes/LanguageTr.php
languages/data/Names.php
languages/data/ZhConversion.php
languages/i18n/ace.json
languages/i18n/aeb-arab.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.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/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cu.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en-gb.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/frp.json
languages/i18n/frr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/khw.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/my.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdh.json
languages/i18n/ses.json
languages/i18n/sh.json
languages/i18n/shn.json
languages/i18n/si.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/sv.json
languages/i18n/sw.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/udm.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesArz.php
languages/messages/MessagesBr.php
languages/messages/MessagesCa.php
languages/messages/MessagesCs.php
languages/messages/MessagesEn.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesGn.php
languages/messages/MessagesJv.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesLad.php
languages/messages/MessagesLn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNrm.php [new file with mode: 0644]
languages/messages/MessagesOc.php
languages/messages/MessagesPl.php
languages/messages/MessagesPt.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesSv.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTe.php
languages/messages/MessagesZea.php
maintenance/CodeCleanerGlobalsPass.inc [new file with mode: 0644]
maintenance/Maintenance.php
maintenance/addSite.php [new file with mode: 0755]
maintenance/archives/patch-archive-ar_id.sql
maintenance/archives/patch-categorylinks-better-collation.sql
maintenance/archives/patch-externallinks-el_id.sql
maintenance/archives/patch-up_property.sql
maintenance/archives/patch-user_groups-primary-key.sql [new file with mode: 0644]
maintenance/archives/patch-user_groups-ug_expiry.sql
maintenance/backup.inc
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/cleanupImages.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupTitles.php
maintenance/convertUserOptions.php
maintenance/dumpTextPass.php
maintenance/fixDoubleRedirects.php
maintenance/generateSitemap.php
maintenance/hhvm/makeRepo.php
maintenance/importImages.php
maintenance/initUserPreference.php [new file with mode: 0644]
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simpphrases.manual
maintenance/language/zhtable/simpphrases_exclude.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/manageJobs.php
maintenance/migrateUserGroup.php
maintenance/mssql/tables.sql
maintenance/namespaceDupes.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/purgeChangedPages.php
maintenance/purgeModuleDeps.php [new file with mode: 0644]
maintenance/rebuildFileCache.php
maintenance/refreshLinks.php
maintenance/shell.php [new file with mode: 0644]
maintenance/sql.php
maintenance/sqlite/archives/initial-indexes.sql
maintenance/storage/fixBug20757.php [deleted file]
maintenance/storage/fixT22757.php [new file with mode: 0644]
maintenance/storage/trackBlobs.php
maintenance/tables.sql
maintenance/update.php
maintenance/userDupes.inc
maintenance/wrapOldPasswords.php
mw-config/config-cc.css
mw-config/config.css
package.json
resources/Resources.php
resources/lib/moment/LICENSE
resources/lib/moment/locale/af.js
resources/lib/moment/locale/ar-ma.js
resources/lib/moment/locale/ar-sa.js
resources/lib/moment/locale/ar-tn.js [new file with mode: 0644]
resources/lib/moment/locale/ar.js
resources/lib/moment/locale/az.js
resources/lib/moment/locale/be.js
resources/lib/moment/locale/bg.js
resources/lib/moment/locale/bn.js
resources/lib/moment/locale/bo.js
resources/lib/moment/locale/br.js
resources/lib/moment/locale/bs.js
resources/lib/moment/locale/ca.js
resources/lib/moment/locale/cs.js
resources/lib/moment/locale/cv.js
resources/lib/moment/locale/cy.js
resources/lib/moment/locale/da.js
resources/lib/moment/locale/de-at.js
resources/lib/moment/locale/de.js
resources/lib/moment/locale/dv.js [new file with mode: 0644]
resources/lib/moment/locale/el.js
resources/lib/moment/locale/en-au.js
resources/lib/moment/locale/en-ca.js
resources/lib/moment/locale/en-gb.js
resources/lib/moment/locale/eo.js
resources/lib/moment/locale/es.js
resources/lib/moment/locale/et.js
resources/lib/moment/locale/eu.js
resources/lib/moment/locale/fa.js
resources/lib/moment/locale/fi.js
resources/lib/moment/locale/fo.js
resources/lib/moment/locale/fr-ca.js
resources/lib/moment/locale/fr.js
resources/lib/moment/locale/fy.js [new file with mode: 0644]
resources/lib/moment/locale/gd.js [new file with mode: 0644]
resources/lib/moment/locale/gl.js
resources/lib/moment/locale/he.js
resources/lib/moment/locale/hi.js
resources/lib/moment/locale/hr.js
resources/lib/moment/locale/hu.js
resources/lib/moment/locale/hy-am.js
resources/lib/moment/locale/id.js
resources/lib/moment/locale/is.js
resources/lib/moment/locale/it.js
resources/lib/moment/locale/ja.js
resources/lib/moment/locale/jv.js [new file with mode: 0644]
resources/lib/moment/locale/ka.js
resources/lib/moment/locale/kk.js [new file with mode: 0644]
resources/lib/moment/locale/km.js
resources/lib/moment/locale/ko.js
resources/lib/moment/locale/ky.js [new file with mode: 0644]
resources/lib/moment/locale/lb.js
resources/lib/moment/locale/lo.js [new file with mode: 0644]
resources/lib/moment/locale/lt.js
resources/lib/moment/locale/lv.js
resources/lib/moment/locale/mi.js [new file with mode: 0644]
resources/lib/moment/locale/mk.js
resources/lib/moment/locale/ml.js
resources/lib/moment/locale/mr.js
resources/lib/moment/locale/ms-my.js
resources/lib/moment/locale/ms.js [new file with mode: 0644]
resources/lib/moment/locale/my.js
resources/lib/moment/locale/nb.js
resources/lib/moment/locale/ne.js
resources/lib/moment/locale/nl.js
resources/lib/moment/locale/nn.js
resources/lib/moment/locale/pa-in.js [new file with mode: 0644]
resources/lib/moment/locale/pl.js
resources/lib/moment/locale/pt-br.js
resources/lib/moment/locale/pt.js
resources/lib/moment/locale/ro.js
resources/lib/moment/locale/ru.js
resources/lib/moment/locale/se.js [new file with mode: 0644]
resources/lib/moment/locale/si.js [new file with mode: 0644]
resources/lib/moment/locale/sk.js
resources/lib/moment/locale/sl.js
resources/lib/moment/locale/sq.js
resources/lib/moment/locale/sr-cyrl.js
resources/lib/moment/locale/sr.js
resources/lib/moment/locale/ss.js [new file with mode: 0644]
resources/lib/moment/locale/sv.js
resources/lib/moment/locale/sw.js [new file with mode: 0644]
resources/lib/moment/locale/ta.js
resources/lib/moment/locale/te.js [new file with mode: 0644]
resources/lib/moment/locale/th.js
resources/lib/moment/locale/tl-ph.js
resources/lib/moment/locale/tr.js
resources/lib/moment/locale/tzm-latn.js
resources/lib/moment/locale/tzm.js
resources/lib/moment/locale/uk.js
resources/lib/moment/locale/uz.js
resources/lib/moment/locale/vi.js
resources/lib/moment/locale/x-pseudo.js [new file with mode: 0644]
resources/lib/moment/locale/zh-cn.js
resources/lib/moment/locale/zh-hk.js [new file with mode: 0644]
resources/lib/moment/locale/zh-tw.js
resources/lib/moment/moment.js
resources/lib/oojs-ui/i18n/bqi.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/io.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/mg.json
resources/lib/oojs-ui/i18n/nn.json
resources/lib/oojs-ui/i18n/pnb.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/yi.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-editing-advanced.json
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/eye.png
resources/lib/oojs-ui/themes/apex/images/icons/eye.svg
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg
resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/alert-warning.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arrow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/article-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleCheck-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleRedirect-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articleSearch-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bell-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bell-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bellOn-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bigger-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/block-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/book-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bookmark-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/browser-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/citeArticle-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clear-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clock-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clock-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/collapse-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/comment-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/die-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/downTriangle-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/downTriangle-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/download-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/edit-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editLock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/editUndo-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ellipsis-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ellipsis-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/expand-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eyeClosed-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/eyeClosed-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/flag-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/folderPlaceholder-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/funnel-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfBright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/heart-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/heart-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/indent-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/info-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/info-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/key-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/keyboard-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listBullet-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/listNumbered-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/lock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logOut-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-cc-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-cc-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaCommons-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaCommons-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikimediaDiscovery-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikipedia-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/logo-wikipedia-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/map-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPin-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapPinAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/message-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/moon-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newWindow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newline-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/newspaper-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notBright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ongoingConversation-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outdent-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/play-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/printer-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/puzzle-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotesAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/search-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/settings-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/signature-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smaller-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubble-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbleAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/speechBubbles-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stop-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeFlow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSideMenu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSideMenu-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeSummary-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/stripeToC-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/subscript-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/sun-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/superscript-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-warning.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/templateAdd-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tray-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/tray-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unBlock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unFlag-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-destructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unLock-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unTrash-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upTriangle-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upTriangle-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/upload-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userActive-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userAvatar-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userAvatar-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userInactive-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/userTalk-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/watchlist-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/window-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/window-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg
resources/src/dom-level2-skip.js [deleted file]
resources/src/jquery/jquery.arrowSteps.css
resources/src/jquery/jquery.badge.css
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.farbtastic.css
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.spinner.css
resources/src/jquery/jquery.suggestions.css
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.tablesorter.less
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
resources/src/mediawiki.action/mediawiki.action.edit.css
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.stash.js
resources/src/mediawiki.action/mediawiki.action.edit.styles.css
resources/src/mediawiki.action/mediawiki.action.history.css
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.filepage.css
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.mixins.animation.less
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.mixins.rotation.less
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/images/marker-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.rcfilters/images/marker-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.rcfilters/images/pending.gif [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less [new file with mode: 0644]
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.FiltersListWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js [new file with mode: 0644]
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.FilterItemHighlightButton.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js [new file with mode: 0644]
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.skinning/interface.css
resources/src/mediawiki.special/images/special.search/book-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/book-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/course-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/course-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/definition-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/definition-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/dna-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/dna-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/image-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/image-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/news-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/news-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/quotation-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/quotation-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/textbook-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/textbook-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/travel-icon.png [new file with mode: 0644]
resources/src/mediawiki.special/images/special.search/travel-icon.svg [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.apisandbox.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.block.css
resources/src/mediawiki.special/mediawiki.special.comparepages.styles.less
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.styles.css
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.upload.styles.css
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.ui/components/text.less
resources/src/mediawiki.ui/default.less
resources/src/mediawiki.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki/api.js
resources/src/mediawiki/htmlform/ooui.styles.css
resources/src/mediawiki/htmlform/styles.css
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less
resources/src/mediawiki/mediawiki.Upload.BookletLayout.css
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.apihelp.css
resources/src/mediawiki/mediawiki.debug.less
resources/src/mediawiki/mediawiki.diff.styles.css
resources/src/mediawiki/mediawiki.feedback.css
resources/src/mediawiki/mediawiki.filewarning.less
resources/src/mediawiki/mediawiki.helplink.less
resources/src/mediawiki/mediawiki.hlist.css
resources/src/mediawiki/mediawiki.icon.less
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.pager.tablePager.less
resources/src/mediawiki/mediawiki.requestIdleCallback.js
resources/src/mediawiki/mediawiki.storage.js
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/gallery-slideshow.js
resources/src/mediawiki/page/gallery.css
resources/src/mediawiki/page/gallery.print.css
resources/src/mediawiki/page/image-pagination.js
resources/src/mediawiki/page/watch.js
resources/src/moment-dmy.js
resources/src/moment-locale-overrides.js
resources/src/polyfill-nodeTypes.js [deleted file]
resources/src/startup.js
tests/browser/features/step_definitions/login_steps.rb
tests/browser/features/step_definitions/preferences_appearance_steps.rb
tests/browser/features/step_definitions/preferences_editing_steps.rb
tests/browser/features/step_definitions/preferences_user_profile_steps.rb
tests/browser/features/support/pages/login_page.rb
tests/common/TestSetup.php
tests/parser/ParserTestRunner.php
tests/parser/README
tests/parser/TestFileEditor.php
tests/parser/TidySupport.php
tests/parser/extraParserTests.txt
tests/parser/parserTests.txt
tests/phan/config.php
tests/phpunit/autoload.ide.php [new file with mode: 0644]
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SanitizerValidateEmailTest.php
tests/phpunit/includes/TestLogger.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiQueryAllPagesTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php
tests/phpunit/includes/cache/LocalisationCacheTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php
tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php [deleted file]
tests/phpunit/includes/libs/xmp/XMPTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
tests/phpunit/includes/page/ArticleTablesTest.php
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchIndexFieldTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/skins/SkinTemplateTest.php
tests/phpunit/includes/specials/SpecialBooksourcesTest.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/tidy/BalancerTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/ClassCollectorTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/classes/LanguageBe_taraskTest.php
tests/phpunit/languages/classes/LanguageMlTest.php
tests/phpunit/languages/classes/LanguageTrTest.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/mocks/filebackend/MockFSFile.php
tests/phpunit/skins/SideBarTest.php
tests/phpunit/specials/SpecialSearchTest.php [deleted file]
tests/phpunit/structure/AutoLoaderTest.php
tests/phpunit/structure/ContentHandlerSanityTest.php
tests/phpunit/suite.xml
tests/qunit/.eslintrc.json [new file with mode: 0644]
tests/qunit/QUnitTestResources.php
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/mediawiki.jqueryMsg.data.js
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
tests/qunit/suites/resources/jquery/jquery.localize.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
tests/qunit/suites/resources/jquery/jquery.placeholder.test.js
tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js
tests/qunit/suites/resources/startup.test.js
thumb.php

index 044dd72..64b5ea7 100644 (file)
@@ -2,14 +2,12 @@
        "extends": "wikimedia",
        "env": {
                "browser": true,
-               "jquery": true,
-               "qunit": true
+               "jquery": true
        },
        "globals": {
                "require": false,
                "module": false,
                "mediaWiki": false,
-               "mwPerformance": false,
                "OO": false
        },
        "rules": {
index 62dbeb6..27e289d 100644 (file)
@@ -1,26 +1,8 @@
 {
+       "extends": "stylelint-config-wikimedia",
        "rules": {
-               "color-hex-case": [ "lower" ],
-               "color-hex-length": [ "short" ],
-               "color-named": [ "never" ],
-               "color-no-invalid-hex": true,
+               "no-descending-specificity": null,
 
-               "declaration-bang-space-after": [ "never" ],
-               "declaration-bang-space-before": [ "always" ],
-               "declaration-colon-space-after": [ "always" ],
-               "declaration-colon-space-before": [ "never" ],
-
-               "font-family-name-quotes": [ "always-unless-keyword" ],
-               "font-weight-notation": [ "named-where-possible" ],
-
-               "function-calc-no-unspaced-operator": true,
-               "function-comma-newline-after": "never-multi-line",
-               "function-comma-newline-before": "never-multi-line",
-               "function-comma-space-after": [ "always" ],
-               "function-comma-space-before": [ "never" ],
-               "function-parentheses-newline-inside": [ "never-multi-line" ],
-               "function-parentheses-space-inside": [ "always" ],
-               "function-url-quotes": [ "never" ],
-               "function-whitespace-after": [ "always" ],
+               "selector-no-id": null
        }
 }
index 9738605..5e2c7a0 100644 (file)
@@ -7,17 +7,29 @@
 # complement that setup by testing MediaWiki on travis
 #
 language: php
+# Use the slower sudo-enabled VMs instead of fast containers:
+# - Package 'djvulibre-bin' is not yet whitelisted for trusty containers.
+#   https://github.com/travis-ci/apt-package-whitelist/issues/4036
+sudo: required
+# Use Trusty instead of Travis default (precise)
+# - Required in order to use HHVM 3.6 or higher.
+# - Required for non-buggy xml library for XmlTypeCheck/UploadBaseTest (T75176).
+dist: trusty
 
 matrix:
   fast_finish: true
   include:
-    - env: dbtype=mysql
+    # On Trusty, mysql user 'travis' doesn't have create database rights
+    # Postgres has no user called 'root'.
+    - env: dbtype=mysql dbuser=root
       php: 5.5
-    - env: dbtype=postgres
+    - env: dbtype=postgres dbuser=travis
       php: 5.5
-    - env: dbtype=mysql
-      php: hhvm
-    - env: dbtype=mysql
+    - env: dbtype=mysql dbuser=root
+      # https://docs.travis-ci.com/user/languages/php#HHVM-versions
+      # https://github.com/travis-ci/travis-ci/issues/7368
+      php: hhvm-3.12
+    - env: dbtype=mysql dbuser=root
       php: 7
 
 services:
@@ -26,15 +38,17 @@ services:
 branches:
   # Test changes in master and arbitrary Travis CI branches only.
   # The latter allows developers to enable Travis CI in their GitHub fork of
-  # wikimedia/mediawiki and then push changes they like to test to branches like
+  # wikimedia/mediawiki and then push changes for testing to branches like
   # "travis-ci/test-this-awesome-change".
   only:
     - master
     - /^travis-ci\/.*$/
 
-before_install:
-  - sudo apt-get install -qq djvulibre-bin tidy
-  - composer self-update --quiet --no-interaction
+addons:
+  apt:
+    packages:
+    - djvulibre-bin
+    - tidy
 
 before_script:
   - composer install --prefer-source --quiet --no-interaction
@@ -44,7 +58,7 @@ before_script:
       --pass travis
       --dbtype "$dbtype"
       --dbname traviswiki
-      --dbuser travis
+      --dbuser "$dbuser"
       --dbpass ""
       --scriptpath "/w"
 
diff --git a/CREDITS b/CREDITS
index b37edf2..e8af23c 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -169,6 +169,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Ed Sanders
 * Edward Chernenko
 * Edward Z. Yang
+* Eddie Greiner-Petter
 * Elisabeth Bauer
 * Elliott Eggleston
 * Elvis Stansvik
diff --git a/Gemfile b/Gemfile
index 8bbd00f..ee0cec0 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.4'
+gem 'mediawiki_selenium', '~> 1.8'
 gem 'rake', '~> 11.1', '>= 11.1.1'
 gem 'rubocop', '~> 0.32.1', require: false
index 8243874..4992303 100644 (file)
@@ -4,8 +4,8 @@ GEM
     ast (2.0.0)
     astrolabe (1.3.0)
       parser (>= 2.2.0.pre.3, < 3.0)
-    builder (3.2.2)
-    childprocess (0.5.9)
+    builder (3.2.3)
+    childprocess (0.6.2)
       ffi (~> 1.0, >= 1.0.11)
     cucumber (1.3.20)
       builder (>= 2.1.2)
@@ -16,40 +16,40 @@ GEM
     data_magic (1.0)
       faker (>= 1.1.2)
       yml_reader (>= 0.6)
-    diff-lcs (1.2.5)
-    domain_name (0.5.20161129)
+    diff-lcs (1.3)
+    domain_name (0.5.20170223)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.7.1)
+    faker (1.7.3)
       i18n (~> 0.5)
-    faraday (0.10.0)
+    faraday (0.11.0)
       multipart-post (>= 1.2, < 3)
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    faraday_middleware (0.10.1)
+    faraday_middleware (0.11.0.1)
       faraday (>= 0.7.4, < 1.0)
-    ffi (1.9.14)
+    ffi (1.9.17)
     gherkin (2.12.2)
       multi_json (~> 1.3)
     headless (2.3.1)
     http-cookie (1.0.3)
       domain_name (~> 0.5)
-    i18n (0.7.0)
-    json (2.0.2)
-    mediawiki_api (0.7.0)
+    i18n (0.8.1)
+    json (2.0.3)
+    mediawiki_api (0.7.1)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
       faraday_middleware (~> 0.10, >= 0.10.0)
-    mediawiki_selenium (1.7.4)
+    mediawiki_selenium (1.8.0)
       cucumber (~> 1.3, >= 1.3.20)
       headless (~> 2.0, >= 2.1.0)
       json (~> 2.0, >= 2.0.2)
       mediawiki_api (~> 0.7, >= 0.7.0)
-      page-object (~> 1.0)
+      page-object (~> 2.0)
       rest-client (~> 1.6, >= 1.6.7)
       rspec-core (~> 2.14, >= 2.14.4)
       rspec-expectations (~> 2.14, >= 2.14.4)
-      selenium-webdriver (< 3)
+      selenium-webdriver (~> 3.1.0)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
     mime-types (2.99.3)
@@ -58,11 +58,11 @@ GEM
     multipart-post (2.0.0)
     net-http-persistent (2.9.4)
     netrc (0.11.0)
-    page-object (1.2.2)
+    page-object (2.0.0)
       net-http-persistent (~> 2.9.4)
       page_navigation (>= 0.9)
-      selenium-webdriver (>= 2.53.0)
-      watir-webdriver (>= 0.6.11, < 0.9.9)
+      selenium-webdriver (~> 3.0)
+      watir (~> 6.0)
     page_navigation (0.10)
       data_magic (>= 0.22)
     parser (2.2.2.6)
@@ -84,8 +84,8 @@ GEM
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.4)
     ruby-progressbar (1.7.5)
-    rubyzip (1.2.0)
-    selenium-webdriver (2.53.4)
+    rubyzip (1.2.1)
+    selenium-webdriver (3.1.0)
       childprocess (~> 0.5)
       rubyzip (~> 1.0)
       websocket (~> 1.0)
@@ -94,18 +94,18 @@ GEM
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.2)
-    watir-webdriver (0.9.3)
-      selenium-webdriver (>= 2.46.2)
-    websocket (1.2.3)
+    watir (6.2.0)
+      selenium-webdriver (~> 3.0)
+    websocket (1.2.4)
     yml_reader (0.7)
 
 PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.7, >= 1.7.4)
+  mediawiki_selenium (~> 1.8)
   rake (~> 11.1, >= 11.1.1)
   rubocop (~> 0.32.1)
 
 BUNDLED WITH
-   1.13.7
+   1.14.5
index 4cc9721..0e1c8cb 100644 (file)
@@ -24,12 +24,13 @@ module.exports = function ( grunt ) {
                        all: [
                                '**/*.js',
                                '!docs/**',
-                               '!tests/**',
                                '!node_modules/**',
                                '!resources/lib/**',
                                '!resources/src/jquery.tipsy/**',
                                '!resources/src/jquery/jquery.farbtastic.js',
                                '!resources/src/mediawiki.libs/**',
+                               // Third-party code of PHPUnit coverage report
+                               '!tests/coverage/**',
                                '!vendor/**',
                                // Explicitly say "**/*.js" here in case of symlinks
                                '!extensions/**/*.js',
@@ -58,7 +59,7 @@ module.exports = function ( grunt ) {
                        options: {
                                syntax: 'less'
                        },
-                       src: '{resources/src/*,mw-config/**}/*.{css,less}'
+                       src: '{resources/src,mw-config}/**/*.{css,less}'
                },
                watch: {
                        files: [
diff --git a/HISTORY b/HISTORY
index 28a9b86..7f365ac 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -326,6 +326,27 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.1 ==
+
+This is a maintenance release of the MediaWiki 1.27 branch.
+
+=== Changes since 1.27.0 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* (T57548) Remove support for $wgWellFormedXml = false, all output is now well formed
+* (T139670) Move 'UserGetRights' call before application of Session::getAllowedUserRights()
+
 == MediaWiki 1.27.0 ==
 
 === PHP version requirement in 1.27 ===
@@ -652,7 +673,7 @@ The following PHP extensions are strongly recommended:
 * ApiMain::addFormat() was removed (deprecated in 1.21).
 * ApiMain::getFormats() was removed (deprecated in 1.21).
 * ApiPageSet::finishPageSetGeneration() was removed (deprecated in 1.21).
-* ApiCreateAccount is deprecated, and will be removed soon.
+* ApiCreateAccount was removed.
 
 === Languages updated in 1.27 ===
 
@@ -909,6 +930,55 @@ For notes on 1.26.x and older releases, see HISTORY.
 
 = MediaWiki 1.26 =
 
+== MediaWiki 1.26.4 ==
+
+This is a maintenance release of the MediaWiki 1.26 branch.
+
+=== Changes since 1.26.3 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* (T124163) Fixed fatal error in DifferenceEngine under HHVM.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* Remove support for $wgWellFormedXml = false, all output is now well formed
+
+== MediaWiki 1.26.3 ==
+
+This is a maintenance release of the MediaWiki 1.26 branch.
+
+=== Changes since 1.26.2 ===
+* (T116266) Fixed undefined property notices in DairikiDiff under HHVM.
+* (T123166) Fix fatal error when importing pages to titles which cannot be
+  created, such as invalid titles or titles the user is not allowed to edit.
+* (T122056) Old tokens are remaining valid within a new session
+* (T127114) Login throttle can be tricked using non-canonicalized usernames
+* (T123653) Cross-domain policy regexp is too narrow
+* (T123071) Incorrectly identifying http link in a's href attributes, due to
+  m modifier in regex
+* (T129506) MediaWiki:Gadget-popups.js isn't renderable
+* (T125283) Users occasionally logged in as different users after
+  SessionManager deployment
+* (T103239) Patrol allows click catching and patrolling of any page
+* (T122807) [tracking] Check php crypto primatives
+* (T98313) Graphs can leak tokens, leading to CSRF
+* (T130947) Diff generation should use PoolCounter
+* (T133507) Careless use of $wgExternalLinkTarget is insecure
+* (T132874) API action=move is not rate limited
+* (T110143) strip markers can be used to get around html attribute escaping in
+  (many?) parser tags
+* (T116030) Increase pbkdf2 parameter strengths
+* (T127420) Pbkdf2Password does not check if hash_pbkdf2() succeeded
+* (T126685) Globally throttle password attempts
+
 == MediaWiki 1.26.2 ==
 
 This is a maintenance release of the MediaWiki 1.26 branch.
@@ -1187,6 +1257,33 @@ changes to languages because of Phabricator reports.
 
 = MediaWiki 1.25 =
 
+== MediaWiki 1.25.6 ==
+
+This is a maintenance release of the MediaWiki 1.25 branch.
+
+=== Changes since 1.25.5 ===
+* (T123166) Fix fatal error when importing pages to titles which cannot be
+  created, such as invalid titles or titles the user is not allowed to edit.
+* (T122056) Old tokens are remaining valid within a new session
+* (T127114) Login throttle can be tricked using non-canonicalized usernames
+* (T123653) Cross-domain policy regexp is too narrow
+* (T123071) Incorrectly identifying http link in a's href attributes, due to
+  m modifier in regex
+* (T129506) MediaWiki:Gadget-popups.js isn't renderable
+* (T125283) Users occasionally logged in as different users after
+  SessionManager deployment
+* (T103239) Patrol allows click catching and patrolling of any page
+* (T122807) [tracking] Check php crypto primatives
+* (T98313) Graphs can leak tokens, leading to CSRF
+* (T130947) Diff generation should use PoolCounter
+* (T133507) Careless use of $wgExternalLinkTarget is insecure
+* (T132874) API action=move is not rate limited
+* (T110143) strip markers can be used to get around html attribute escaping in
+  (many?) parser tags
+* (T116030) Increase pbkdf2 parameter strengths
+* (T127420) Pbkdf2Password does not check if hash_pbkdf2() succeeded
+* (T126685) Globally throttle password attempts
+
 == MediaWiki 1.25.5 ==
 
 This is a maintenance release of the MediaWiki 1.25 branch.
@@ -2573,6 +2670,26 @@ of files that are no longer available follows.
 
 = MediaWiki 1.23 =
 
+== MediaWiki 1.23.15 ==
+
+This is a maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.14 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* Remove support for $wgWellFormedXml = false, all output is now well formed
+
 == MediaWiki 1.23.13 ==
 
 This is a maintenance release of the MediaWiki 1.23 branch.
index 883729b..9883474 100644 (file)
@@ -31,6 +31,8 @@ production.
 * A temporary feature flag, $wgDisableUserGroupExpiry, is provided to disable
   new features that rely on the schema changes to the user_groups table. This
   feature flag will likely be removed before 1.29 is released.
+* (T158474) "Unknown user" has been added to $wgReservedUsernames.
+* (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs.
 
 === New features in 1.29 ===
 * (T5233) A cookie can now be set when a user is autoblocked, to track that user
@@ -56,7 +58,11 @@ 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 psr/log from v1.0.0 to v1.0.2.
+* Update Moment.js from v2.8.4 to v2.15.0.
 
 ==== New external libraries ====
 
@@ -65,12 +71,15 @@ production.
 === Bug fixes in 1.29 ===
 * (T62604) Core parser functions returning a number now format the number according
   to the page content language, not wiki content language.
+* (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.
 
 === Action API changes in 1.29 ===
-* Submitting sensitive authentication request parameters to action=clientlogin,
-  action=createaccount, action=linkaccount, and action=changeauthenticationdata
-  in the query string is now an error. They should be submitted in the POST
-  body instead.
+* Submitting sensitive authentication request parameters to action=login,
+  action=clientlogin, action=createaccount, action=linkaccount, and
+  action=changeauthenticationdata in the query string is now an error. They
+  should be submitted in the POST body instead.
 * The capture option for action=resetpassword has been removed
 * action=clearhasmsg now requires a POST.
 * (T47843) API errors and warnings may be requested in non-English languages
@@ -96,6 +105,9 @@ production.
   no longer returns a 'message' on success.
 * Added action=validatepassword to validate passwords for the account creation
   and password change forms.
+* 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 API internal changes in 1.29 ===
 * New methods were added to ApiBase to handle errors and warnings using i18n
@@ -134,7 +146,9 @@ changes to languages because of Phabricator reports.
   Some configurations (such as date formats and gender namespaces) have also
   been updated when using the fallback language's configuration was inadequate.
   The new or reinstated language fallbacks are (after cs ↔ sk in 1.28):
-  hsb ↔ dsb, io → eo, mdf → ru, pnt → el, roa-tara → it.
+  ca ↔ oc; hsb ↔ dsb; io → eo; mdf → ru; pnt → el; roa-tara → it; rup → ro;
+  sh → bs, sr-el, hr.
+* (T155957) Talk Namespaces for Javanese language (jv) have been updated.
 
 ==== No fallback for Ukrainian ====
 * (T39314) The fallback from Ukrainian to Russian was removed. The Ukrainian
diff --git a/api.php b/api.php
index 6e75fb7..a6ce3b2 100644 (file)
--- a/api.php
+++ b/api.php
@@ -63,7 +63,7 @@ RequestContext::getMain()->setTitle( $wgTitle );
 try {
        /* Construct an ApiMain with the arguments passed via the URL. What we get back
         * is some form of an ApiMain, possibly even one that produces an error message,
-        * but we don't care here, as that is handled by the ctor.
+        * but we don't care here, as that is handled by the constructor.
         */
        $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
index 2bc110c..8c63d4f 100644 (file)
@@ -11,6 +11,7 @@ $wgAutoloadLocalClasses = [
        'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php',
        'ActivityUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/ActivityUpdateJob.php',
        'AddRFCAndPMIDInterwiki' => __DIR__ . '/maintenance/addRFCandPMIDInterwiki.php',
+       'AddSite' => __DIR__ . '/maintenance/addSite.php',
        'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
        'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
        'AllMessagesTablePager' => __DIR__ . '/includes/specials/pagers/AllMessagesTablePager.php',
@@ -247,7 +248,6 @@ $wgAutoloadLocalClasses = [
        'CheckStorage' => __DIR__ . '/maintenance/storage/checkStorage.php',
        'CheckSyntax' => __DIR__ . '/maintenance/checkSyntax.php',
        'CheckUsernames' => __DIR__ . '/maintenance/checkUsernames.php',
-       'ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php',
        'ClassCollector' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
        'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
        'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
@@ -258,6 +258,7 @@ $wgAutoloadLocalClasses = [
        'ClearInterwikiCache' => __DIR__ . '/maintenance/clearInterwikiCache.php',
        'CliInstaller' => __DIR__ . '/includes/installer/CliInstaller.php',
        'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
+       'CodeCleanerGlobalsPass' => __DIR__ . '/maintenance/CodeCleanerGlobalsPass.inc',
        'CodeContentHandler' => __DIR__ . '/includes/content/CodeContentHandler.php',
        'Collation' => __DIR__ . '/includes/collation/Collation.php',
        'CollationCkb' => __DIR__ . '/includes/collation/CollationCkb.php',
@@ -288,7 +289,6 @@ $wgAutoloadLocalClasses = [
        'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
        'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
        'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
-       'ConvertibleTimestamp' => __DIR__ . '/includes/libs/time/ConvertibleTimestamp.php',
        'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
        'CookieJar' => __DIR__ . '/includes/libs/CookieJar.php',
        'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
@@ -314,7 +314,6 @@ $wgAutoloadLocalClasses = [
        'DBExpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBExpectedError.php',
        'DBFileJournal' => __DIR__ . '/includes/filebackend/filejournal/DBFileJournal.php',
        'DBLockManager' => __DIR__ . '/includes/libs/lockmanager/DBLockManager.php',
-       'DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
        'DBQueryError' => __DIR__ . '/includes/libs/rdbms/exception/DBQueryError.php',
        'DBReadOnlyError' => __DIR__ . '/includes/libs/rdbms/exception/DBReadOnlyError.php',
        'DBReplicationWaitError' => __DIR__ . '/includes/libs/rdbms/exception/DBReplicationWaitError.php',
@@ -325,11 +324,10 @@ $wgAutoloadLocalClasses = [
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
        'Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
        'DatabaseBase' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
-       'DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
        'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
        'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
        'DatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
-       'DatabaseMssql' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
        'DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php',
        'DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
        'DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
@@ -488,10 +486,10 @@ $wgAutoloadLocalClasses = [
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
        'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
-       'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
        'FixDefaultJsonContentPages' => __DIR__ . '/maintenance/fixDefaultJsonContentPages.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
+       'FixT22757' => __DIR__ . '/maintenance/storage/fixT22757.php',
        'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
        'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
        'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
@@ -507,6 +505,7 @@ $wgAutoloadLocalClasses = [
        'FormSpecialPage' => __DIR__ . '/includes/specialpage/FormSpecialPage.php',
        'FormatJson' => __DIR__ . '/includes/json/FormatJson.php',
        'FormatMetadata' => __DIR__ . '/includes/media/FormatMetadata.php',
+       'FormattedRCFeed' => __DIR__ . '/includes/rcfeed/FormattedRCFeed.php',
        'FormlessAction' => __DIR__ . '/includes/actions/FormlessAction.php',
        'GIFHandler' => __DIR__ . '/includes/media/GIF.php',
        'GIFMetadataExtractor' => __DIR__ . '/includes/media/GIFMetadataExtractor.php',
@@ -568,6 +567,7 @@ $wgAutoloadLocalClasses = [
        'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLTextFieldWithButton.php',
        'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/fields/HTMLTitleTextField.php',
        'HTMLUserTextField' => __DIR__ . '/includes/htmlform/fields/HTMLUserTextField.php',
+       'HTMLUsersMultiselectField' => __DIR__ . '/includes/htmlform/fields/HTMLUsersMultiselectField.php',
        'HTTPFileStreamer' => __DIR__ . '/includes/libs/filebackend/HTTPFileStreamer.php',
        'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
        'HashBagOStuff' => __DIR__ . '/includes/libs/objectcache/HashBagOStuff.php',
@@ -596,9 +596,6 @@ $wgAutoloadLocalClasses = [
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
        'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
-       'ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
-       'ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php',
-       'ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php',
        'ILocalizedException' => __DIR__ . '/includes/exception/LocalizedException.php',
        'IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'IP' => __DIR__ . '/includes/libs/IP.php',
@@ -631,6 +628,7 @@ $wgAutoloadLocalClasses = [
        'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
        'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
        'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+       'InitUserPreference' => __DIR__ . '/maintenance/initUserPreference.php',
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
        'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
@@ -672,10 +670,6 @@ $wgAutoloadLocalClasses = [
        'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
        'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
        'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
-       'LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php',
-       'LBFactoryMulti' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactoryMulti.php',
-       'LBFactorySimple' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySimple.php',
-       'LBFactorySingle' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySingle.php',
        'LCStore' => __DIR__ . '/includes/cache/localisation/LCStore.php',
        'LCStoreCDB' => __DIR__ . '/includes/cache/localisation/LCStoreCDB.php',
        'LCStoreDB' => __DIR__ . '/includes/cache/localisation/LCStoreDB.php',
@@ -732,7 +726,6 @@ $wgAutoloadLocalClasses = [
        'LegacyLogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
        'License' => __DIR__ . '/includes/Licenses.php',
        'Licenses' => __DIR__ . '/includes/Licenses.php',
-       'LikeMatch' => __DIR__ . '/includes/libs/rdbms/encasing/LikeMatch.php',
        'LinkBatch' => __DIR__ . '/includes/cache/LinkBatch.php',
        'LinkCache' => __DIR__ . '/includes/cache/LinkCache.php',
        'LinkFilter' => __DIR__ . '/includes/LinkFilter.php',
@@ -747,9 +740,6 @@ $wgAutoloadLocalClasses = [
        'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
        'LoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancer.php',
        'LoadBalancerSingle' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php',
-       'LoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitor.php',
-       'LoadMonitorMySQL' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php',
-       'LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php',
        'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileLockError' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
@@ -824,6 +814,7 @@ $wgAutoloadLocalClasses = [
        'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
        'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
+       'MediaWikiShell' => __DIR__ . '/maintenance/shell.php',
        'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
        'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
        'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
@@ -864,6 +855,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php',
        'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php',
        'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
+       'MediaWiki\\HeaderCallback' => __DIR__ . '/includes/HeaderCallback.php',
        'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
        'MediaWiki\\Interwiki\\InterwikiLookupAdapter' => __DIR__ . '/includes/interwiki/InterwikiLookupAdapter.php',
@@ -937,11 +929,15 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Widget\\Search\\DidYouMeanWidget' => __DIR__ . '/includes/widget/search/DidYouMeanWidget.php',
        'MediaWiki\\Widget\\Search\\FullSearchResultWidget' => __DIR__ . '/includes/widget/search/FullSearchResultWidget.php',
        'MediaWiki\\Widget\\Search\\InterwikiSearchResultSetWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultSetWidget.php',
+       'MediaWiki\\Widget\\Search\\InterwikiSearchResultWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultWidget.php',
        'MediaWiki\\Widget\\Search\\SearchFormWidget' => __DIR__ . '/includes/widget/search/SearchFormWidget.php',
+       'MediaWiki\\Widget\\Search\\SearchResultSetWidget' => __DIR__ . '/includes/widget/search/SearchResultSetWidget.php',
        'MediaWiki\\Widget\\Search\\SearchResultWidget' => __DIR__ . '/includes/widget/search/SearchResultWidget.php',
+       'MediaWiki\\Widget\\Search\\SimpleSearchResultSetWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultSetWidget.php',
        'MediaWiki\\Widget\\Search\\SimpleSearchResultWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
+       'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
        'MemcLockManager' => __DIR__ . '/includes/libs/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
@@ -977,10 +973,7 @@ $wgAutoloadLocalClasses = [
        'MoveLogFormatter' => __DIR__ . '/includes/logging/MoveLogFormatter.php',
        'MovePage' => __DIR__ . '/includes/MovePage.php',
        'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
-       'MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
-       'MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php',
        'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
-       'MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
@@ -988,8 +981,6 @@ $wgAutoloadLocalClasses = [
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
-       'MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
-       'MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
        'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MySqlLockManager.php',
        'MysqlInstaller' => __DIR__ . '/includes/installer/MysqlInstaller.php',
        'MysqlUpdater' => __DIR__ . '/includes/installer/MysqlUpdater.php',
@@ -1014,8 +1005,8 @@ $wgAutoloadLocalClasses = [
        'NullStatsdDataFactory' => __DIR__ . '/includes/libs/stats/NullStatsdDataFactory.php',
        'NumericUppercaseCollation' => __DIR__ . '/includes/collation/NumericUppercaseCollation.php',
        'OOUIHTMLForm' => __DIR__ . '/includes/htmlform/OOUIHTMLForm.php',
-       'ORAField' => __DIR__ . '/includes/libs/rdbms/field/ORAField.php',
-       'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'ORAField' => __DIR__ . '/includes/db/ORAField.php',
+       'ORAResult' => __DIR__ . '/includes/db/ORAResult.php',
        'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
        'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
        'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
@@ -1054,7 +1045,7 @@ $wgAutoloadLocalClasses = [
        'PackedImageGallery' => __DIR__ . '/includes/gallery/PackedImageGallery.php',
        'PackedOverlayImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
        'Page' => __DIR__ . '/includes/page/Page.php',
-       'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'PageArchive' => __DIR__ . '/includes/page/PageAcrhive.php',
        'PageExists' => __DIR__ . '/maintenance/pageExists.php',
        'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php',
        'PageProps' => __DIR__ . '/includes/PageProps.php',
@@ -1102,8 +1093,6 @@ $wgAutoloadLocalClasses = [
        'PopulateRevisionLength' => __DIR__ . '/maintenance/populateRevisionLength.php',
        'PopulateRevisionSha1' => __DIR__ . '/maintenance/populateRevisionSha1.php',
        'PostgreSqlLockManager' => __DIR__ . '/includes/libs/lockmanager/PostgreSqlLockManager.php',
-       'PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
-       'PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
        'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
        'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
        'Preferences' => __DIR__ . '/includes/Preferences.php',
@@ -1128,7 +1117,7 @@ $wgAutoloadLocalClasses = [
        'Protect' => __DIR__ . '/maintenance/protect.php',
        'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
        'ProtectLogFormatter' => __DIR__ . '/includes/logging/ProtectLogFormatter.php',
-       'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'ProtectedPagesPager' => __DIR__ . '/includes/specials/pagers/ProtectedPagesPager.php',
        'ProtectedTitlesPager' => __DIR__ . '/includes/specials/pagers/ProtectedTitlesPager.php',
        'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
        'ProxyLookup' => __DIR__ . '/includes/ProxyLookup.php',
@@ -1139,6 +1128,7 @@ $wgAutoloadLocalClasses = [
        'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
        'PurgeJobUtils' => __DIR__ . '/includes/jobqueue/utils/PurgeJobUtils.php',
        'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+       'PurgeModuleDeps' => __DIR__ . '/maintenance/purgeModuleDeps.php',
        'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
        'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
        'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
@@ -1147,6 +1137,7 @@ $wgAutoloadLocalClasses = [
        'RCCacheEntry' => __DIR__ . '/includes/changes/RCCacheEntry.php',
        'RCCacheEntryFactory' => __DIR__ . '/includes/changes/RCCacheEntryFactory.php',
        'RCDatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'RCFeed' => __DIR__ . '/includes/rcfeed/RCFeed.php',
        'RCFeedEngine' => __DIR__ . '/includes/rcfeed/RCFeedEngine.php',
        'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php',
        'RESTBagOStuff' => __DIR__ . '/includes/libs/objectcache/RESTBagOStuff.php',
@@ -1252,7 +1243,6 @@ $wgAutoloadLocalClasses = [
        'RowUpdateGenerator' => __DIR__ . '/includes/utils/RowUpdateGenerator.php',
        'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
        'RunningStat' => __DIR__ . '/includes/compat/RunningStatCompat.php',
-       'SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
        'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php',
@@ -1448,7 +1438,6 @@ $wgAutoloadLocalClasses = [
        'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
-       'TimestampException' => __DIR__ . '/includes/libs/time/TimestampException.php',
        'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
@@ -1461,7 +1450,6 @@ $wgAutoloadLocalClasses = [
        'TrackBlobs' => __DIR__ . '/maintenance/storage/trackBlobs.php',
        'TrackingCategories' => __DIR__ . '/includes/TrackingCategories.php',
        'TraditionalImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
-       'TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
        'TransformParameterError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'TransformTooBigImageAreaError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'TransformationalImageHandler' => __DIR__ . '/includes/media/TransformationalImageHandler.php',
@@ -1589,8 +1577,39 @@ $wgAutoloadLocalClasses = [
        'WikiRevision' => __DIR__ . '/includes/import/WikiRevision.php',
        'WikiStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'WikiTextStructure' => __DIR__ . '/includes/content/WikiTextStructure.php',
+       '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\\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\\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\\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',
+       'Wikimedia\\Rdbms\\LBFactorySimple' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySimple.php',
+       'Wikimedia\\Rdbms\\LBFactorySingle' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactorySingle.php',
+       'Wikimedia\\Rdbms\\LikeMatch' => __DIR__ . '/includes/libs/rdbms/encasing/LikeMatch.php',
+       'Wikimedia\\Rdbms\\LoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancer.php',
+       'Wikimedia\\Rdbms\\LoadBalancerSingle' => __DIR__ . '/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php',
+       '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\\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',
+       'Wikimedia\\Rdbms\\MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
+       'Wikimedia\\Rdbms\\MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
+       'Wikimedia\\Rdbms\\PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
+       'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
+       'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php',
+       'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
        'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
+       'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
        'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
        'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
        'WinCacheBagOStuff' => __DIR__ . '/includes/libs/objectcache/WinCacheBagOStuff.php',
index 3b72bfd..fe68a61 100644 (file)
@@ -17,7 +17,7 @@
        },
        "require": {
                "composer/semver": "1.4.2",
-               "cssjanus/cssjanus": "1.1.2",
+               "cssjanus/cssjanus": "1.1.3",
                "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.18.4",
+               "oojs/oojs-ui": "0.19.4",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
-               "psr/log": "1.0.0",
+               "psr/log": "1.0.2",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.4.1",
@@ -41,6 +41,7 @@
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
                "wikimedia/utfnormal": "1.1.0",
+               "wikimedia/timestamp": "1.0.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "2.2.0",
                "zordius/lightncandy": "0.23"
                "nikic/php-parser": "2.1.0",
                "nmred/kafka-php": "0.1.5",
                "phpunit/phpunit": "4.8.31",
-               "wikimedia/avro": "1.7.7"
+               "wikimedia/avro": "1.7.7",
+               "hamcrest/hamcrest-php": "^2.0",
+               "wmde/hamcrest-html-matchers": "^0.1.0",
+               "psy/psysh": "0.8.1"
        },
        "suggest": {
                "ext-apc": "Local data and opcode cache",
        "autoload": {
                "psr-0": {
                        "ComposerHookHandler": "includes/composer"
-               }
+               },
+               "files": [
+                       "includes/compat/Timestamp.php"
+               ]
+       },
+       "autoload-dev": {
+               "files": [
+                       "vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php",
+                       "vendor/wmde/hamcrest-html-matchers/src/functions.php"
+               ]
        },
        "scripts": {
                "lint": "parallel-lint --exclude vendor",
index 421ea5c..3d6eda9 100644 (file)
                },
                "requires": {
                        "type": "object",
-                       "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
+                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "additionalProperties": false,
                        "properties": {
                                "MediaWiki": {
                                        "type": "string",
                                        "description": "Version constraint string against MediaWiki core."
+                               },
+                               "extensions": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific extensions."
+                               },
+                               "skins": {
+                                       "type": "object",
+                                       "description": "Set of version constraint strings against specific skins."
                                }
                        }
                },
index 27773f6..846a073 100644 (file)
@@ -212,9 +212,13 @@ related to a particular event, like so:
                # ...
                function protect() {
                        global $wgUser;
-                       if ( Hooks::run( 'ArticleProtect', array( &$this, &$wgUser ) ) ) {
+
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $article = $this;
+
+                       if ( Hooks::run( 'ArticleProtect', [ &$article, &$wgUser ] ) ) {
                                # protect the article
-                               Hooks::run( 'ArticleProtectComplete', array( &$this, &$wgUser ) );
+                               Hooks::run( 'ArticleProtectComplete', [ &$article, &$wgUser ] );
                        }
                }
        }
@@ -1088,6 +1092,8 @@ $title: the Title in question
 'ContentHandlerForModelID': Called when a ContentHandler is requested for
 a given content model name, but no entry for that model exists in
 $wgContentHandlers.
+Note: if your extension implements additional models via this hook, please
+use GetContentModels hook to make them known to core. 
 $modeName: the requested content model name
 &$handler: set this to a ContentHandler object, if desired.
 
@@ -1558,6 +1564,9 @@ notifications.
 &$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getCanonicalURL()
 
+'GetContentModels': Add content models to the list of available models.
+&$models: array containing current model list, as strings. Extensions should add to this list.
+
 'GetDefaultSortkey': Override the default sortkey for a page.
 $title: Title object that we need to get a sortkey for
 &$sortkey: Sortkey to use.
index dedb3a6..9db4c54 100644 (file)
@@ -26,7 +26,7 @@
 
                /** second table. Try to emulate child selector */
                table.childemu th,
-               table.childemu td {
+               table.childemu td {
                        border: 1px red solid;
                        background-color:white;
                        padding:1em;
index fa1609f..2052809 100644 (file)
@@ -68,7 +68,7 @@ function wfImageAuthMain() {
                $path = "/" . $path;
        }
 
-       // Check for bug 28235: QUERY_STRING overriding the correct extension
+       // Check for T30235: QUERY_STRING overriding the correct extension
        $whitelist = [];
        $extension = FileBackend::extensionFromPath( $path, 'rawcase' );
        if ( $extension != '' ) {
index d444a27..2adbc80 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Ajax
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @defgroup Ajax Ajax
  */
@@ -135,7 +137,8 @@ class AjaxDispatcher {
                                        }
 
                                        // Make sure DB commit succeeds before sending a response
-                                       wfGetLBFactory()->commitMasterChanges( __METHOD__ );
+                                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                                       $lbFactory->commitMasterChanges( __METHOD__ );
 
                                        $result->sendHeaders();
                                        $result->printText();
index 9d3a2f9..1f4041b 100644 (file)
@@ -265,7 +265,7 @@ class Block {
                }
 
                # Be aware that the != '' check is explicit, since empty values will be
-               # passed by some callers (bug 29116)
+               # passed by some callers (T31116)
                if ( $vagueTarget != '' ) {
                        list( $target, $type ) = self::parseTarget( $vagueTarget );
                        switch ( $type ) {
@@ -358,7 +358,7 @@ class Block {
                if ( $end === null ) {
                        $end = $start;
                }
-               # Per bug 14634, we want to include relevant active rangeblocks; for
+               # Per T16634, we want to include relevant active rangeblocks; for
                # rangeblocks, we want to include larger ranges which enclose the given
                # range. We know that all blocks must be smaller than $wgBlockCIDRLimit,
                # so we can improve performance by filtering on a LIKE clause
@@ -553,7 +553,7 @@ class Block {
                $affected = $dbw->affectedRows();
 
                if ( $this->isAutoblocking() ) {
-                       // update corresponding autoblock(s) (bug 48813)
+                       // update corresponding autoblock(s) (T50813)
                        $dbw->update(
                                'ipblocks',
                                $this->getAutoblockUpdateArray(),
@@ -1117,7 +1117,7 @@ class Block {
                } elseif ( $target === null && $vagueTarget == '' ) {
                        # We're not going to find anything useful here
                        # Be aware that the == '' check is explicit, since empty values will be
-                       # passed by some callers (bug 29116)
+                       # passed by some callers (T31116)
                        return null;
 
                } elseif ( in_array(
@@ -1142,7 +1142,7 @@ class Block {
         * Get all blocks that match any IP from an array of IP addresses
         *
         * @param array $ipChain List of IPs (strings), usually retrieved from the
-        *         X-Forwarded-For header of the request
+        *     X-Forwarded-For header of the request
         * @param bool $isAnon Exclude anonymous-only blocks if false
         * @param bool $fromMaster Whether to query the master or replica DB
         * @return array Array of Blocks
@@ -1223,9 +1223,9 @@ class Block {
         *
         * @param array $blocks Array of Block objects
         * @param array $ipChain List of IPs (strings). This is used to determine how "close"
-        *        a block is to the server, and if a block matches exactly, or is in a range.
-        *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
-        *        local-squid, ...)
+        *     a block is to the server, and if a block matches exactly, or is in a range.
+        *     The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+        *     local-squid, ...)
         * @throws MWException
         * @return Block|null The "best" block from the list
         */
@@ -1467,9 +1467,55 @@ class Block {
                }
 
                // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
-               $cookieValue = $setEmpty ? '' : $this->getId();
-               $expiryValue = DateTime::createFromFormat( "YmdHis", $expiryTime );
-               $response->setCookie( 'BlockID', $cookieValue, $expiryValue->format( "U" ) );
+               $cookieValue = $setEmpty ? '' : $this->getCookieValue();
+               $expiryValue = DateTime::createFromFormat( 'YmdHis', $expiryTime )->format( 'U' );
+               $cookieOptions = [ 'httpOnly' => false ];
+               $response->setCookie( 'BlockID', $cookieValue, $expiryValue, $cookieOptions );
+       }
+
+       /**
+        * 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
+        * be the block ID.
+        * @return string The block ID, probably concatenated with "!" and the HMAC.
+        */
+       public function getCookieValue() {
+               $config = RequestContext::getMain()->getConfig();
+               $id = $this->getId();
+               $secretKey = $config->get( 'SecretKey' );
+               if ( !$secretKey ) {
+                       // If there's no secret key, don't append a HMAC.
+                       return $id;
+               }
+               $hmac = MWCryptHash::hmac( $id, $secretKey, false );
+               $cookieValue =  $id . '!' . $hmac;
+               return $cookieValue;
+       }
+
+       /**
+        * Get the stored ID from the 'BlockID' cookie. The cookie's value is usually a combination of
+        * the ID and a HMAC (see Block::setCookie), but will sometimes only be the ID.
+        * @param string $cookieValue The string in which to find the ID.
+        * @return integer|null The block ID, or null if the HMAC is present and invalid.
+        */
+       public static function getIdFromCookieValue( $cookieValue ) {
+               // Extract the ID prefix from the cookie value (may be the whole value, if no bang found).
+               $bangPos = strpos( $cookieValue, '!' );
+               $id = ( $bangPos === false ) ? $cookieValue : substr( $cookieValue, 0, $bangPos );
+               // Get the site-wide secret key.
+               $config = RequestContext::getMain()->getConfig();
+               $secretKey = $config->get( 'SecretKey' );
+               if ( !$secretKey ) {
+                       // If there's no secret key, just use the ID as given.
+                       return $id;
+               }
+               $storedHmac = substr( $cookieValue, $bangPos + 1 );
+               $calculatedHmac = MWCryptHash::hmac( $id, $secretKey, false );
+               if ( $calculatedHmac === $storedHmac ) {
+                       return $id;
+               } else {
+                       return null;
+               }
        }
 
        /**
index d558dbc..ece32ea 100644 (file)
@@ -96,7 +96,7 @@ class Category {
                $this->mSubcats = $row->cat_subcats;
                $this->mFiles = $row->cat_files;
 
-               # (bug 13683) If the count is negative, then 1) it's obviously wrong
+               # (T15683) If the count is negative, then 1) it's obviously wrong
                # and should not be kept, and 2) we *probably* don't have to scan many
                # rows to obtain the correct figure, so let's risk a one-time recount.
                if ( $this->mPages < 0 || $this->mSubcats < 0 || $this->mFiles < 0 ) {
index a7cbd96..a3d68c6 100644 (file)
@@ -1337,7 +1337,7 @@ $wgXMLMimeTypes = [
  * to reduce disk usage, limits can only be selected from a list.
  * The user preference is saved as an array offset in the database, by default
  * the offset is set with $wgDefaultUserOptions['imagesize']. Make sure you
- * change it if you alter the array (see bug 8858).
+ * change it if you alter the array (see T10858).
  * This is the list of settings the user can choose from:
  */
 $wgImageLimits = [
@@ -1442,14 +1442,19 @@ $wgUseTinyRGBForJPGThumbnails = false;
  * Default parameters for the "<gallery>" tag
  */
 $wgGalleryOptions = [
-       'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
-       'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
-       'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
-       'captionLength' => true, // Deprecated @since 1.28
-                                // Length to truncate filename to in caption when using "showfilename".
-                                // A value of 'true' will truncate the filename to one line using CSS
-                                // and will be the behaviour after deprecation.
-       'showBytes' => true, // Show the filesize in bytes in categories
+       // Default number of images per-row in the gallery. 0 -> Adapt to screensize
+       'imagesPerRow' => 0,
+       // Width of the cells containing images in galleries (in "px")
+       'imageWidth' => 120,
+       // Height of the cells containing images in galleries (in "px")
+       'imageHeight' => 120,
+       // Length to truncate filename to in caption when using "showfilename".
+       // A value of 'true' will truncate the filename to one line using CSS
+       // and will be the behaviour after deprecation.
+       // @deprecated since 1.28
+       'captionLength' => true,
+       // Show the filesize in bytes in categories
+       'showBytes' => true,
        'mode' => 'traditional',
 ];
 
@@ -3357,7 +3362,7 @@ $wgDisableOutputCompression = false;
  *
  * Currently this appears to work fine in all browsers, but it's disabled by
  * default because it normalizes id's a bit too aggressively, breaking preexisting
- * content (particularly Cite).  See bug 27733, bug 27694, bug 27474.
+ * content (particularly Cite).  See T29733, T29694, T29474.
  */
 $wgExperimentalHtmlIds = false;
 
@@ -4081,7 +4086,7 @@ $wgMaxRedirects = 1;
  * Attempting to create a redirect to any of the pages in this array
  * will make the redirect fail.
  * Userlogout is hard-coded, so it does not need to be listed here.
- * (bug 10569) Disallow Mypage and Mytalk as well.
+ * (T12569) Disallow Mypage and Mytalk as well.
  *
  * As of now, this only checks special pages. Redirects to pages in
  * other namespaces cannot be invalidated by this variable.
@@ -4565,8 +4570,8 @@ $wgAuthManagerAutoConfig = [
                ],
                // Linking during login is experimental, enable at your own risk - T134952
                // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
-               //      'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
-               //      'sort' => 100,
+               //   'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
+               //   'sort' => 100,
                // ],
                MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class => [
                        'class' => MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class,
@@ -4786,6 +4791,7 @@ $wgReservedUsernames = [
        'Maintenance script', // Maintenance scripts which perform editing, image import script
        'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
        'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
+       'Unknown user', // Used in WikiImporter when importing revisions with no author
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
@@ -4864,9 +4870,7 @@ $wgDefaultUserOptions = [
 /**
  * An array of preferences to not show for the user
  */
-$wgHiddenPrefs = [
-       'rcenhancedfilters',
-];
+$wgHiddenPrefs = [];
 
 /**
  * Characters to prevent during new account creations.
@@ -5681,7 +5685,7 @@ $wgRateLimits = [
 ];
 
 /**
- * Array of IPs which should be excluded from rate limits.
+ * Array of IPs / CIDR ranges which should be excluded from rate limits.
  * This may be useful for whitelisting NAT gateways for conferences, etc.
  */
 $wgRateLimitsExcludedIPs = [];
@@ -5989,7 +5993,10 @@ $wgSessionName = false;
 
 /**
  * Whether to set a cookie when a user is autoblocked. Doing so means that a blocked user, even
- * after logging out and moving to a new IP address, will still be blocked.
+ * after logging out and moving to a new IP address, will still be blocked. This cookie will contain
+ * an authentication code if $wgSecretKey is set, or otherwise will just be the block ID (in
+ * which case there is a possibility of an attacker discovering the names of revdeleted users, so
+ * it is best to use this in conjunction with $wgSecretKey being set).
  */
 $wgCookieSetOnAutoblock = false;
 
@@ -6656,51 +6663,64 @@ $wgRCLinkLimits = [ 50, 100, 250, 500 ];
 $wgRCLinkDays = [ 1, 3, 7, 14, 30 ];
 
 /**
- * Destinations to which notifications about recent changes
- * should be sent.
+ * Configuration for feeds to which notifications about recent changes will be sent.
+ *
+ * The following feed classes are available by default:
+ * - 'UDPRCFeedEngine' - sends recent changes over UDP to the specified server.
+ * - 'RedisPubSubFeedEngine' - send recent changes to Redis.
  *
- * As of MediaWiki 1.22, there are 2 supported 'engine' parameter option in core:
- *   * 'UDPRCFeedEngine', which is used to send recent changes over UDP to the
- *      specified server.
- *   * 'RedisPubSubFeedEngine', which is used to send recent changes to Redis.
+ * Only 'class' or 'uri' is required. If 'uri' is set instead of 'class', then
+ * RecentChange::getEngine() is used to determine the class. All options are
+ * passed to the constructor.
  *
- * The common options are:
- *   * 'uri' -- the address to which the notices are to be sent.
- *   * 'formatter' -- the class name (implementing RCFeedFormatter) which will
- *     produce the text to send. This can also be an object of the class.
- *   * 'omit_bots' -- whether the bot edits should be in the feed
- *   * 'omit_anon' -- whether anonymous edits should be in the feed
- *   * 'omit_user' -- whether edits by registered users should be in the feed
- *   * 'omit_minor' -- whether minor edits should be in the feed
- *   * 'omit_patrolled' -- whether patrolled edits should be in the feed
+ * Common options:
+ * - 'class' -- The class to use for this feed (must implement RCFeed).
+ * - 'omit_bots' -- Exclude bot edits from the feed. (default: false)
+ * - 'omit_anon' -- Exclude anonymous edits from the feed. (default: false)
+ * - 'omit_user' -- Exclude edits by registered users from the feed. (default: false)
+ * - 'omit_minor' -- Exclude minor edits from the feed. (default: false)
+ * - 'omit_patrolled' -- Exclude patrolled edits from the feed. (default: false)
  *
- *  The IRC-specific options are:
- *   * 'add_interwiki_prefix' -- whether the titles should be prefixed with
- *     the first entry in the $wgLocalInterwikis array (or the value of
- *     $wgLocalInterwiki, if set)
+ * FormattedRCFeed-specific options:
+ * - 'uri' -- [required] The address to which the messages are sent.
+ *   The uri scheme of this string will be looked up in $wgRCEngines
+ *   to determine which RCFeedEngine class to use.
+ * - 'formatter' -- [required] The class (implementing RCFeedFormatter) which will
+ *   produce the text to send. This can also be an object of the class.
+ *   Formatters available by default: JSONRCFeedFormatter, XMLRCFeedFormatter,
+ *   IRCColourfulRCFeedFormatter.
  *
- *  The JSON-specific options are:
- *   * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
+ * IRCColourfulRCFeedFormatter-specific options:
+ * - 'add_interwiki_prefix' -- whether the titles should be prefixed with
+ *   the first entry in the $wgLocalInterwikis array (or the value of
+ *   $wgLocalInterwiki, if set)
+ *
+ * JSONRCFeedFormatter-specific options:
+ * - 'channel' -- if set, the 'channel' parameter is also set in JSON values.
  *
  * @example $wgRCFeeds['example'] = [
+ *             'uri' => 'udp://localhost:1336',
  *             'formatter' => 'JSONRCFeedFormatter',
- *             'uri' => "udp://localhost:1336",
  *             'add_interwiki_prefix' => false,
  *             'omit_bots' => true,
  *     ];
- * @example $wgRCFeeds['exampleirc'] = [
+ * @example $wgRCFeeds['example'] = [
+ *             'uri' => 'udp://localhost:1338',
  *             'formatter' => 'IRCColourfulRCFeedFormatter',
- *             'uri' => "udp://localhost:1338",
  *             'add_interwiki_prefix' => false,
  *             'omit_bots' => true,
  *     ];
+ * @example $wgRCFeeds['example'] = [
+ *             'class' => 'ExampleRCFeed',
+ *     ];
  * @since 1.22
  */
 $wgRCFeeds = [];
 
 /**
- * Used by RecentChange::getEngine to find the correct engine to use for a given URI scheme.
- * Keys are scheme names, values are names of engine classes.
+ * Used by RecentChange::getEngine to find the correct engine for a given URI scheme.
+ * Keys are scheme names, values are names of FormattedRCFeed sub classes.
+ * @since 1.22
  */
 $wgRCEngines = [
        'redis' => 'RedisPubSubFeedEngine',
@@ -8355,7 +8375,7 @@ $wgPagePropsHaveSortkey = true;
 /**
  * Port where you have HTTPS running
  * Supports HTTPS on non-standard ports
- * @see bug 65184
+ * @see T67184
  * @since 1.24
  */
 $wgHttpsPort = 443;
@@ -8543,6 +8563,7 @@ $wgCSPFalsePositiveUrls = [
        'https://atpixel.alephd.com' => true,
        'https://rtb.metrigo.com' => true,
        'https://d5p.de17a.com' => true,
+       'https://ad.lkqd.net/vpaid/vpaid.js' => true,
 ];
 
 /**
@@ -8562,6 +8583,25 @@ $wgLearnerMemberSince = 4; # days
 $wgExperiencedUserEdits = 500;
 $wgExperiencedUserMemberSince = 30; # days
 
+/**
+ * Mapping of interwiki index prefixes to descriptors that
+ * can be used to change the display of interwiki search results.
+ *
+ * Descriptors are appended to CSS classes of interwiki results
+ * which using InterwikiSearchResultWidget.
+ *
+ * Predefined descriptors include the following words:
+ * definition, textbook, news, quotation, book, travel, course
+ *
+ * @par Example:
+ * @code
+ * $wgInterwikiPrefixDisplayTypes = [
+ *     'iwprefix' => 'definition'
+ *];
+ * @endcode
+ */
+$wgInterwikiPrefixDisplayTypes = [];
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 35c2a2d..bd92ff0 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 require_once __DIR__ . '/libs/mime/defines.php';
-require_once __DIR__ . '/libs/time/defines.php';
 require_once __DIR__ . '/libs/rdbms/defines.php';
 require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
 
index 2b1bd7b..c22125a 100644 (file)
@@ -363,8 +363,8 @@ class EditPage {
        /** @var bool */
        public $bot = true;
 
-       /** @var null|string */
-       public $contentModel = null;
+       /** @var string */
+       public $contentModel;
 
        /** @var null|string */
        public $contentFormat = null;
@@ -993,7 +993,7 @@ class EditPage {
                        $this->recreate = false;
 
                        // When creating a new section, we can preload a section title by passing it as the
-                       // preloadtitle parameter in the URL (Bug 13100)
+                       // preloadtitle parameter in the URL (T15100)
                        if ( $this->section == 'new' && $request->getVal( 'preloadtitle' ) ) {
                                $this->sectiontitle = $request->getVal( 'preloadtitle' );
                                // Once wpSummary isn't being use for setting section titles, we should delete this.
@@ -1255,11 +1255,7 @@ class EditPage {
                }
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
-                       if ( !$this->contentModel ) {
-                               $this->contentModel = $this->getTitle()->getContentModel();
-                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
-
                        return $handler->makeEmptyContent();
                }
                $content = $revision->getContent( Revision::FOR_THIS_USER, $user );
@@ -1299,11 +1295,7 @@ class EditPage {
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
                if ( $content === false || $content === null ) {
-                       if ( !$this->contentModel ) {
-                               $this->contentModel = $this->getTitle()->getContentModel();
-                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
-
                        return $handler->makeEmptyContent();
                } elseif ( !$this->undidRev ) {
                        // Content models should always be the same since we error
@@ -1911,7 +1903,7 @@ class EditPage {
 
                        // Don't save a new page if it's blank or if it's a MediaWiki:
                        // message with content equivalent to default (allow empty pages
-                       // in this case to disable messages, see bug 50124)
+                       // in this case to disable messages, see T52124)
                        $defaultMessageText = $this->mTitle->getDefaultMessageText();
                        if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $defaultMessageText !== false ) {
                                $defaultText = $defaultMessageText;
@@ -2483,11 +2475,13 @@ class EditPage {
                }
                # Give a notice if the user is editing a deleted/moved page...
                if ( !$this->mTitle->exists() ) {
+                       $dbr = wfGetDB( DB_REPLICA );
+
                        LogEventsList::showLogExtract( $wgOut, [ 'delete', 'move' ], $this->mTitle,
                                '',
                                [
                                        'lim' => 10,
-                                       'conds' => [ "log_action != 'revision'" ],
+                                       'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                        'showIfEmpty' => false,
                                        'msgKey' => [ 'recreate-moveddeleted-warn' ]
                                ]
@@ -2616,7 +2610,7 @@ class EditPage {
                        return;
                }
 
-               $this->showHeader();
+               $this->showHeader();
 
                $wgOut->addHTML( $this->editFormPageTop );
 
@@ -2729,7 +2723,7 @@ class EditPage {
                if ( $this->hasPresetSummary ) {
                        // If a summary has been preset using &summary= we don't want to prompt for
                        // a different summary. Only prompt for a summary if the summary is blanked.
-                       // (Bug 17416)
+                       // (T19416)
                        $this->autoSumm = md5( '' );
                }
 
@@ -3543,15 +3537,7 @@ HTML
                // Avoid PHP 7.1 warning of passing $this by reference
                $editPage = $this;
                if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$editPage, &$wgOut ] ) ) {
-                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-                       $stats->increment( 'edit.failures.conflict' );
-                       // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
-                       if (
-                               $this->mTitle->getNamespace() >= NS_MAIN &&
-                               $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
-                       ) {
-                               $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
-                       }
+                       $this->incrementConflictStats();
 
                        $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
 
@@ -3571,6 +3557,18 @@ HTML
                }
        }
 
+       protected function incrementConflictStats() {
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $stats->increment( 'edit.failures.conflict' );
+               // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
+               if (
+                       $this->mTitle->getNamespace() >= NS_MAIN &&
+                       $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
+               ) {
+                       $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
+               }
+       }
+
        /**
         * @return string
         */
@@ -3683,8 +3681,6 @@ HTML
                global $wgOut, $wgRawHtml, $wgLang;
                global $wgAllowUserCss, $wgAllowUserJs;
 
-               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-
                if ( $wgRawHtml && !$this->mTokenOk ) {
                        // Could be an offsite preview attempt. This is very unsafe if
                        // HTML is enabled, as it could be an attack.
@@ -3697,7 +3693,7 @@ HTML
                                        $this->context->msg( 'session_fail_preview_html' )->text() . "</div>",
                                        true, /* interface */true );
                        }
-                       $stats->increment( 'edit.failures.session_loss' );
+                       $this->incrementEditFailureStats( 'session_loss' );
                        return $parsedNote;
                }
 
@@ -3721,15 +3717,15 @@ HTML
                        if ( $this->mTriedSave && !$this->mTokenOk ) {
                                if ( $this->mTokenOkExceptSuffix ) {
                                        $note = $this->context->msg( 'token_suffix_mismatch' )->plain();
-                                       $stats->increment( 'edit.failures.bad_token' );
+                                       $this->incrementEditFailureStats( 'bad_token' );
                                } else {
                                        $note = $this->context->msg( 'session_fail_preview' )->plain();
-                                       $stats->increment( 'edit.failures.session_loss' );
+                                       $this->incrementEditFailureStats( 'session_loss' );
                                }
                        } elseif ( $this->incompleteForm ) {
                                $note = $this->context->msg( 'edit_form_incomplete' )->plain();
                                if ( $this->mTriedSave ) {
-                                       $stats->increment( 'edit.failures.incomplete_form' );
+                                       $this->incrementEditFailureStats( 'incomplete_form' );
                                }
                        } else {
                                $note = $this->context->msg( 'previewnote' )->plain() . ' ' . $continueEditing;
@@ -3817,6 +3813,11 @@ HTML
                return $previewhead . $previewHTML . $this->previewTextAfterContent;
        }
 
+       private function incrementEditFailureStats( $failureType ) {
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $stats->increment( 'edit.failures.' . $failureType );
+       }
+
        /**
         * Get parser options for a preview
         * @return ParserOptions
index 071a3db..3268291 100644 (file)
@@ -129,13 +129,6 @@ class FeedUtils {
                }
 
                if ( $oldid ) {
-
-                       # $diffText = $de->getDiff( wfMessage( 'revisionasof',
-                       #       $wgLang->timeanddate( $timestamp ),
-                       #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) )->text(),
-                       #       wfMessage( 'currentrev' )->text() );
-
                        $diffText = '';
                        // Don't bother generating the diff if we won't be able to show it
                        if ( $wgFeedDiffCutoff > 0 ) {
@@ -196,7 +189,7 @@ class FeedUtils {
 
                        if ( $html === null ) {
 
-                               // Omit large new page diffs, bug 29110
+                               // Omit large new page diffs, T31110
                                // Also use diff link for non-textual content
                                $diffText = self::getDiffLink( $title, $newid );
                        } else {
index 82af081..f284d92 100644 (file)
@@ -206,7 +206,8 @@ class FileDeleteForm {
                                        $dbw->endAtomic( __METHOD__ );
                                } else {
                                        // Page deleted but file still there? rollback page delete
-                                       wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
+                                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                                       $lbFactory->rollbackMasterChanges( __METHOD__ );
                                }
                        } else {
                                // Done; nothing changed
index 5343248..3747c23 100644 (file)
@@ -222,18 +222,18 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
 /**
  * Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
  * e.g.
- *     wfMergeErrorArrays(
- *             [ [ 'x' ] ],
- *             [ [ 'x', '2' ] ],
- *             [ [ 'x' ] ],
- *             [ [ 'y' ] ]
- *     );
+ *     wfMergeErrorArrays(
+ *       [ [ 'x' ] ],
+ *       [ [ 'x', '2' ] ],
+ *       [ [ 'x' ] ],
+ *       [ [ 'y' ] ]
+ *     );
  * returns:
- *             [
- *             [ 'x', '2' ],
- *             [ 'x' ],
- *             [ 'y' ]
- *     ]
+ *     [
+ *       [ 'x', '2' ],
+ *       [ 'x' ],
+ *       [ 'y' ]
+ *     ]
  *
  * @param array $array1,...
  * @return array
@@ -1787,6 +1787,7 @@ function wfHttpError( $code, $label, $desc ) {
                $wgOut->sendCacheControl();
        }
 
+       MediaWiki\HeaderCallback::warnIfHeadersSent();
        header( 'Content-type: text/html; charset=utf-8' );
        print '<!DOCTYPE html>' .
                '<html><head><title>' .
@@ -2572,8 +2573,8 @@ function wfInitShellLocale() {
  * @param string $script MediaWiki cli script path
  * @param array $parameters Arguments and options to the script
  * @param array $options Associative array of options:
- *             'php': The path to the php executable
- *             'wrapper': Path to a PHP wrapper to handle the maintenance script
+ *     'php': The path to the php executable
+ *     'wrapper': Path to a PHP wrapper to handle the maintenance script
  * @return string
  */
 function wfShellWikiCmd( $script, array $parameters = [], array $options = [] ) {
@@ -3084,7 +3085,7 @@ function wfGetDB( $db, $groups = [], $wiki = false ) {
  *              or MediaWikiServices::getDBLoadBalancerFactory() instead.
  *
  * @param string|bool $wiki Wiki ID, or false for the current wiki
- * @return LoadBalancer
+ * @return \Wikimedia\Rdbms\LoadBalancer
  */
 function wfGetLB( $wiki = false ) {
        if ( $wiki === false ) {
@@ -3100,7 +3101,7 @@ function wfGetLB( $wiki = false ) {
  *
  * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancerFactory() instead.
  *
- * @return LBFactory
+ * @return \Wikimedia\Rdbms\LBFactory
  */
 function wfGetLBFactory() {
        return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
diff --git a/includes/HeaderCallback.php b/includes/HeaderCallback.php
new file mode 100644 (file)
index 0000000..b2ca673
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+namespace MediaWiki;
+
+class HeaderCallback {
+       private static $headersSentException;
+       private static $messageSent = false;
+
+       /**
+        * Register a callback to be called when headers are sent. There can only
+        * be one of these handlers active, so all relevant actions have to be in
+        * here.
+        */
+       public static function register() {
+               header_register_callback( [ __CLASS__, 'callback' ] );
+       }
+
+       /**
+        * The callback, which is called by the transport
+        */
+       public static function callback() {
+               // Prevent caching of responses with cookies (T127993)
+               $headers = [];
+               foreach ( headers_list() as $header ) {
+                       list( $name, $value ) = explode( ':', $header, 2 );
+                       $headers[strtolower( trim( $name ) )][] = trim( $value );
+               }
+
+               if ( isset( $headers['set-cookie'] ) ) {
+                       $cacheControl = isset( $headers['cache-control'] )
+                               ? implode( ', ', $headers['cache-control'] )
+                               : '';
+
+                       if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i',
+                               $cacheControl )
+                       ) {
+                               header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
+                               header( 'Cache-Control: private, max-age=0, s-maxage=0' );
+                               \MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
+                                       'Cookies set on {url} with Cache-Control "{cache-control}"', [
+                                               'url' => \WebRequest::getGlobalRequestURL(),
+                                               'cookies' => $headers['set-cookie'],
+                                               'cache-control' => $cacheControl ?: '<not set>',
+                                       ]
+                               );
+                       }
+               }
+
+               // Save a backtrace for logging in case it turns out that headers were sent prematurely
+               self::$headersSentException = new \Exception( 'Headers already sent from this point' );
+       }
+
+       /**
+        * Log a warning message if headers have already been sent. This can be
+        * called before flushing the output.
+        */
+       public static function warnIfHeadersSent() {
+               if ( headers_sent() && !self::$messageSent ) {
+                       self::$messageSent = true;
+                       \MWDebug::warning( 'Headers already sent, should send headers earlier than ' .
+                               wfGetCaller( 3 ) );
+                       $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'headers-sent' );
+                       $logger->error( 'Warning: headers were already sent from the location below', [
+                               'exception' => self::$headersSentException,
+                               'detection-trace' => new \Exception( 'Detected here' ),
+                       ] );
+               }
+       }
+}
index 3d86201..56cf815 100644 (file)
@@ -590,7 +590,7 @@ class DiffHistoryBlob implements HistoryBlob {
 
        /**
         * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
-        * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
+        * the bytes backwards and initialised with 0 instead of 1. See T36428.
         *
         * @param string $s
         * @return string|bool False if the hash extension is not available
index b46ea81..8fe4dbe 100644 (file)
@@ -220,8 +220,10 @@ class Html {
         * Identical to rawElement(), but HTML-escapes $contents (like
         * Xml::element()).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         * @param string $contents
         *
         * @return string
@@ -239,8 +241,10 @@ class Html {
         * Identical to rawElement(), but has no third parameter and omits the end
         * tag (and the self-closing '/' in XML mode for empty elements).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         *
         * @return string
         */
@@ -459,7 +463,7 @@ class Html {
         *
         * @param array $attribs Associative array of attributes, e.g., [
         *   'href' => 'https://www.mediawiki.org/' ].  Values will be HTML-escaped.
-        *   A value of false means to omit the attribute.  For boolean attributes,
+        *   A value of false or null means to omit the attribute.  For boolean attributes,
         *   you can omit the key, e.g., [ 'checked' ] instead of
         *   [ 'checked' => 'checked' ] or such.
         *
@@ -759,7 +763,7 @@ class Html {
                $attribs['name'] = $name;
 
                if ( substr( $value, 0, 1 ) == "\n" ) {
-                       // Workaround for bug 12130: browsers eat the initial newline
+                       // Workaround for T14130: browsers eat the initial newline
                        // assuming that it's just for show, but they do keep the later
                        // newlines, which we may want to preserve during editing.
                        // Prepending a single newline
index 7b3d72b..2f50558 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\LikeMatch;
 
 /**
  * Some functions to help implement an external link filter for spam control.
index 94b145e..0c8d1c6 100644 (file)
@@ -590,7 +590,7 @@ class Linker {
 
                # ThumbnailImage::toHtml() already adds page= onto the end of DjVu URLs
                # So we don't need to pass it here in $query. However, the URL for the
-               # zoom icon still needs it, so we make a unique query for it. See bug 14771
+               # zoom icon still needs it, so we make a unique query for it. See T16771
                $url = $title->getLocalURL( $query );
                if ( $page ) {
                        $url = wfAppendQuery( $url, [ 'page' => $page ] );
@@ -892,7 +892,7 @@ class Linker {
                        if ( $altUserName === false ) {
                                $altUserName = IP::prettifyIP( $userName );
                        }
-                       $classes .= ' mw-anonuserlink'; // Separate link class for anons (bug 43179)
+                       $classes .= ' mw-anonuserlink'; // Separate link class for anons (T45179)
                } else {
                        $page = Title::makeTitle( NS_USER, $userName );
                }
@@ -933,13 +933,14 @@ class Linker {
                if ( $userId ) {
                        // check if the user has an edit
                        $attribs = [];
+                       $attribs['class'] = 'mw-usertoollinks-contribs';
                        if ( $redContribsWhenNoEdits ) {
                                if ( intval( $edits ) === 0 && $edits !== 0 ) {
                                        $user = User::newFromId( $userId );
                                        $edits = $user->getEditCount();
                                }
                                if ( $edits === 0 ) {
-                                       $attribs['class'] = 'new';
+                                       $attribs['class'] .= ' new';
                                }
                        }
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $userText );
@@ -986,7 +987,10 @@ class Linker {
         */
        public static function userTalkLink( $userId, $userText ) {
                $userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
-               $userTalkLink = self::link( $userTalkPage, wfMessage( 'talkpagelinktext' )->escaped() );
+               $moreLinkAttribs['class'] = 'mw-usertoollinks-talk';
+               $userTalkLink = self::link( $userTalkPage,
+                                               wfMessage( 'talkpagelinktext' )->escaped(),
+                                               $moreLinkAttribs );
                return $userTalkLink;
        }
 
@@ -998,7 +1002,10 @@ class Linker {
         */
        public static function blockLink( $userId, $userText ) {
                $blockPage = SpecialPage::getTitleFor( 'Block', $userText );
-               $blockLink = self::link( $blockPage, wfMessage( 'blocklink' )->escaped() );
+               $moreLinkAttribs['class'] = 'mw-usertoollinks-block';
+               $blockLink = self::link( $blockPage,
+                                        wfMessage( 'blocklink' )->escaped(),
+                                        $moreLinkAttribs );
                return $blockLink;
        }
 
@@ -1009,7 +1016,10 @@ class Linker {
         */
        public static function emailLink( $userId, $userText ) {
                $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
-               $emailLink = self::link( $emailPage, wfMessage( 'emaillink' )->escaped() );
+               $moreLinkAttribs['class'] = 'mw-usertoollinks-mail';
+               $emailLink = self::link( $emailPage,
+                                        wfMessage( 'emaillink' )->escaped(),
+                                        $moreLinkAttribs );
                return $emailLink;
        }
 
@@ -1086,7 +1096,7 @@ class Linker {
        ) {
                # Sanitize text a bit:
                $comment = str_replace( "\n", " ", $comment );
-               # Allow HTML entities (for bug 13815)
+               # Allow HTML entities (for T15815)
                $comment = Sanitizer::escapeHtmlAllowEntities( $comment );
 
                # Render autocomments and make links:
@@ -1155,7 +1165,7 @@ class Linker {
                                                $section = str_replace( '[[', '', $section );
                                                $section = str_replace( ']]', '', $section );
 
-                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # T24784
                                                if ( $local ) {
                                                        $sectionTitle = Title::newFromText( '#' . $section );
                                                } else {
@@ -1364,7 +1374,7 @@ class Linker {
                        } else {
                                $suffix = '';
                        }
-                       # bug 7425
+                       # T9425
                        $target = trim( $target );
                        # Look at the first character
                        if ( $target != '' && $target[0] === '/' ) {
@@ -1787,7 +1797,7 @@ class Linker {
 
                if ( $context->getRequest()->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
-                       $query['hidediff'] = '1'; // bug 15999
+                       $query['hidediff'] = '1'; // T17999
                }
 
                $disableRollbackEditCount = false;
index c1e5cc4..7f3649e 100644 (file)
@@ -21,6 +21,7 @@
  * @since 1.20
  * @author Tyler Romeo, 2012
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Library for creating and parsing MW-style timestamps. Based on the JS
index 5968e87..ee95918 100644 (file)
@@ -46,8 +46,8 @@
  * $magicWords = [];
  *
  * $magicWords['en'] = [
- *     'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
- *     'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
+ *   'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
+ *   'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
  * ];
  * @endcode
  *
@@ -502,7 +502,7 @@ class MagicWord {
                        # multiple matched parts (variable match); some will be empty because of
                        # synonyms. The variable will be the second non-empty one so remove any
                        # blank elements and re-sort the indices.
-                       # See also bug 6526
+                       # See also T8526
 
                        $matches = array_values( array_filter( $matches ) );
 
@@ -526,7 +526,7 @@ class MagicWord {
                $this->mFound = false;
                $text = preg_replace_callback(
                        $this->getRegex(),
-                       [ &$this, 'pregRemoveAndRecord' ],
+                       [ $this, 'pregRemoveAndRecord' ],
                        $text
                );
 
@@ -541,7 +541,7 @@ class MagicWord {
                $this->mFound = false;
                $text = preg_replace_callback(
                        $this->getRegexStart(),
-                       [ &$this, 'pregRemoveAndRecord' ],
+                       [ $this, 'pregRemoveAndRecord' ],
                        $text
                );
 
index faca533..521c02c 100644 (file)
@@ -22,6 +22,8 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ChronologyProtector;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * The MediaWiki class is the helper class for the index.php entry point.
@@ -71,7 +73,7 @@ class MediaWiki {
                if ( $request->getCheck( 'search' ) ) {
                        // Compatibility with old search URLs which didn't use Special:Search
                        // Just check for presence here, so blank requests still
-                       // show the search page when using ugly URLs (bug 8054).
+                       // show the search page when using ugly URLs (T10054).
                        $ret = SpecialPage::getTitleFor( 'Search' );
                } elseif ( $curid ) {
                        // URLs like this are generated by RC, because rc_title isn't always accurate
@@ -181,7 +183,7 @@ class MediaWiki {
                $unused = null; // To pass it by reference
                Hooks::run( 'BeforeInitialize', [ &$title, &$unused, &$output, &$user, $request, $this ] );
 
-               // Invalid titles. Bug 21776: The interwikis must redirect even if the page name is empty.
+               // Invalid titles. T23776: The interwikis must redirect even if the page name is empty.
                if ( is_null( $title ) || ( $title->getDBkey() == '' && !$title->isExternal() )
                        || $title->isSpecial( 'Badtitle' )
                ) {
@@ -201,7 +203,7 @@ class MediaWiki {
                        ? [] // relies on HMAC key signature alone
                        : $title->getUserPermissionsErrors( 'read', $user );
                if ( count( $permErrors ) ) {
-                       // Bug 32276: allowing the skin to generate output with $wgTitle or
+                       // T34276: allowing the skin to generate output with $wgTitle or
                        // $this->context->title set to the input title would allow anonymous users to
                        // determine whether a page exists, potentially leaking private data. In fact, the
                        // curid and oldid request  parameters would allow page titles to be enumerated even
@@ -518,7 +520,7 @@ class MediaWiki {
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
-                               // Bug 62091: while exceptions are convenient to bubble up GUI errors,
+                               // T64091: while exceptions are convenient to bubble up GUI errors,
                                // they are not internal application faults. As with normal requests, this
                                // should commit, print the output, do deferred updates, jobs, and profiling.
                                $this->doPreOutputCommit();
index 7c9363c..e44fefe 100644 (file)
@@ -9,10 +9,10 @@ use EventRelayerGroup;
 use GenderCache;
 use GlobalVarConfig;
 use Hooks;
-use LBFactory;
+use Wikimedia\Rdbms\LBFactory;
 use LinkCache;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
-use LoadBalancer;
+use Wikimedia\Rdbms\LoadBalancer;
 use MediaHandlerFactory;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
index e57f880..8cf3af1 100644 (file)
@@ -24,6 +24,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Handles the backend logic of merging the histories of two
index ae12ba5..9a83d35 100644 (file)
@@ -501,7 +501,7 @@ class MovePage {
                $defaultContentModelChanging = ( $oldDefault !== $newDefault
                        && $oldDefault === $contentModel );
 
-               // bug 57084: log_page should be the ID of the *moved* page
+               // T59084: log_page should be the ID of the *moved* page
                $oldid = $this->oldTitle->getArticleID();
                $logTitle = clone $this->oldTitle;
 
@@ -550,13 +550,13 @@ class MovePage {
                );
 
                if ( !$redirectContent ) {
-                       // Clean up the old title *before* reset article id - bug 45348
+                       // Clean up the old title *before* reset article id - T47348
                        WikiPage::onArticleDelete( $this->oldTitle );
                }
 
                $this->oldTitle->resetArticleID( 0 ); // 0 == non existing
                $nt->resetArticleID( $oldid );
-               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
+               $newpage->loadPageData( WikiPage::READ_LOCKING ); // T48397
 
                $newpage->updateRevisionOn( $dbw, $nullRevision );
 
@@ -581,7 +581,7 @@ class MovePage {
                # Recreate the redirect, this time in the other direction.
                if ( $redirectContent ) {
                        $redirectArticle = WikiPage::factory( $this->oldTitle );
-                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
+                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // T48397
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $this->oldTitle->resetArticleID( $newid );
index b0a6b7b..50950ef 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-# bug 30219 : can not use pathinfo() on URLs since slashes do not match
+# T32219 : can not use pathinfo() on URLs since slashes do not match
 $matches = [];
 $ext = 'php';
 $path = '/';
index 91fc75c..9ecfa23 100644 (file)
@@ -534,14 +534,32 @@ class OutputPage extends ContextSource {
                        if ( $module instanceof ResourceLoaderModule
                                && $module->getOrigin() <= $this->getAllowedModules( $type )
                                && ( is_null( $position ) || $module->getPosition() == $position )
-                               && ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) )
                        ) {
+                               if ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) ) {
+                                       $this->warnModuleTargetFilter( $module->getName() );
+                                       continue;
+                               }
                                $filteredModules[] = $val;
                        }
                }
                return $filteredModules;
        }
 
+       private function warnModuleTargetFilter( $moduleName ) {
+               static $warnings = [];
+               if ( isset( $warnings[$this->mTarget][$moduleName] ) ) {
+                       return;
+               }
+               $warnings[$this->mTarget][$moduleName] = true;
+               $this->getResourceLoader()->getLogger()->debug(
+                       'Module "{module}" not loadable on target "{target}".',
+                       [
+                               'module' => $moduleName,
+                               'target' => $this->mTarget,
+                       ]
+               );
+       }
+
        /**
         * Get the list of modules to include on this page
         *
@@ -763,7 +781,7 @@ class OutputPage extends ContextSource {
                        'epoch' => $config->get( 'CacheEpoch' )
                ];
                if ( $config->get( 'UseSquid' ) ) {
-                       // bug 44570: the core page itself may not change, but resources might
+                       // T46570: the core page itself may not change, but resources might
                        $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
                }
                Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this ] );
@@ -1448,7 +1466,7 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
                );
 
-               // Site-wide styles are controlled by a config setting, see bug 71621
+               // Site-wide styles are controlled by a config setting, see T73621
                // for background on why. User styles are never allowed.
                if ( $this->getConfig()->get( 'AllowSiteCSSOnRestrictedPages' ) ) {
                        $styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
@@ -2484,7 +2502,7 @@ class OutputPage extends ContextSource {
                ) {
                        $displayReturnto = null;
 
-                       # Due to bug 32276, if a user does not have read permissions,
+                       # Due to T34276, if a user does not have read permissions,
                        # $this->getTitle() will just give Special:Badtitle, which is
                        # not especially useful as a returnto parameter. Use the title
                        # from the request instead, if there was one.
@@ -3066,7 +3084,7 @@ class OutputPage extends ContextSource {
 
                $curRevisionId = 0;
                $articleId = 0;
-               $canonicalSpecialPageName = false; # bug 21115
+               $canonicalSpecialPageName = false; # T23115
 
                $title = $this->getTitle();
                $ns = $title->getNamespace();
@@ -3076,7 +3094,7 @@ class OutputPage extends ContextSource {
 
                $sk = $this->getSkin();
                // Get the relevant title so that AJAX features can use the correct page name
-               // when making API requests from certain special pages (bug 34972).
+               // when making API requests from certain special pages (T36972).
                $relevantTitle = $sk->getRelevantTitle();
                $relevantUser = $sk->getRelevantUser();
 
@@ -3697,6 +3715,8 @@ class OutputPage extends ContextSource {
         */
        public static function transformResourcePath( Config $config, $path ) {
                global $IP;
+
+               $localDir = $IP;
                $remotePathPrefix = $config->get( 'ResourceBasePath' );
                if ( $remotePathPrefix === '' ) {
                        // The configured base path is required to be empty string for
@@ -3710,8 +3730,18 @@ class OutputPage extends ContextSource {
                        // - Path is protocol-relative. Fixes T155310. Not supported by RelPath lib.
                        return $path;
                }
+               // For files in resources, extensions/ or skins/, ResourceBasePath is preferred here.
+               // For other misc files in $IP, we'll fallback to that as well. There is, however, a fourth
+               // supported dir/path pair in the configuration (wgUploadDirectory, wgUploadPath)
+               // which is not expected to be in wgResourceBasePath on CDNs. (T155146)
+               $uploadPath = $config->get( 'UploadPath' );
+               if ( strpos( $path, $uploadPath ) === 0 ) {
+                       $localDir = $config->get( 'UploadDirectory' );
+                       $remotePathPrefix = $remotePath = $uploadPath;
+               }
+
                $path = RelPath\getRelativePath( $path, $remotePath );
-               return self::transformFilePath( $remotePathPrefix, $IP, $path );
+               return self::transformFilePath( $remotePathPrefix, $localDir, $path );
        }
 
        /**
@@ -3825,7 +3855,7 @@ class OutputPage extends ContextSource {
         *    $wgOut->addWikiText( "<div class='error'>\n"
         *        . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
-        * The newline after the opening div is needed in some wikitext. See bug 19226.
+        * The newline after the opening div is needed in some wikitext. See T21226.
         *
         * @param string $wrap
         */
index e6e96c7..c56931e 100644 (file)
@@ -75,16 +75,17 @@ class PHPVersionCheck {
         * @return $this
         */
        function checkRequiredPHPVersion() {
-               if ( !function_exists( 'version_compare' )
-                    || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
+               if (
+                       !function_exists( 'version_compare' )
+                       || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
                ) {
                        $shortText = "MediaWiki $this->mwVersion requires at least PHP version"
-                                    . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
+                               . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
 
                        $longText = "Error: You might be using on older PHP version. \n"
-                                   . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
-                                   . "Check if you have a newer php executable with a different name, "
-                                   . "such as php5.\n\n";
+                               . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
+                               . "Check if you have a newer php executable with a different name, "
+                               . "such as php5.\n\n";
 
                        $longHtml = <<<HTML
                        Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
@@ -112,10 +113,10 @@ HTML;
                        $shortText = "Installing some external dependencies (e.g. via composer) is required.";
 
                        $longText = "Error: You are missing some external dependencies. \n"
-                                   . "MediaWiki now also has some external dependencies that need to be installed\n"
-                                   . "via composer or from a separate git repo. Please see\n"
-                                   . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
-                                   . "for help on installing the required components.";
+                               . "MediaWiki now also has some external dependencies that need to be installed\n"
+                               . "via composer or from a separate git repo. Please see\n"
+                               . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+                               . "for help on installing the required components.";
 
                        $longHtml = <<<HTML
                MediaWiki now also has some external dependencies that need to be installed via
@@ -150,12 +151,12 @@ HTML;
                        foreach ( $missingExtensions as $ext ) {
                                $missingExtText .= " * $ext <$baseUrl/$ext>\n";
                                $missingExtHtml .= "<li><b>$ext</b> "
-                                                  . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
+                                       . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
                        }
 
                        $cliText = "Error: Missing one or more required components of PHP.\n"
-                                  . "You are missing a required extension to PHP that MediaWiki needs.\n"
-                                  . "Please install:\n" . $missingExtText;
+                               . "You are missing a required extension to PHP that MediaWiki needs.\n"
+                               . "Please install:\n" . $missingExtText;
 
                        $longHtml = <<<HTML
                You are missing a required extension to PHP that MediaWiki
@@ -198,7 +199,7 @@ HTML;
                }
                $encLogo =
                        htmlspecialchars( str_replace( '//', '/', $dirname . '/' ) .
-                                         'resources/assets/mediawiki.png' );
+                               'resources/assets/mediawiki.png' );
                $shortHtml = htmlspecialchars( $shortText );
 
                header( 'Content-type: text/html; charset=UTF-8' );
index 6d15c1e..b428e87 100644 (file)
@@ -120,7 +120,7 @@ class Preferences {
                        }
                }
 
-               # # Make sure that form fields have their parent set. See bug 41337.
+               # # Make sure that form fields have their parent set. See T43337.
                $dummyForm = new HTMLForm( [], $context );
 
                $disable = !$user->isAllowed( 'editmyoptions' );
@@ -1201,8 +1201,7 @@ class Preferences {
 
                if ( $dateopts ) {
                        if ( !in_array( 'default', $dateopts ) ) {
-                               $dateopts[] = 'default'; // Make sure default is always valid
-                                                                               // Bug 19237
+                               $dateopts[] = 'default'; // Make sure default is always valid T21237
                        }
 
                        // FIXME KLUGE: site default might not be valid for user language
index 48b1d72..62ee5c6 100644 (file)
@@ -231,7 +231,7 @@ abstract class PrefixSearch {
                        }
                }
 
-               # normalize searchKey, so aliases with spaces can be found - bug 25675
+               # normalize searchKey, so aliases with spaces can be found - T27675
                $searchKey = str_replace( ' ', '_', $searchKey );
                $searchKey = $wgContLang->caseFold( $searchKey );
 
@@ -243,7 +243,7 @@ abstract class PrefixSearch {
                }
 
                foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
-                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# bug 20885
+                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885
                                continue;
                        }
 
@@ -256,7 +256,7 @@ abstract class PrefixSearch {
                $matches = [];
                foreach ( $keys as $pageKey => $page ) {
                        if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
-                               // bug 27671: Don't use SpecialPage::getTitleFor() here because it
+                               // T29671: Don't use SpecialPage::getTitleFor() here because it
                                // localizes its input leading to searches for e.g. Special:All
                                // returning Spezial:MediaWiki-Systemnachrichten and returning
                                // Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
index d9e42ff..4b9435a 100644 (file)
@@ -21,6 +21,8 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * @todo document
@@ -216,7 +218,7 @@ class Revision implements IDBAccessObject {
                        // Pre-1.5 ar_text row
                        $attribs['text'] = self::getRevisionText( $row, 'ar_' );
                        if ( $attribs['text'] === false ) {
-                               throw new MWException( 'Unable to load text from archive row (possibly bug 22624)' );
+                               throw new MWException( 'Unable to load text from archive row (possibly T24624)' );
                        }
                }
                return new self( $attribs );
@@ -1781,6 +1783,7 @@ class Revision implements IDBAccessObject {
         *
         * @param Title $title
         * @param int $id
+        * @param int $flags
         * @return string|bool False if not found
         */
        static function getTimestampFromId( $title, $id, $flags = 0 ) {
index 53cf699..d909a65 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * List for revision table items for a single page
index 42b166d..5f6abee 100644 (file)
@@ -344,12 +344,12 @@ class Sanitizer {
                        $space = '[\x09\x0a\x0c\x0d\x20]';
                        self::$attribsRegex =
                                "/(?:^|$space)({$attribFirst}{$attrib}*)
-                                 ($space*=$space*
+                                       ($space*=$space*
                                        (?:
-                                        # The attribute value: quoted or alone
-                                         \"([^\"]*)(?:\"|\$)
-                                        | '([^']*)(?:'|\$)
-                                         (((?!$space|>).)*)
+                                               # The attribute value: quoted or alone
+                                               \"([^\"]*)(?:\"|\$)
+                                               | '([^']*)(?:'|\$)
+                                               | (((?!$space|>).)*)
                                        )
                                )?(?=$space|\$)/sx";
                }
@@ -545,7 +545,7 @@ class Sanitizer {
                                                        $badtag = true;
                                                } elseif ( in_array( $t, $tagstack ) && !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
-                                               #  Is it a self closed htmlpair ? (bug 5487)
+                                               #  Is it a self closed htmlpair ? (T7487)
                                                } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
                                                        // Eventually we'll just remove the self-closing
                                                        // slash, in order to be consistent with HTML5
@@ -922,7 +922,7 @@ class Sanitizer {
 
                // Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
                $value = preg_replace_callback(
-                       '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (bug 58088)
+                       '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (T60088)
                        function ( $matches ) {
                                $cp = UtfNormal\Utils::utf8ToCodepoint( $matches[0] );
                                if ( $cp === false ) {
@@ -1508,7 +1508,7 @@ class Sanitizer {
 
        /**
         * Decode any character references, numeric or named entities,
-        * in the next and normalize the resulting string. (bug 14952)
+        * in the next and normalize the resulting string. (T16952)
         *
         * This is useful for page titles, not for text to be displayed,
         * MediaWiki allows HTML entities to escape normalization as a feature.
@@ -1926,7 +1926,7 @@ class Sanitizer {
         *   3.5.
         *
         * This function is an implementation of the specification as requested in
-        * bug 22449.
+        * T24449.
         *
         * Client-side forms will use the same standard validation rules via JS or
         * HTML 5 validation; additional restrictions can be enforced server-side
@@ -1949,7 +1949,7 @@ class Sanitizer {
 
                // Please note strings below are enclosed in brackets [], this make the
                // hyphen "-" a range indicator. Hence it is double backslashed below.
-               // See bug 26948
+               // See T28948
                $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
                $rfc1034_ldh_str = "a-z0-9\\-";
 
index 01ba1e8..b61de73 100644 (file)
@@ -329,7 +329,7 @@ if ( $wgEnableEmail ) {
        $wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist;
 } else {
        // Disable all other email settings automatically if $wgEnableEmail
-       // is set to false. - bug 63678
+       // is set to false. - T65678
        $wgAllowHTMLEmail = false;
        $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
        $wgEnableUserEmail = false;
@@ -521,35 +521,6 @@ if ( $wgSharedDB && $wgSharedTables ) {
 // is complete.
 define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
 
-// Install a header callback to prevent caching of responses with cookies (T127993)
-if ( !$wgCommandLineMode ) {
-       header_register_callback( function () {
-               $headers = [];
-               foreach ( headers_list() as $header ) {
-                       list( $name, $value ) = explode( ':', $header, 2 );
-                       $headers[strtolower( trim( $name ) )][] = trim( $value );
-               }
-
-               if ( isset( $headers['set-cookie'] ) ) {
-                       $cacheControl = isset( $headers['cache-control'] )
-                               ? implode( ', ', $headers['cache-control'] )
-                               : '';
-
-                       if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i', $cacheControl ) ) {
-                               header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
-                               header( 'Cache-Control: private, max-age=0, s-maxage=0' );
-                               MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
-                                       'Cookies set on {url} with Cache-Control "{cache-control}"', [
-                                               'url' => WebRequest::getGlobalRequestURL(),
-                                               'cookies' => $headers['set-cookie'],
-                                               'cache-control' => $cacheControl ?: '<not set>',
-                                       ]
-                               );
-                       }
-               }
-       } );
-}
-
 MWExceptionHandler::installHandler();
 
 require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
index 3ce775b..3ed6b8b 100644 (file)
@@ -134,7 +134,7 @@ class Title implements LinkTarget {
 
        /**
         * @var int Namespace index when there is no namespace. Don't change the
-        *   following default, NS_MAIN is hardcoded in several places. See bug 696.
+        *   following default, NS_MAIN is hardcoded in several places. See T2696.
         *   Zero except in {{transclusion}} tags.
         */
        public $mDefaultNamespace = NS_MAIN;
@@ -307,7 +307,7 @@ class Title implements LinkTarget {
                        }
                }
 
-               // Convert things like &eacute; &#257; or &#x3017; into normalized (bug 14952) text
+               // Convert things like &eacute; &#257; or &#x3017; into normalized (T16952) text
                $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
 
                $t = new Title();
@@ -2549,6 +2549,29 @@ class Title implements LinkTarget {
         *   protection, or false if there's none.
         */
        public function getTitleProtection() {
+               $protection = $this->getTitleProtectionInternal();
+               if ( $protection ) {
+                       if ( $protection['permission'] == 'sysop' ) {
+                               $protection['permission'] = 'editprotected'; // B/C
+                       }
+                       if ( $protection['permission'] == 'autoconfirmed' ) {
+                               $protection['permission'] = 'editsemiprotected'; // B/C
+                       }
+               }
+               return $protection;
+       }
+
+       /**
+        * Fetch title protection settings
+        *
+        * To work correctly, $this->loadRestrictions() needs to have access to the
+        * actual protections in the database without munging 'sysop' =>
+        * 'editprotected' and 'autoconfirmed' => 'editsemiprotected'. Other
+        * callers probably want $this->getTitleProtection() instead.
+        *
+        * @return array|bool
+        */
+       protected function getTitleProtectionInternal() {
                // Can't protect pages in special namespaces
                if ( $this->getNamespace() < 0 ) {
                        return false;
@@ -2576,12 +2599,6 @@ class Title implements LinkTarget {
                        // fetchRow returns false if there are no rows.
                        $row = $dbr->fetchRow( $res );
                        if ( $row ) {
-                               if ( $row['permission'] == 'sysop' ) {
-                                       $row['permission'] = 'editprotected'; // B/C
-                               }
-                               if ( $row['permission'] == 'autoconfirmed' ) {
-                                       $row['permission'] = 'editsemiprotected'; // B/C
-                               }
                                $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] );
                        }
                        $this->mTitleProtection = $row;
@@ -2979,7 +2996,7 @@ class Title implements LinkTarget {
 
                        $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions );
                } else {
-                       $title_protection = $this->getTitleProtection();
+                       $title_protection = $this->getTitleProtectionInternal();
 
                        if ( $title_protection ) {
                                $now = wfTimestampNow();
@@ -3741,14 +3758,14 @@ class Title implements LinkTarget {
                        }
                        $newPageName = preg_replace(
                                        '#^' . preg_quote( $this->getDBkey(), '#' ) . '#',
-                                       StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+                                       StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
                                        $oldSubpage->getDBkey() );
                        if ( $oldSubpage->isTalkPage() ) {
                                $newNs = $nt->getTalkPage()->getNamespace();
                        } else {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
-                       # Bug 14385: we need makeTitleSafe because the new page names may
+                       # T16385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
 
@@ -3865,7 +3882,7 @@ class Title implements LinkTarget {
         * categories' names.
         *
         * @return array Array of parents in the form:
-        *        $parent => $currentarticle
+        *     $parent => $currentarticle
         */
        public function getParentCategories() {
                global $wgContLang;
index 5a28b85..bf2344b 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * The TitleArray class only exists to provide the newFromResult method at pre-
  * sent.
index 668ea54..189fb40 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class TitleArrayFromResult extends TitleArray implements Countable {
        /** @var ResultWrapper */
        public $res;
index c80e4a5..bc57049 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class performing complex database queries related to WatchedItems.
@@ -401,7 +402,7 @@ class WatchedItemQueryService {
                if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) {
                        if ( $db->getType() === 'mysql' ) {
                                // This is an index optimization for mysql
-                               $conds[] = "rc_timestamp > ''";
+                               $conds[] = 'rc_timestamp > ' . $db->addQuotes( '' );
                        }
                }
 
@@ -504,7 +505,7 @@ class WatchedItemQueryService {
                        $conds[] = 'rc_user_text != ' . $db->addQuotes( $options['notByUser'] );
                }
 
-               // Avoid brute force searches (bug 17342)
+               // Avoid brute force searches (T19342)
                $bitmask = 0;
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $bitmask = Revision::DELETED_USER;
index 8fcf131..6301576 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Extension mechanism for WatchedItemQueryService
  *
index 3cdc59c..9af5310 100644 (file)
@@ -2,8 +2,10 @@
 
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Storage layer class for WatchedItems.
@@ -734,7 +736,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                                        global $wgUpdateRowsPerQuery;
 
                                        $dbw = $this->getConnectionRef( DB_MASTER );
-                                       $factory = wfGetLBFactory();
+                                       $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                                        $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
 
                                        $watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
index 3bbdc3f..3d5e372 100644 (file)
@@ -216,7 +216,7 @@ class WebRequest {
 
                        $host = $parts[0];
                        if ( $wgAssumeProxiesUseDefaultProtocolPorts && isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {
-                               // Bug 70021: Assume that upstream proxy is running on the default
+                               // T72021: Assume that upstream proxy is running on the default
                                // port based on the protocol. We have no reliable way to determine
                                // the actual port in use upstream.
                                $port = $stdPort;
@@ -308,7 +308,7 @@ class WebRequest {
         * available variant URLs.
         */
        public function interpolateTitle() {
-               // bug 16019: title interpolation on API queries is useless and sometimes harmful
+               // T18019: title interpolation on API queries is useless and sometimes harmful
                if ( defined( 'MW_API' ) ) {
                        return;
                }
@@ -408,7 +408,7 @@ class WebRequest {
         * @since 1.28
         * @param string $name
         * @param string|null $default Optional default
-        * @return string
+        * @return string|null
         */
        public function getRawVal( $name, $default = null ) {
                $name = strtr( $name, '.', '_' ); // See comment in self::getGPCVal()
@@ -432,7 +432,7 @@ class WebRequest {
         *
         * @param string $name
         * @param string $default Optional default (or null)
-        * @return string
+        * @return string|null
         */
        public function getVal( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
@@ -482,7 +482,7 @@ class WebRequest {
         *
         * @param string $name
         * @param array $default Optional default (or null)
-        * @return array
+        * @return array|null
         */
        public function getArray( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
@@ -1229,7 +1229,7 @@ HTML;
                                if (
                                        IP::isPublic( $ipchain[$i + 1] ) ||
                                        $wgUsePrivateIPs ||
-                                       $proxyLookup->isConfiguredProxy( $curIP ) // bug 48919; treat IP as sane
+                                       $proxyLookup->isConfiguredProxy( $curIP ) // T50919; treat IP as sane
                                ) {
                                        // Follow the next IP according to the proxy
                                        $nextIP = IP::canonicalize( $ipchain[$i + 1] );
index 339b2e3..0208a72 100644 (file)
@@ -39,6 +39,7 @@ class WebResponse {
         * @param null|int $http_response_code Forces the HTTP response code to the specified value.
         */
        public function header( $string, $replace = true, $http_response_code = null ) {
+               \MediaWiki\HeaderCallback::warnIfHeadersSent();
                if ( $http_response_code ) {
                        header( $string, $replace, $http_response_code );
                } else {
index 6e4fb09..15804c7 100644 (file)
@@ -30,7 +30,7 @@ if ( ini_get( 'mbstring.func_overload' ) ) {
        die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
 }
 
-# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
+# T17461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
 header( 'X-Content-Type-Options: nosniff' );
@@ -104,6 +104,9 @@ if ( !interface_exists( 'Psr\Log\LoggerInterface' ) ) {
        die( 1 );
 }
 
+# Install a header callback
+MediaWiki\HeaderCallback::register();
+
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # Use a callback function to configure MediaWiki
        call_user_func( MW_CONFIG_CALLBACK );
index 8f18046..d24a27c 100644 (file)
@@ -59,8 +59,8 @@ class Xml {
         * Given an array of ('attributename' => 'value'), it generates the code
         * to set the XML attributes : attributename="value".
         * The values are passed to Sanitizer::encodeAttribute.
-        * Return null if no attributes given.
-        * @param array $attribs Array of attributes for an XML element
+        * Returns null or empty string if no attributes given.
+        * @param array|null $attribs Array of attributes for an XML element
         * @throws MWException
         * @return null|string
         */
index e8aec1c..d1be7d4 100644 (file)
@@ -24,6 +24,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * This class handles printing the history page for an article. In order to
@@ -146,6 +148,9 @@ class HistoryAction extends FormlessAction {
                                $out->setStatusCode( 404 );
                        }
                        $out->addWikiMsg( 'nohistory' );
+
+                       $dbr = wfGetDB( DB_REPLICA );
+
                        # show deletion/move log if there is an entry
                        LogEventsList::showLogExtract(
                                $out,
@@ -153,7 +158,7 @@ class HistoryAction extends FormlessAction {
                                $this->getTitle(),
                                '',
                                [ 'lim' => 10,
-                                       'conds' => [ "log_action != 'revision'" ],
+                                       'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                        'showIfEmpty' => false,
                                        'msgKey' => [ 'moveddeleted-notice' ]
                                ]
index 5fb83b3..167b709 100644 (file)
@@ -835,7 +835,7 @@ class InfoAction extends FormlessAction {
                $real_names = [];
                $user_names = [];
                $anon_ips = [];
-               $linkRenderer = MediaWikiServices::getLinkRenderer();
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
 
                # Sift for real versus user names
                /** @var $user User */
index aa2858d..9d336e4 100644 (file)
@@ -41,6 +41,7 @@ class RollbackAction extends FormlessAction {
         * - confirm-rollback-button
         * - rollbackfailed
         * - rollback-missingparam
+        * - rollback-success-notify
         */
 
        /**
@@ -123,8 +124,13 @@ class RollbackAction extends FormlessAction {
 
                $old = Linker::revUserTools( $current );
                $new = Linker::revUserTools( $target );
-               $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )
-                       ->parseAsBlock() );
+               $this->getOutput()->addHTML(
+                       $this->msg( 'rollback-success' )
+                               ->rawParams( $old, $new )
+                               ->params( $current->getUserText( Revision::FOR_THIS_USER, $user ) )
+                               ->params( $target->getUserText( Revision::FOR_THIS_USER, $user ) )
+                               ->parseAsBlock()
+               );
 
                if ( $user->getBoolOption( 'watchrollback' ) ) {
                        $user->addWatch( $this->page->getTitle(), User::IGNORE_USER_RIGHTS );
index 5327d7a..d037c36 100644 (file)
@@ -208,6 +208,7 @@ class ApiAuthManagerHelper {
                        $res->status === AuthenticationResponse::RESTART
                ) {
                        $this->formatMessage( $ret, 'message', $res->message );
+                       $ret['messagecode'] = ApiMessage::create( $res->message )->getApiCode();
                }
 
                if ( $res->status === AuthenticationResponse::FAIL ||
index e249810..c03faf0 100644 (file)
@@ -700,7 +700,7 @@ abstract class ApiBase extends ContextSource {
         * @return array
         */
        public function extractRequestParams( $parseLimit = true ) {
-               // Cache parameters, for performance and to avoid bug 24564.
+               // Cache parameters, for performance and to avoid T26564.
                if ( !isset( $this->mParamCache[$parseLimit] ) ) {
                        $params = $this->getFinalParams();
                        $results = [];
@@ -1326,7 +1326,7 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
-                       // Bug 33482 - Allow entries with | in them for non-multiple values
+                       // T35482 - Allow entries with | in them for non-multiple values
                        if ( in_array( $value, $allowedValues, true ) ) {
                                return $value;
                        }
index 58e3d1c..8577ad2 100644 (file)
@@ -46,7 +46,7 @@ class ApiBlock extends ApiBase {
 
                $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
@@ -69,7 +69,7 @@ class ApiBlock extends ApiBase {
                } else {
                        $target = User::newFromName( $params['user'] );
 
-                       // Bug 38633 - if the target is a user (not an IP address), but it
+                       // T40633 - if the target is a user (not an IP address), but it
                        // doesn't exist or is unusable, error.
                        if ( $target instanceof User &&
                                ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
index e0e50ed..0b04c8c 100644 (file)
@@ -57,7 +57,7 @@ class ApiFeedRecentChanges extends ApiBase {
 
                $this->getMain()->setCacheMode( 'public' );
                if ( !$this->getMain()->getParameter( 'smaxage' ) ) {
-                       // bug 63249: This page gets hit a lot, cache at least 15 seconds.
+                       // T65249: This page gets hit a lot, cache at least 15 seconds.
                        $this->getMain()->setCacheMaxAge( 15 );
                }
 
index 67f54a8..83c348b 100644 (file)
@@ -186,7 +186,7 @@ abstract class ApiFormatBase extends ApiBase {
 
                $this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
 
-               // Set X-Frame-Options API results (bug 39180)
+               // Set X-Frame-Options API results (T41180)
                $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
                if ( $apiFrameOptions ) {
                        $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
@@ -269,7 +269,7 @@ abstract class ApiFormatBase extends ApiBase {
                                        false, FormatJson::ALL_OK
                                );
 
-                               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+                               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                                // Flash, but what it does isn't friendly for the API, so we need to
                                // work around it.
                                if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
index 8ebfe48..e5dafae 100644 (file)
@@ -91,7 +91,7 @@ class ApiFormatJson extends ApiFormatBase {
                $data = $this->getResult()->getResultData( null, $transform );
                $json = FormatJson::encode( $data, $this->getIsHtml(), $opt );
 
-               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API, so we need to
                // work around it.
                if ( preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $json ) ) {
@@ -103,7 +103,7 @@ class ApiFormatJson extends ApiFormatBase {
                if ( isset( $params['callback'] ) ) {
                        $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] );
                        # Prepend a comment to try to avoid attacks against content
-                       # sniffers, such as bug 68187.
+                       # sniffers, such as T70187.
                        $this->printText( "/**/$callback($json)" );
                } else {
                        $this->printText( $json );
index a744f57..671f356 100644 (file)
@@ -60,7 +60,7 @@ class ApiFormatPhp extends ApiFormatBase {
                }
                $text = serialize( $this->getResult()->getResultData( null, $transforms ) );
 
-               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API. There's nothing
                // we can do here that isn't actively broken in some manner, so let's
                // just be broken in a useful manner.
index 6cf1fad..d64aeb7 100644 (file)
@@ -70,14 +70,7 @@ class ApiLogin extends ApiBase {
                        return;
                }
 
-               try {
-                       $this->requirePostedParameters( [ 'password', 'token' ] );
-               } catch ( ApiUsageException $ex ) {
-                       // Make this a warning for now, upgrade to an error in 1.29.
-                       foreach ( $ex->getStatusValue()->getErrors() as $error ) {
-                               $this->addDeprecation( $error, 'login-params-in-query-string' );
-                       }
-               }
+               $this->requirePostedParameters( [ 'password', 'token' ] );
 
                $params = $this->extractRequestParams();
 
@@ -209,7 +202,7 @@ class ApiLogin extends ApiBase {
 
                        case 'Aborted':
                                $result['reason'] = 'Authentication requires user interaction, ' .
-                                  'which is not supported by action=login.';
+                                       'which is not supported by action=login.';
                                if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
                                        $result['reason'] .= ' To be able to login with action=login, see [[Special:BotPasswords]].';
                                        $result['reason'] .= ' To continue using main-account login, see action=clientlogin.';
index 59227d9..604fdf9 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * This is the main API class, used for both external and internal processing.
@@ -574,7 +575,7 @@ class ApiMain extends ApiBase {
         * @param Exception $e
         */
        protected function handleException( Exception $e ) {
-               // Bug 63145: Rollback any open database transactions
+               // T65145: Rollback any open database transactions
                if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        // UsageExceptions are intentional, so don't rollback if that's the case
                        try {
@@ -1116,7 +1117,9 @@ class ApiMain extends ApiBase {
                                )
                        );
                } else {
-                       if ( $config->get( 'ShowExceptionDetails' ) ) {
+                       if ( $config->get( 'ShowExceptionDetails' ) &&
+                               ( !$e instanceof DBError || $config->get( 'ShowDBErrorBacktrace' ) )
+                       ) {
                                $result->addContentValue(
                                        $path,
                                        'trace',
@@ -1666,7 +1669,7 @@ class ApiMain extends ApiBase {
                $ret = $this->getRequest()->getVal( $name );
                if ( $ret === null ) {
                        if ( $this->getRequest()->getArray( $name ) !== null ) {
-                               // See bug 10262 for why we don't just implode( '|', ... ) the
+                               // See T12262 for why we don't just implode( '|', ... ) the
                                // array.
                                $this->addWarning( [ 'apiwarn-unsupportedarray', $name ] );
                        }
index ab7199f..566f778 100644 (file)
@@ -103,7 +103,7 @@ class ApiMove extends ApiBase {
                // a redirect to the new title. This is not safe, but what we did before was
                // even worse: we just determined whether a redirect should have been created,
                // and reported that it was created if it should have, without any checks.
-               // Also note that isRedirect() is unreliable because of bug 37209.
+               // Also note that isRedirect() is unreliable because of T39209.
                $r['redirectcreated'] = $fromTitle->exists();
 
                $r['moveoverredirect'] = $toTitleExists;
index d42e306..7d16af8 100644 (file)
@@ -24,6 +24,7 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -64,6 +65,7 @@ class ApiPageSet extends ApiBase {
        private $mMissingPageIDs = [];
        private $mRedirectTitles = [];
        private $mSpecialTitles = [];
+       private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace()
        private $mNormalizedTitles = [];
        private $mInterwikiTitles = [];
        /** @var Title[] */
@@ -1061,7 +1063,7 @@ class ApiPageSet extends ApiBase {
         * @return LinkBatch
         */
        private function getRedirectTargets() {
-               $lb = new LinkBatch();
+               $titlesToResolve = [];
                $db = $this->getDB();
 
                $res = $db->select(
@@ -1088,8 +1090,8 @@ class ApiPageSet extends ApiBase {
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
                        if ( $to->isExternal() ) {
                                $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
-                       } elseif ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
-                               $lb->add( $row->rd_namespace, $row->rd_title );
+                       } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                               $titlesToResolve[] = $to;
                        }
                        $this->mRedirectTitles[$from] = $to;
                }
@@ -1104,7 +1106,11 @@ class ApiPageSet extends ApiBase {
                                        // What the hell. Let's just ignore this
                                        continue;
                                }
-                               $lb->addObj( $rt );
+                               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;
@@ -1112,7 +1118,7 @@ class ApiPageSet extends ApiBase {
                        }
                }
 
-               return $lb;
+               return $this->processTitlesArray( $titlesToResolve );
        }
 
        /**
@@ -1151,12 +1157,14 @@ class ApiPageSet extends ApiBase {
                                        $titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
                                } catch ( MalformedTitleException $ex ) {
                                        // Handle invalid titles gracefully
-                                       $this->mAllPages[0][$title] = $this->mFakePageId;
-                                       $this->mInvalidTitles[$this->mFakePageId] = [
-                                               'title' => $title,
-                                               'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
-                                       ];
-                                       $this->mFakePageId--;
+                                       if ( !isset( $this->mAllPages[0][$title] ) ) {
+                                               $this->mAllPages[0][$title] = $this->mFakePageId;
+                                               $this->mInvalidTitles[$this->mFakePageId] = [
+                                                       'title' => $title,
+                                                       'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
+                                               ];
+                                               $this->mFakePageId--;
+                                       }
                                        continue; // There's nothing else we can do
                                }
                        } else {
@@ -1184,8 +1192,13 @@ class ApiPageSet extends ApiBase {
                                if ( $titleObj->getNamespace() < 0 ) {
                                        // Handle Special and Media pages
                                        $titleObj = $titleObj->fixSpecialName();
-                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
-                                       $this->mFakePageId--;
+                                       $ns = $titleObj->getNamespace();
+                                       $dbkey = $titleObj->getDBkey();
+                                       if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
+                                               $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
+                                               $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+                                               $this->mFakePageId--;
+                                       }
                                } else {
                                        // Regular page
                                        $linkBatch->addObj( $titleObj );
@@ -1384,7 +1397,7 @@ class ApiPageSet extends ApiBase {
         * @return array
         */
        private static function getPositiveIntegers( $array ) {
-               // bug 25734 API: possible issue with revids validation
+               // T27734 API: possible issue with revids validation
                // It seems with a load of revision rows, MySQL gets upset
                // Remove any < 0 integers, as they can't be valid
                foreach ( $array as $i => $int ) {
index 324d030..3124638 100644 (file)
@@ -37,11 +37,6 @@ class ApiPurge extends ApiBase {
         * Purges the cache of a page
         */
        public function execute() {
-               $main = $this->getMain();
-               if ( !$main->isInternalMode() && !$main->getRequest()->wasPosted() ) {
-                       $this->addDeprecation( 'apiwarn-deprecation-purge-get', 'purge-via-GET' );
-               }
-
                $params = $this->extractRequestParams();
 
                $continuationManager = new ApiContinuationManager( $this, [], [] );
@@ -60,12 +55,8 @@ class ApiPurge extends ApiBase {
                        ApiQueryBase::addTitleInfo( $r, $title );
                        $page = WikiPage::factory( $title );
                        if ( !$user->pingLimiter( 'purge' ) ) {
-                               $flags = WikiPage::PURGE_ALL;
-                               if ( !$this->getRequest()->wasPosted() ) {
-                                       $flags ^= WikiPage::PURGE_GLOBAL_PCACHE; // skip DB_MASTER write
-                               }
                                // Directly purge and skip the UI part of purge()
-                               $page->doPurge( $flags );
+                               $page->doPurge( WikiPage::PURGE_ALL );
                                $r['purged'] = true;
                        } else {
                                $this->addWarning( 'apierror-ratelimited' );
@@ -157,20 +148,7 @@ class ApiPurge extends ApiBase {
        }
 
        public function mustBePosted() {
-               // Anonymous users are not allowed a non-POST request
-               return !$this->getUser()->isAllowed( 'purge' );
-       }
-
-       protected function getHelpFlags() {
-               $flags = parent::getHelpFlags();
-
-               // Claim that we must be posted for the purposes of help and paraminfo.
-               // @todo Remove this when self::mustBePosted() is updated for T145649
-               if ( !in_array( 'mustbeposted', $flags, true ) ) {
-                       $flags[] = 'mustbeposted';
-               }
-
-               return $flags;
+               return true;
        }
 
        public function getAllowedParams( $flags = 0 ) {
index b09b977..020df6d 100644 (file)
@@ -230,7 +230,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
index b64b2c8..7b43efc 100644 (file)
@@ -131,7 +131,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
                        } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
index 1c3b171..9e7ad67 100644 (file)
@@ -147,7 +147,9 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addJoinConds( [ 'ug1' => [ 'LEFT OUTER JOIN',
                                array_merge( [
                                        'ug1.ug_user=user_id',
-                                       'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                       $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                               '1' :
+                                               'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                ], $exclude )
                        ] ] );
                        $this->addWhere( 'ug1.ug_user IS NULL' );
@@ -163,7 +165,9 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addFields( [ 'groups' =>
                                $db->buildGroupConcatField( '|', 'user_groups', 'ug_group', [
                                        'ug_user=user_id',
-                                       'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                       $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                               '1' :
+                                               'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                ] )
                        ] );
                }
@@ -182,7 +186,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                ],
                        ] ] );
 
-                       // Actually count the actions using a subquery (bug 64505 and bug 64507)
+                       // Actually count the actions using a subquery (T66505 and T66507)
                        $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds );
                        $this->addFields( [
                                'recentactions' => '(' . $db->selectSQLText(
index 613589e..b3ac606 100644 (file)
@@ -152,7 +152,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $this->params['filterredir'] == 'redirects' ) {
                        $this->addWhereFld( 'page_is_redirect', 1 );
                } elseif ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect ) {
-                       // bug 22245 - Check for !redirect, as filtering nonredirects, when
+                       // T24245 - Check for !redirect, as filtering nonredirects, when
                        // getting what links to them is contradictory
                        $this->addWhereFld( 'page_is_redirect', 0 );
                }
index 281fb61..87bb6a7 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a base class for all Query modules.
  * It provides some common functionality such as constructing various SQL
@@ -258,7 +260,7 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Equivalent to addWhere(array($field => $value))
         * @param string $field Field name
-        * @param string $value Value; ignored if null or empty array;
+        * @param string|string[] $value Value; ignored if null or empty array;
         */
        protected function addWhereFld( $field, $value ) {
                // Use count() to its full documented capabilities to simultaneously
@@ -325,7 +327,7 @@ abstract class ApiQueryBase extends ApiBase {
         * Add an option such as LIMIT or USE INDEX. If an option was set
         * before, the old value will be overwritten
         * @param string $name Option name
-        * @param string $value Option value
+        * @param string|string[] $value Option value
         */
        protected function addOption( $name, $value = null ) {
                if ( is_null( $value ) ) {
index d0b8214..471aed6 100644 (file)
@@ -123,7 +123,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
index 6a259cd..2959151 100644 (file)
@@ -203,7 +203,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
index c9dae8d..e5e45b3 100644 (file)
@@ -509,7 +509,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                if ( $mto && !$mto->isError() ) {
                                        $vals['thumburl'] = wfExpandUrl( $mto->getUrl(), PROTO_CURRENT );
 
-                                       // bug 23834 - If the URL's are the same, we haven't resized it, so shouldn't give the wanted
+                                       // T25834 - If the URLs are the same, we haven't resized it, so shouldn't give the wanted
                                        // thumbnail sizes for the thumbnail actual size
                                        if ( $mto->getUrl() !== $file->getUrl() ) {
                                                $vals['thumbwidth'] = intval( $mto->getWidth() );
index 4d84aad..8a13fef 100644 (file)
@@ -198,7 +198,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
                }
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
index 2c76e97..26581a6 100644 (file)
@@ -147,7 +147,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                /* Build our basic query. Namely, something along the lines of:
                 * SELECT * FROM recentchanges WHERE rc_timestamp > $start
-                *              AND rc_timestamp < $end AND rc_namespace = $namespace
+                *   AND rc_timestamp < $end AND rc_namespace = $namespace
                 */
                $this->addTables( 'recentchanges' );
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
@@ -320,7 +320,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
index 48f6046..c47de9d 100644 (file)
@@ -244,7 +244,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                                }
                        }
                        if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
-                               // Paranoia: avoid brute force searches (bug 17342)
+                               // Paranoia: avoid brute force searches (T19342)
                                if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                        $bitmask = Revision::DELETED_USER;
                                } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
index 5093608..cc302dc 100644 (file)
@@ -88,6 +88,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'languages':
                                        $fit = $this->appendLanguages( $p );
                                        break;
+                               case 'languagevariants':
+                                       $fit = $this->appendLanguageVariants( $p );
+                                       break;
                                case 'skins':
                                        $fit = $this->appendSkins( $p );
                                        break;
@@ -713,6 +716,49 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
+       // Export information about which page languages will trigger
+       // language conversion. (T153341)
+       public function appendLanguageVariants( $property ) {
+               $langNames = LanguageConverter::$languagesWithVariants;
+               if ( $this->getConfig()->get( 'DisableLangConversion' ) ) {
+                       // Ensure result is empty if language conversion is disabled.
+                       $langNames = [];
+               }
+               sort( $langNames );
+
+               $data = [];
+               foreach ( $langNames as $langCode ) {
+                       $lang = Language::factory( $langCode );
+                       if ( $lang->getConverter() instanceof FakeConverter ) {
+                               // Only languages which do not return instances of
+                               // FakeConverter implement language conversion.
+                               continue;
+                       }
+                       $data[$langCode] = [];
+                       ApiResult::setIndexedTagName( $data[$langCode], 'variant' );
+                       ApiResult::setArrayType( $data[$langCode], 'kvp', 'code' );
+
+                       $variants = $lang->getVariants();
+                       sort( $variants );
+                       foreach ( $variants as $v ) {
+                               $fallbacks = $lang->getConverter()->getVariantFallbacks( $v );
+                               if ( !is_array( $fallbacks ) ) {
+                                       $fallbacks = [ $fallbacks ];
+                               }
+                               $data[$langCode][$v] = [
+                                       'fallbacks' => $fallbacks,
+                               ];
+                               ApiResult::setIndexedTagName(
+                                       $data[$langCode][$v]['fallbacks'], 'variant'
+                               );
+                       }
+               }
+               ApiResult::setIndexedTagName( $data, 'lang' );
+               ApiResult::setArrayType( $data, 'kvp', 'code' );
+
+               return $this->getResult()->addValue( 'query', $property, $data );
+       }
+
        public function appendSkins( $property ) {
                $data = [];
                $allowed = Skin::getAllowedSkins();
@@ -772,7 +818,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendProtocols( $property ) {
-               // Make a copy of the global so we don't try to set the _element key of it - bug 45130
+               // Make a copy of the global so we don't try to set the _element key of it - T47130
                $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
                ApiResult::setArrayType( $protocols, 'BCarray' );
                ApiResult::setIndexedTagName( $protocols, 'p' );
@@ -851,6 +897,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'rightsinfo',
                                        'restrictions',
                                        'languages',
+                                       'languagevariants',
                                        'skins',
                                        'extensiontags',
                                        'functionhooks',
index e27cf7d..6734740 100644 (file)
@@ -364,7 +364,7 @@ class ApiResult implements ApiSerializable {
                        }
                }
                if ( is_array( $value ) ) {
-                       // Work around PHP bug 45959 by copying to a temporary
+                       // Work around https://bugs.php.net/bug.php?id=45959 by copying to a temporary
                        // (in this case, foreach gets $k === "1" but $tmp[$k] assigns as if $k === 1)
                        $tmp = [];
                        foreach ( $value as $k => $v ) {
index 3eeb7a4..bfb0324 100644 (file)
@@ -44,7 +44,7 @@ class ApiUnblock extends ApiBase {
                if ( !$user->isAllowed( 'block' ) ) {
                        $this->dieWithError( 'apierror-permissiondenied-unblock', 'permissiondenied' );
                }
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
index 86078d4..1222195 100644 (file)
@@ -8,7 +8,8 @@
                        "Hiba Alshawi",
                        "Maroen1990",
                        "محمد أحمد عبد الفتاح",
-                       "ديفيد"
+                       "ديفيد",
+                       "ASHmed"
                ]
        },
        "apihelp-main-param-action": "أي فعل للعمل.",
        "apihelp-protect-example-protect": "حماية صفحة.",
        "apihelp-protect-example-unprotect": "إلغاء حماية الصفحة من خلال وضع قيود ل<kbd>all</kbd> (أي يُسمَح أي شخص باتخاذ الإجراءات).",
        "apihelp-protect-example-unprotect2": "إلغاء حماية الصفحة عن طريق عدم وضع أية قيود.",
+       "apihelp-purge-description": "مسح ذاكرة التخزين المؤقت للعناوين المعطاة",
        "apihelp-purge-param-forcelinkupdate": "تحديث جداول الروابط.",
        "apihelp-purge-param-forcerecursivelinkupdate": "تحديث جدول الروابط، وتحديث جداول الروابط لأية صفحة تستخدم هذه الصفحة كقالب.",
        "apihelp-purge-example-simple": "إفراغ كاش <kbd>Main Page</kbd> وصفحة <kbd>API</kbd>.",
index a6fceee..491a1b0 100644 (file)
@@ -34,6 +34,7 @@
        "apihelp-main-param-responselanginfo": "Bezieht die für <var>uselang</var> und <var>errorlang</var> verwendeten Sprachen im Ergebnis mit ein.",
        "apihelp-main-param-origin": "Beim Zugriff auf die API mit einer Kreuz-Domain-AJAX-Anfrage (CORS) muss dies als entstehende Domäne festgelegt werden. Dies muss in jeder Vorfluganfrage mit eingeschlossen werden und deshalb ein Teil der Anfragen-URI sein (nicht des POST-Körpers).\n\nFür authentifizierte Anfragen muss dies exakt einem der Ursprünge im Header <code>Origin</code> entsprechen, so dass es auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> festgelegt werden muss. Falls dieser Parameter nicht mit dem Header <code>Origin</code> übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter mit dem Header <code>Origin</code> übereinstimmt und der Ursprung weißgelistet ist, werden die Header <code>Access-Control-Allow-Origin</code> und <code>Access-Control-Allow-Credentials</code> festgelegt.\n\nGib für nicht authentifizierte Anfragen den Wert <kbd>*</kbd> an. Dies verursacht, dass der Header <code>Access-Control-Allow-Origin</code> festgelegt wird, aber <code>Access-Control-Allow-Credentials</code> wird <code>false</code> sein und alle benutzerspezifischen Daten werden beschränkt.",
        "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> gibt eine Liste der Sprachcodes zurück. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
+       "apihelp-main-param-errorformat": "Zu verwendendes Format zur Ausgabe von Warnungen und Fehlertexten.\n; plaintext: Wikitext mit entfernten HTML-Tags und ersetzten Entitäten.\n; wikitext: Ungeparster Wikitext.\n; html: HTML.\n; raw: Nachrichtenschlüssel und Parameter.\n; none: Keine Textausgabe, nur die Fehlercodes.\n; bc: Vor MediaWiki 1.29 verwendetes Format. <var>errorlang</var> und <var>errorsuselocal</var> werden ignoriert.",
        "apihelp-main-param-errorsuselocal": "Falls angegeben, verwenden Fehlertexte lokalisierte Nachrichten aus dem {{ns:MediaWiki}}-Namensraum.",
        "apihelp-block-description": "Einen Benutzer sperren.",
        "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der gesperrt werden soll. Kann nicht zusammen mit <var>$1userid</var> verwendet werden.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
        "apihelp-protect-example-unprotect": "Entsperrt eine Seite, indem die Einschränkungen durch den Schutz auf <kbd>all</kbd> gestellt werden (z.&nbsp;B. darf jeder die Aktion ausführen).",
        "apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden",
-       "apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.\n\nFalls kein Benutzer angemeldet ist, müssen POST-Anfragen genutzt werden.",
+       "apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.",
        "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Aktualisiert die Linktabelle der Seite und alle Linktabellen der Seiten, die sie als Vorlage einbinden.",
        "apihelp-purge-example-simple": "Purgt die <kbd>Main Page</kbd> und die <kbd>API</kbd>-Seite.",
        "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-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-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 HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-format-prettyprint-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-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.",
index d92d78b..ab8a8a5 100644 (file)
        "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to <kbd>all</kbd> (i.e. everyone is allowed to take the action).",
        "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions.",
 
-       "apihelp-purge-description": "Purge the cache for the given titles.\n\nRequires a POST request if the user is not logged in.",
+       "apihelp-purge-description": "Purge the cache for the given titles.",
        "apihelp-purge-param-forcelinkupdate": "Update the links tables.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Update the links table, and update the links tables for any page that uses this page as a template.",
        "apihelp-purge-example-simple": "Purge the <kbd>Main Page</kbd> and the <kbd>API</kbd> page.",
        "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-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-unblock-example-id": "Unblock block ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Unblock user <kbd>Bob</kbd> with reason <kbd>Sorry Bob</kbd>.",
 
-       "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Title of the page to restore.",
        "apihelp-undelete-param-reason": "Reason for restoring.",
        "apihelp-undelete-param-tags": "Change tags to apply to the entry in the deletion log.",
        "apierror-invalidexpiry": "Invalid expiry time \"$1\".",
        "apierror-invalid-file-key": "Not a valid file key.",
        "apierror-invalidlang": "Invalid language code for parameter <var>$1</var>.",
-       "apierror-invalidoldimage": "The oldimage parameter has invalid format.",
+       "apierror-invalidoldimage": "The <var>oldimage</var> parameter has an invalid format.",
        "apierror-invalidparammix-cannotusewith": "The <kbd>$1</kbd> parameter cannot be used with <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "The <kbd>$1</kbd> parameter may only be used with <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> cannot be combined with the <var>oldid</var>, <var>pageid</var> or <var>page</var> parameters. Please use <var>title</var> and <var>text</var>.",
        "apierror-invalidparammix": "The {{PLURAL:$2|parameters}} $1 can not be used together.",
-       "apierror-invalidsection": "The section parameter must be a valid section ID or <kbd>new</kbd>.",
+       "apierror-invalidsection": "The <var>section</var> parameter must be a valid section ID or <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "The SHA1Base36 hash provided is not valid.",
        "apierror-invalidsha1hash": "The SHA1 hash provided is not valid.",
        "apierror-invalidtitle": "Bad title \"$1\".",
        "apiwarn-redirectsandrevids": "Redirect resolution cannot be used together with the <var>revids</var> parameter. Any redirects the <var>revids</var> point to have not been resolved.",
        "apiwarn-tokennotallowed": "Action \"$1\" is not allowed for the current user.",
        "apiwarn-tokens-origin": "Tokens may not be obtained when the same-origin policy is not applied.",
-       "apiwarn-toomanyvalues": "Too many values supplied for parameter <var>$1</var>: the limit is $2.",
+       "apiwarn-toomanyvalues": "Too many values supplied for parameter <var>$1</var>. The limit is $2.",
        "apiwarn-truncatedresult": "This result was truncated because it would otherwise be larger than the limit of $1 bytes.",
-       "apiwarn-unclearnowtimestamp": "Passing \"$2\" for timestamp parameter <var>$1</var> has been deprecated. If for some reason you need to explicitly specify the current time without calculating it client-side, use <kbd>now<kbd>.",
+       "apiwarn-unclearnowtimestamp": "Passing \"$2\" for timestamp parameter <var>$1</var> has been deprecated. If for some reason you need to explicitly specify the current time without calculating it client-side, use <kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "Unrecognized {{PLURAL:$3|value|values}} for parameter <var>$1</var>: $2.",
        "apiwarn-unsupportedarray": "Parameter <var>$1</var> uses unsupported PHP array syntax.",
        "apiwarn-urlparamwidth": "Ignoring width value set in <var>$1urlparam</var> ($2) in favor of width value derived from <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
index d411279..a2fbb48 100644 (file)
        "apihelp-protect-example-protect": "Proteger una página",
        "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd> («todos», es decir, cualquier usuario puede realizar la acción).",
        "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.",
-       "apihelp-purge-description": "Purgar la caché de los títulos proporcionados.\n\nSe requiere una solicitud POST si el usuario no ha iniciado sesión.",
+       "apihelp-purge-description": "Purgar la caché de los títulos proporcionados.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar las tablas de enlaces.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar la tabla de enlaces y todas las tablas de enlaces de cualquier página que use esta página como una plantilla.",
        "apihelp-purge-example-simple": "Purgar la <kbd>Main Page</kbd> y la página <kbd>API</kbd>.",
        "apihelp-query+backlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+backlinks-param-filterredir": "Cómo filtrar redirecciones. Si se establece a <kbd>nonredirects</kbd> cuando está activo <var>$1redirect</var>, esto sólo se aplica al segundo nivel.",
        "apihelp-query+backlinks-param-limit": "Cuántas páginas en total se devolverán. Si está activo <var>$1redirect</var>, el límite aplica a cada nivel por separado (lo que significa que se pueden devolver hasta 2 * <var>$1limit</var> resultados).",
+       "apihelp-query+backlinks-param-redirect": "Si la página con el enlace es una redirección, encontrar también las páginas que enlacen a esa redirección. El límite máximo se reduce a la mitad.",
        "apihelp-query+backlinks-example-simple": "Mostrar enlaces a <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obtener información acerca de las páginas enlazadas a <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Listar todos los usuarios y direcciones IP bloqueadas.",
        "apihelp-query+imageinfo-param-start": "Marca de tiempo por la que empezar la enumeración.",
        "apihelp-query+imageinfo-param-end": "Marca de tiempo por la que terminar la enumeración.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
+       "apihelp-query+imageinfo-param-metadataversion": "Versión de los metadatos que se utilizará. Si se especifica <kbd>latest</kbd>, utilizará la última versión. El valor predeterminado es <kbd>1</kbd>, por motivo de retrocompatibilidad.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Si se especifica y no vacío, sólo estas claves serán devueltos por $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Un controlador específico de la cadena de parámetro. Por ejemplo, los archivos Pdf pueden utilizar <kbd>page15-100px</kbd>. <var>$1urlwidth</var> debe ser utilizado y debe ser consistente con <var>$1urlparam</var>.",
        "apihelp-query+imageinfo-param-localonly": "Buscar solo archivos en el repositorio local.",
        "apihelp-query+imageusage-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+imageusage-param-filterredir": "Cómo filtrar las redirecciones. Si se establece a no redirecciones cuando está habilitado $1redirect, esto solo se aplica al segundo nivel.",
        "apihelp-query+imageusage-param-limit": "Número de páginas que devolver. Si está habilitado <var>$1redirect</var>, el límite se aplica a cada nivel de forma separada (es decir, se pueden devolver hasta 2 * <var>$1limit</var>).",
+       "apihelp-query+imageusage-param-redirect": "Si la página con el enlace es una redirección, encontrar también las páginas que enlacen a esa redirección. El límite máximo se reduce a la mitad.",
        "apihelp-query+imageusage-example-simple": "Mostrar las páginas que usan [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageusage-example-generator": "Obtener información sobre las páginas que empleen [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-description": "Obtener información básica de la página.",
        "apihelp-query+logevents-paramvalue-prop-details": "Muestra detalles adicionales sobre el evento del registro.",
        "apihelp-query+logevents-paramvalue-prop-tags": "Muestra las etiquetas para el evento del registro.",
        "apihelp-query+logevents-param-type": "Filtrar las entradas del registro solo a este tipo.",
+       "apihelp-query+logevents-param-action": "Filtrar las acciones del registro solo a esta acción. Reemplaza <var>$1type</var>. En la lista de valores posibles, los valores con el asterisco como carácter comodín tales como <kbd>action/*</kbd> pueden tener distintas cadenas después de la barra (/).",
        "apihelp-query+logevents-param-start": "Marca de tiempo por la que empezar la enumeración.",
        "apihelp-query+logevents-param-end": "Marca de tiempo por la que terminar la enumeración.",
        "apihelp-query+logevents-param-user": "Filtrar entradas a aquellas realizadas por el usuario dado.",
        "apihelp-query+recentchanges-param-limit": "Cuántos cambios en total se devolverán.",
        "apihelp-query+recentchanges-param-type": "Cuántos tipos de cambios se mostrarán.",
        "apihelp-query+recentchanges-param-toponly": "Enumerar solo las modificaciones que sean las últimas revisiones.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Cuando se utilice como generador, genera identificadores de revisión en lugar de títulos. Las entradas en la lista de cambios recientes que no tengan identificador de revisión asociado (por ejemplo, la mayoría de las entradas de registro) no generarán nada.",
        "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
        "apihelp-query+recentchanges-example-generator": "Obtener información de página de cambios recientes no patrullados.",
        "apihelp-query+redirects-description": "Devuelve todas las redirecciones a las páginas dadas.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devuelve los valores predeterminados de las preferencias del usuario.",
        "apihelp-query+siteinfo-param-filteriw": "Devuelve solo entradas locales o solo entradas no locales del mapa interwiki.",
        "apihelp-query+siteinfo-param-numberingroup": "Muestra el número de usuarios en los grupos de usuarios.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "Código de idioma para los nombres localizados de los idiomas (en el mejor intento posible) y apariencias.",
        "apihelp-query+siteinfo-example-simple": "Obtener información del sitio.",
        "apihelp-query+siteinfo-example-interwiki": "Obtener una lista de prefijos interwiki locales.",
        "apihelp-query+stashimageinfo-description": "Devuelve información del archivo para archivos escondidos.",
        "apihelp-query+tags-paramvalue-prop-name": "Añade el nombre de la etiqueta.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Agrega el mensaje de sistema para la etiqueta.",
        "apihelp-query+tags-paramvalue-prop-description": "Añade la descripción de la etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Añade el número de revisiones y entradas de registro que tienen esta etiqueta.",
        "apihelp-query+tags-paramvalue-prop-defined": "Indicar si la etiqueta está definida.",
        "apihelp-query+tags-paramvalue-prop-source": "Obtiene las fuentes de la etiqueta, que pueden incluir <samp>extension</samp> para etiquetas definidas por extensiones y <samp>manual</samp> para etiquetas que pueden aplicarse manualmente por los usuarios.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la etiqueta aún se sigue aplicando.",
        "apihelp-query+templates-description": "Devuelve todas las páginas transcluidas en las páginas dadas.",
        "apihelp-query+templates-param-namespace": "Mostrar plantillas solamente en estos espacios de nombres.",
        "apihelp-query+templates-param-limit": "Cuántas plantillas se devolverán.",
+       "apihelp-query+templates-param-templates": "Mostrar solo estas plantillas. Útil para comprobar si una determinada página utiliza una determinada plantilla.",
        "apihelp-query+templates-param-dir": "La dirección en que ordenar la lista.",
+       "apihelp-query+templates-example-simple": "Obtener las plantillas que se usan en la página <kbd>Portada</kbd>.",
        "apihelp-query+templates-example-generator": "Obtener información sobre las páginas de las plantillas utilizadas en <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-namespaces": "Obtener las páginas de los espacios de nombres {{ns:user}} y {{ns:template}} que están transcluidas en la página <kbd>Main Page</kbd>.",
        "apihelp-query+transcludedin-description": "Encuentra todas las páginas que transcluyan las páginas dadas.",
        "apihelp-query+transcludedin-example-generator": "Obtener información sobre las páginas que transcluyen <kbd>Main Page</kbd>.",
        "apihelp-query+usercontribs-description": "Obtener todas las ediciones realizadas por un usuario.",
        "apihelp-query+usercontribs-param-limit": "Número máximo de contribuciones que se devolverán.",
+       "apihelp-query+usercontribs-param-user": "Los usuarios para los cuales se desea recuperar las contribuciones. No se puede utilizar junto con <var>$1userids</var> o <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Recuperar las contribuciones de todos los usuarios cuyos nombres comienzan con este valor. No se puede utilizar junto con <var>$1user</var> o <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "Los identificadores de los usuarios para los cuales se desea recuperar las contribuciones. No se puede utilizar junto con <var>$1userids</var> o <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Enumerar solo las contribuciones en estos espacios de nombres.",
        "apihelp-query+usercontribs-param-prop": "Incluir piezas adicionales de información:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Añade el identificador de página y el de revisión.",
        "apihelp-removeauthenticationdata-description": "Elimina los datos de autentificación del usuario actual.",
        "apihelp-removeauthenticationdata-example-simple": "Trata de eliminar los datos del usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Enviar un email de reinicialización de la contraseña a un usuario.",
+       "apihelp-resetpassword-param-user": "Usuario en proceso de reinicialización",
+       "apihelp-resetpassword-param-email": "Dirección de correo electrónico del usuario que se va a reinicializar",
+       "apihelp-resetpassword-example-user": "Enviar un correo de recuperación de contraseña al usuario <kbd>Ejemplo</kbd>.",
+       "apihelp-resetpassword-example-email": "Enviar un correo de recuperación de contraseña para todos los usuarios con dirección de correo electrónico <kbd>usuario@ejemplo.com</kbd>.",
        "apihelp-revisiondelete-description": "Eliminar y restaurar revisiones",
        "apihelp-revisiondelete-param-target": "Título de la página para el borrado de la revisión, en caso de ser necesario para ese tipo.",
        "apihelp-revisiondelete-param-ids": "Identificadores de las revisiones para borrar.",
        "apihelp-rsd-description": "Exportar un esquema RSD (Really Simple Discovery; Descubrimiento Muy Simple).",
        "apihelp-rsd-example-simple": "Exportar el esquema RSD.",
        "apihelp-setnotificationtimestamp-description": "Actualizar la marca de tiempo de notificación de las páginas en la lista de seguimiento.\n\nEsto afecta a la función de resaltado de las páginas modificadas en la lista de seguimiento y al envío de correo electrónico cuando la preferencia \"{{int:tog-enotifwatchlistpages}}\" está habilitada.",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "Trabajar en todas las páginas en seguimiento.",
        "apihelp-setnotificationtimestamp-param-timestamp": "Marca de tiempo en la que fijar la marca de tiempo de notificación.",
        "apihelp-setnotificationtimestamp-param-torevid": "Revisión a la que fijar la marca de tiempo de notificación (una sola página).",
        "apihelp-setnotificationtimestamp-param-newerthanrevid": "Revisión a la que fijar la marca de tiempo de notificación más reciente (una sola página).",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
        "apihelp-tag-example-log": "Eliminar la etiqueta <kbd>spam</kbd> de la entrada del registro con identificador 123 con el motivo <kbd>Wrongly applied</kbd>",
        "apihelp-unblock-description": "Desbloquear un usuario.",
+       "apihelp-unblock-param-id": "Identificador del bloqueo que se desea desbloquear (obtenido mediante <kbd>list=blocks</kbd>). No se puede usar junto con with <var>$1user</var> o <var>$1userid</var>.",
        "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var> o <var>$1userid</var>.",
        "apihelp-unblock-param-userid": "ID de usuario que desbloquear. No se puede utilizar junto con <var>$1id</var> o <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
        "apihelp-undelete-param-title": "Título de la página que restaurar.",
        "apihelp-undelete-param-reason": "Motivo de la restauración.",
        "apihelp-undelete-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de borrados.",
+       "apihelp-undelete-param-timestamps": "Marcas de tiempo de las revisiones que se desea restaurar. Si tanto <var>$1timestamps</var> como <var>$1fileids</var> están vacíos, se restaurarán todas.",
+       "apihelp-undelete-param-fileids": "Identificadores de las revisiones que se desea restaurar. Si tanto <var>$1timestamps</var> como <var>$1fileids</var> están vacíos, se restaurarán todas.",
        "apihelp-undelete-example-page": "Restaurar la página <kbd>Main page</kbd>.",
        "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Main Page</kbd>.",
        "apihelp-upload-param-filename": "Nombre del archivo de destino.",
        "apihelp-upload-param-chunk": "Contenido del fragmento.",
        "apihelp-upload-param-async": "Realizar de forma asíncrona las operaciones de archivo potencialmente grandes cuando sea posible.",
        "apihelp-upload-example-url": "Subir desde una URL.",
+       "apihelp-upload-example-filekey": "Completar una subida que falló debido a advertencias.",
        "apihelp-userrights-description": "Cambiar la pertenencia a grupos de un usuario.",
        "apihelp-userrights-param-user": "Nombre de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
-       "apihelp-userrights-param-add": "Agregar el usuario a estos grupos.",
+       "apihelp-userrights-param-add": "Agregar el usuario a estos grupos, o, si ya es miembro, actualizar la fecha de expiración de su pertenencia a ese grupo.",
+       "apihelp-userrights-param-expiry": "Marcas de tiempo de expiración. Pueden ser relativas (por ejemplo, <kbd>5 months</kbd> o <kbd>2 weeks</kbd>) o absolutas (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si sólo se fija una marca de tiempo, se utilizará para todos los grupos que se pasen al parámetro <var>$1añadir</var>. Usa <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, o <kbd>never</kbd> para que la pertenencia al grupo no tenga fecha de expiración.",
        "apihelp-userrights-param-remove": "Eliminar el usuario de estos grupos.",
        "apihelp-userrights-param-reason": "Motivo del cambio.",
        "apihelp-userrights-param-tags": "Cambia las etiquetas que aplicar a la entrada del registro de derechos del usuario.",
        "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Añade el usuario con identificador <kbd>123</kbd> al grupo <kbd>bot</kbd>, y lo borra de los grupos <kbd>sysop</kbd> y <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "Añadir al usuario <kbd>SometimeSysop</kbd> al grupo <kbd>sysop</kbd> por 1 mes.",
        "apihelp-validatepassword-description": "Valida una contraseña contra las políticas de contraseñas del wiki.\n\nLa validez es <samp>Good</samp> si la contraseña es aceptable, <samp>Change</samp> y la contraseña se puede usar para iniciar sesión pero debe cambiarse o <samp>Invalid</samp> si la contraseña no se puede usar.",
        "apihelp-validatepassword-param-password": "Contraseña para validar.",
        "apihelp-validatepassword-param-user": "Nombre de usuario, para pruebas de creación de cuentas. El usuario nombrado no debe existir.",
        "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Seguir las primeras páginas del espacio de nombres principal.",
        "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.",
+       "apihelp-format-param-wrappedhtml": "Devolver el HTML con resaltado sintáctico y los módulos ResourceLoader asociados en forma de objeto JSON.",
        "apihelp-json-description": "Extraer los datos de salida en formato JSON.",
        "apihelp-json-param-callback": "Si se especifica, envuelve la salida dentro de una llamada a una función dada. Por motivos de seguridad, cualquier dato específico del usuario estará restringido.",
        "apihelp-json-param-utf8": "Si se especifica, codifica la mayoría (pero no todos) de los caracteres no pertenecientes a ASCII como UTF-8 en lugar de reemplazarlos por secuencias de escape hexadecimal. Toma el comportamiento por defecto si <var>formatversion</var> no es <kbd>1</kbd>.",
        "apihelp-json-param-ascii": "Si se especifica, codifica todos los caracteres no pertenecientes a ASCII mediante secuencias de escape hexadecimal. Toma el comportamiento por defecto si <var>formatversion</var> no es <kbd>1</kbd>.",
        "apihelp-json-param-formatversion": "Formato de salida:\n;1: Formato retrocompatible (booleanos con estilo XML, claves <samp>*</samp> para nodos de contenido, etc.).\n;2: Formato moderno experimental. ¡Atención, las especificaciones pueden cambiar!\n;latest: Utiliza el último formato (actualmente <kbd>2</kbd>). Puede cambiar sin aviso.",
+       "apihelp-jsonfm-description": "Producir los datos de salida en formato JSON (con resaltado sintáctico en HTML).",
        "apihelp-none-description": "No extraer nada.",
        "apihelp-php-description": "Extraer los datos de salida en formato serializado PHP.",
+       "apihelp-php-param-formatversion": "Formato de salida:\n;1: Formato retrocompatible (booleanos con estilo XML, claves <samp>*</samp> para nodos de contenido, etc.).\n;2: Formato moderno experimental. ¡Atención, las especificaciones pueden cambiar!\n;latest: Utilizar el último formato (actualmente <kbd>2</kbd>). Puede cambiar sin aviso.",
+       "apihelp-phpfm-description": "Producir los datos de salida en formato PHP serializado (con resaltado sintáctico en HTML).",
        "apihelp-rawfm-description": "Extraer los datos de salida, incluidos los elementos de depuración, en formato JSON (embellecido en HTML).",
+       "apihelp-xml-description": "Producir los datos de salida en formato XML.",
        "apihelp-xml-param-xslt": "Si se especifica, añade la página nombrada como una hoja de estilo XSL. El valor debe ser un título en el espacio de nombres {{ns:MediaWiki}} que termine en <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si se especifica, añade un espacio de nombres XML.",
+       "apihelp-xmlfm-description": "Producir los datos de salida en formato XML (con resaltado sintáctico en HTML).",
        "api-format-title": "Resultado de la API de MediaWiki",
        "api-format-prettyprint-header": "Esta es la representación en HTML del formato $1. HTML es adecuado para realizar tareas de depuración, pero no para utilizarlo en aplicaciones.\n\nUtiliza el parámetro <var>format</var> para modificar el formato de salida. Para ver la representación no HTML del formato $1, emplea <kbd>format=$2</kbd>.\n\nPara obtener más información, consulta la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].",
+       "api-format-prettyprint-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.",
        "api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.",
+       "api-pageset-param-titles": "Una lista de títulos en los que trabajar.",
+       "api-pageset-param-pageids": "Una lista de identificadores de páginas en las que trabajar.",
+       "api-pageset-param-revids": "Una lista de identificadores de revisiones en las que trabajar.",
+       "api-pageset-param-generator": "Obtener la lista de páginas en las que trabajar mediante la ejecución del módulo de consulta especificado.\n\n<strong>Nota:</strong> Los nombres de los parámetros del generador deben prefijarse con una «g», véanse los ejemplos.",
+       "api-pageset-param-redirects-generator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var>, y <var>$1revids</var> y en las páginas devueltas por <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var> y <var>$1revids</var>.",
+       "api-pageset-param-converttitles": "Convertir los títulos a otras variantes, si es necesario. Solo funciona si el idioma del contenido del wiki admite la conversión entre variantes. La conversión entre variantes está habilitada en idiomas tales como $1.",
        "api-help-title": "Ayuda de la API de MediaWiki",
        "api-help-lead": "Esta es una página de documentación autogenerada de la API de MediaWiki.\n\nDocumentación y ejemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-param-deprecated": "En desuso.",
        "api-help-param-required": "Este parámetro es obligatorio.",
        "api-help-datatypes-header": "Tipos de datos",
-       "api-help-datatypes": "Algunos tipos de parámetros en las solicitudes de API necesita más explicación:\n;boolean\n:Los parámetros booleanos trabajo como HTML casillas de verificación: si el parámetro se especifica, independientemente de su valor, se considera verdadero. Para un valor false, se omite el parámetro completo.\n;marca de tiempo\n:Las marcas de tiempo se puede especificar en varios formatos. ISO 8601 la fecha y la hora se recomienda. Todas las horas están en UTC, la inclusión de la zona horaria es ignorado.\n:* ISO 8601 la fecha y la hora, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (signos de puntuación y <kbd>Z</kbd> son opcionales)\n:* ISO 8601 la fecha y la hora (se omite) fracciones de segundos, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (guiones, dos puntos, y, <kbd>Z</kbd> son opcionales)\n:* MediaWiki formato, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Genérico formato numérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (opcional en la zona horaria de <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, o <kbd>-<var>##</var></kbd> se omite)\n:* El formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (zona horaria se puede omitir), <kbd><var>Mon</var>, <var>15</var> <var>Ene</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (zona horaria se puede omitir), <kbd><var>lunes</var>, <var>15</var>-<var>Ene</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime formato, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>de 2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como la 1 a la 13 dígito entero (excepto <kbd>0</kbd>)\n:* La cadena de <kbd>ahora</kbd>",
+       "api-help-datatypes": "Las entradas en MediaWiki deberían estar en UTF-8 según la norma NFC. MediaWiki puede tratar de convertir otros formatos, pero esto puede provocar errores en algunas operaciones (tales como las [[Special:ApiHelp/edit|ediciones]] con controles MD5).\n\nAlgunos tipos de parámetros en las solicitudes de API requieren de una explicación más detallada:\n;boolean\n:Los parámetros booleanos trabajo como cajas de verificación de HTML: si el parámetro está definido, independientemente de su valor, se considera verdadero. Para un valor falso, se debe omitir el parámetro  por completo.\n;marca de tiempo\n:Las marcas de tiempo se pueden definir en varios formatos. Se recomienda seguir la norma ISO 8601 de fecha y hora. Todas las horas están en UTC, ignorándose cualquier indicación de zona horaria.\n:* Fecha y hora en ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (los signos de puntuación y la <kbd>Z</kbd> son opcionales)\n:* Fecha y hora en ISO 8601 con fracciones de segundo (que se omiten), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (los guiones, los dos puntos y la <kbd>Z</kbd> son opcionales)\n:* Formato MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato genérico de número, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (la zona horaria opcional, sea <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> o <kbd>-<var>##</var></kbd> se omite)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (la zona horaria es opcional), <kbd><var>lun</var>, <var>15</var> <var>ene</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (la zona horaria es opcional), <kbd><var>lunes</var>, <var>15</var>-<var>ene</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato ctime de C, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Número de segundos desde 1970-01-01T00:00:00Z en forma de número entero de entre 1 y 13 cifras (sin <kbd>0</kbd>)\n:* La cadena <kbd>now</kbd>\n\n;separador alternativo de valores múltiples\n:Los parámetros que toman valores múltiples se envían normalmente utilizando la barra vertical para separar los valores, p. ej., <kbd>param=valor1|valor2</kbd> o <kbd>param=valor1%7Cvalor2</kbd>. Si un valor tiene que contener el carácter de barra vertical, utiliza U+001F (separador de unidades) como separador ''y'' prefija el valor con, p. ej. <kbd>param=%1Fvalor1%1Fvalor2</kbd>.",
        "api-help-param-type-limit": "Tipo: entero o <kbd>max</kbd>",
        "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=entero|2=lista de enteros}}",
        "api-help-param-type-boolean": "Tipo: booleano/lógico ([[Special:ApiHelp/main#main/datatypes|detalles]])",
        "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=timestamp|2=lista de timestamps}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nombre de usuario|2=lista de nombres de usuarios}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Uno de los siguientes valores|2=Valores (separados por <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Uno de los siguientes valores|2=Valores (separados por <kbd>{{!}}</kbd> u [[Special:ApiHelp/main#main/datatypes|otro separador]])}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Debe estar vacío|Puede estar vacío, o $2}}",
        "api-help-param-limit": "No se permite más de $1.",
        "api-help-param-limit2": "No se permite más de $1 ($2 para los bots).",
        "api-help-param-default-empty": "Predeterminado: <span class=\"apihelp-empty\">(vacío)</span>",
        "api-help-param-disabled-in-miser-mode": "Deshabilitado debido al [[mw:Manual:$wgMiserMode|modo avaro]].",
        "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido al [[mw:Manual:$wgMiserMode|modo avaro]], usar esto puede dar lugar a que se devuelvan menos de <var>$1limit</var> antes de continuar. En casos extremos, podrían devolverse cero resultados.",
+       "api-help-param-direction": "En qué sentido hacer la enumeración:\n;newer: De más antiguos a más recientes. Nota: $1start debe ser anterior a $1end.\n;older: De más recientes a más antiguos (orden predefinido). Nota: $1start debe ser posterior a $1end.",
        "api-help-param-continue": "Cuando haya más resultados disponibles, utiliza esto para continuar.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sin descripción)</span>",
        "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:",
        "api-help-permissions": "{{PLURAL:$1|Permiso|Permisos}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedido a|Concedidos a}}: $2",
+       "api-help-right-apihighlimits": "Usa límites más altos para consultas a través de la API (consultas lentas: $1; consultas rápidas: $2). Los límites para las consultas lentas también se aplican a los parámetros multivalorados.",
        "api-help-open-in-apisandbox": "<small>[abrir en la zona de pruebas]</small>",
        "api-help-authmanagerhelper-messageformat": "Formato utilizado para los mensajes devueltos.",
+       "api-help-authmanagerhelper-mergerequestfields": "Combinar la información de los campos para todas las peticiones de autentificación en una matriz.",
        "api-help-authmanagerhelper-preservestate": "Preservar el estado de un intento fallido anterior de inicio de sesión, si es posible.",
+       "apierror-allimages-redirect": "Usar <kbd>gaifilterredir=nonredirects</kbd> en lugar de <var>redirects</var> cuando se use <kbd>allimages</kbd> como generador.",
+       "apierror-allpages-generator-redirects": "Usar <kbd>gaifilterredir=nonredirects</kbd> en lugar de <var>redirects</var> cuando se use <kbd>allpages</kbd> como generador.",
+       "apierror-appendnotsupported": "No se puede añadir a las páginas que utilizan el modelo de contenido $1.",
        "apierror-articleexists": "El artículo que intentaste crear ya estaba creado.",
        "apierror-assertbotfailed": "La aserción de que el usuario tiene el derecho <code>bot</code> falló.",
        "apierror-assertnameduserfailed": "La aserción de que el usuario es «$1» falló.",
        "apierror-assertuserfailed": "La aserción de que el usuario está conectado falló.",
        "apierror-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
        "apierror-badconfig-resulttoosmall": "El valor de <code>$wgAPIMaxResultSize</code> en este wiki es demasiado pequeño como para contener información básica de resultados.",
+       "apierror-badcontinue": "Parámetro continue no válido. Debes pasar el valor original devuelto por la consulta anterior.",
        "apierror-baddiff": "La comparación no puede recuperarse. Una o ambas revisiones no existen o no tienes permiso para verlas.",
+       "apierror-baddiffto": "<var>$1diffto</var> debe fijarse a un número no negativo, <kbd>prev</kbd>, <kbd>next</kbd> or <kbd>cur</kbd>.",
        "apierror-badformat-generic": "El formato solicitado $1 no es compatible con el modelo de contenido $2.",
        "apierror-badformat": "El formato solicitado $1 no es compatible con el modelo de contenido $2 utilizado por $3.",
        "apierror-badgenerator-notgenerator": "El módulo <kbd>$1</kbd> no puede utilizarse como un generador.",
        "apierror-badparameter": "Valor no válido para el parámetro <var>$1</var>.",
        "apierror-badquery": "La consulta no es válida.",
        "apierror-badtimestamp": "Valor no válido \"$2\" para el parámetro de marca de tiempo <var>$1</var>.",
+       "apierror-badupload": "El parámetro de subida de archivo <var>$1</var> no es una subida de archivo. Asegúrate de usar <code>multipart/form-data</code> para tu POST e introduce un nombre de archivo en la cabecera <code>Content-Disposition</code>.",
        "apierror-badurl": "Valor no válido \"$2\" para el parámetro de URL <var>$1</var>.",
        "apierror-baduser": "Valor no válido \"$2\" para el parámetro de usuario <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "El separador multivalor U+001F solo se puede utilizar en parámetros multivalorados.",
        "apierror-blockedfrommail": "Se te ha bloqueado de enviar email.",
        "apierror-blocked": "Se te ha bloqueado de editar.",
+       "apierror-botsnotsupported": "Esta interfaz no está disponible para bots.",
        "apierror-cannotreauthenticate": "Esta acción no está disponible, ya que tu identidad no se puede verificar.",
        "apierror-cannotviewtitle": "No tienes permiso para ver $1.",
        "apierror-cantblock-email": "No tienes permiso para bloquear a los usuarios el envío de correo electrónico a través de la wiki.",
        "apierror-cantsend": "No estás conectado, no tienes una dirección de correo electrónico confirmada o no tienes permiso para enviar correo electrónico a otros usuarios, así que no puedes enviar correo electrónico.",
        "apierror-cantundelete": "No se ha podido restaurar: puede que las revisiones solicitadas no existan o que ya se hayan restaurado.",
        "apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.",
+       "apierror-compare-inputneeded": "Se necesita un título, un identificador de página o un número de revisión tanto para el parámetro <var>from</var> como para el parámetro <var>to</var>.",
        "apierror-contentserializationexception": "La serialización de contenido falló: $1",
+       "apierror-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobytes|kilobytes}}.",
        "apierror-create-titleexists": "Los títulos existentes no se pueden proteger con <kbd>create</kbd>.",
+       "apierror-csp-report": "Error de procesamiento del informe CSP: $1.",
        "apierror-databaseerror": "[$1] Error en la consulta de la base de datos.",
        "apierror-deletedrevs-param-not-1-2": "El parámetro <var>$1</var> no se puede utilizar en los modos 1 o 2.",
        "apierror-deletedrevs-param-not-3": "El parámetro <var>$1</var> no se puede usar en modo 3.",
        "apierror-invalidparammix-mustusewith": "El parámetro <kbd>$1</kbd> solo se puede utilizar junto con <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> no se puede combinar con los parámetros <var>oldid</var>, <var>pageid</var> y <var>page</var>. Por favor, utiliza <var>title</var> y <var>text</var>.",
        "apierror-invalidparammix": "{{PLURAL:$2|Los parámetros}} $1 no se pueden utilizar juntos.",
-       "apierror-invalidsection": "El parámetro de sección debe ser un ID de sección válido, o bien <kbd>new</kbd>.",
+       "apierror-invalidsection": "El parámetro <var>section</var> debe ser un identificador de sección válido, o bien <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "El hash SHA1Base36 proporcionado no es válido.",
        "apierror-invalidsha1hash": "El hash SHA1 proporcionado no es válido.",
        "apierror-invalidtitle": "Título incorrecto \"$1\".",
        "apierror-mustbeloggedin-removeauth": "Debes estar conectado para borrar datos de autentificación.",
        "apierror-mustbeloggedin": "Debes estar conectado para $1.",
        "apierror-mustbeposted": "El módulo <kbd>$1</kbd> requiere una petición POST.",
+       "apierror-mustpostparams": "Se {{PLURAL:$2|encontró el siguiente parámetro|encontraron los siguientes parámetros}} en la cadena de la consulta, pero deben estar en el cuerpo del POST: $1.",
+       "apierror-noapiwrite": "La edición de este wiki a través de la API está deshabilitada. Asegúrate de que la declaración <code>$wgEnableWriteAPI=true;</code> está incluida en el archivo <code>LocalSettings.php</code> del wiki.",
        "apierror-nochanges": "No se solicitó ningún cambio.",
+       "apierror-nodeleteablefile": "No existe tal versión antigua del archivo.",
+       "apierror-no-direct-editing": "La edición directa a través de la API no es compatible con el modelo de contenido $1 utilizado por $2.",
        "apierror-noedit-anon": "Los usuarios anónimos no pueden editar páginas.",
        "apierror-noedit": "No tienes permiso para editar páginas.",
        "apierror-noimageredirect-anon": "Los usuarios anónimos no pueden crear redirecciones de imágenes.",
        "apierror-pagedeleted": "La página ha sido borrada en algún momento desde que obtuviste su marca de tiempo.",
        "apierror-pagelang-disabled": "En este wiki no se puede cambiar el idioma de una página.",
        "apierror-paramempty": "El parámetro <var>$1</var> no puede estar vacío.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> solo es compatible con el contenido en wikitexto.",
        "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.",
        "apierror-permissiondenied": "No tienes permiso para $1.",
        "apierror-permissiondenied-generic": "Permiso denegado.",
        "apierror-permissiondenied-unblock": "No tienes permiso para desbloquear usuarios.",
+       "apierror-prefixsearchdisabled": "La búsqueda por prefijo está deshabilitada en el modo avaro.",
        "apierror-promised-nonwrite-api": "La cabecera HTTP <code>Promise-Non-Write-API-Action</code> no se puede enviar a módulos de la API en modo escritura.",
        "apierror-protect-invalidaction": "Tipo de protección «$1» no válido.",
        "apierror-protect-invalidlevel": "Nivel de protección «$1» no válido.",
        "apierror-readapidenied": "Necesitas permiso de lectura para utilizar este módulo.",
        "apierror-readonly": "El wiki está actualmente en modo de solo lectura.",
        "apierror-reauthenticate": "No te has autentificado recientemente en esta sesión. Por favor, vuelve a autentificarte.",
+       "apierror-revdel-mutuallyexclusive": "No se puede usar el mismo campo en <var>hide</var> y <var>show</var>.",
        "apierror-revdel-paramneeded": "Se requiere al menos un valor para <var>hide</var> y/o <var>show</var>.",
+       "apierror-revisions-norevids": "El parámetro <var>revids</var> no se puede utilizar junto con las opciones de lista (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> y <var>$1end</var>).",
+       "apierror-revisions-singlepage": "Se utilizó <var>titles</var>, <var>pageids</var> o un generador para proporcionar múltiples páginas, pero los parámetros <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> y <var>$1end</var> solo se pueden utilizar en una sola página.",
        "apierror-revwrongpage": "r$1 no es una revisión de $2.",
+       "apierror-sectionreplacefailed": "No se ha podido combinar la sección actualizada.",
        "apierror-sectionsnotsupported": "Las secciones no son compatibles con el modelo de contenido $1.",
        "apierror-sectionsnotsupported-what": "Las secciones no son compatibles con $1.",
        "apierror-show": "Parámetro incorrecto: no se pueden proporcionar valores mutuamente excluyentes.",
+       "apierror-siteinfo-includealldenied": "No se puede ver la información de todos los servidores a menos que <var>$wgShowHostNames</var> tenga valor verdadero.",
        "apierror-sizediffdisabled": "La diferencia de tamaño está deshabilitada en el modo avaro.",
        "apierror-spamdetected": "Tu edición fue rechazada por contener un fragmento de spam: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "No tienes permiso para ver los resultados de esta página especial.",
        "apierror-systemblocked": "Has sido bloqueado automáticamente por el software MediaWiki.",
        "apierror-templateexpansion-notwikitext": "La expansión de plantillas solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.",
        "apierror-unknownaction": "La acción especificada, <kbd>$1</kbd>, no está reconocida.",
+       "apierror-unknownerror-editpage": "Error de EditPage desconocido: $1.",
        "apierror-unknownerror-nocode": "Error desconocido.",
        "apierror-unknownerror": "Error desconocido: «$1»",
        "apierror-unknownformat": "Formato no reconocido «$1».",
        "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro no reconocido|Parámetros no reconocidos}}: $1.",
        "apierror-unrecognizedvalue": "Valor no reconocido para el parámetro <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "El repositorio local de archivos no permite consultar todas las imágenes.",
        "apierror-urlparamnormal": "No se pudieron normalizar los parámetros de imagen de $1.",
        "apierror-writeapidenied": "No tienes permiso para editar este wiki a través de la API.",
        "apiwarn-alldeletedrevisions-performance": "Para conseguir un mejor rendimiento a la hora de generar títulos, establece <kbd>$1dir=newer</kbd>.",
        "apiwarn-badurlparam": "No se pudo analizar <var>$1urlparam</var> para $2. Se utilizarán solamente la anchura y altura.",
        "apiwarn-badutf8": "El valor pasado para <var>$1</var> contiene datos no válidos o no normalizados. Los datos textuales deberían estar en Unicode válido, normalizado en NFC y sin caracteres de control C0 excepto HT (\\t), LF (\\n) y CR (\\r).",
        "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>prop=deletedrevisions</kbd> o <kbd>list=alldeletedrevisions</kbd>.",
+       "apiwarn-deprecation-expandtemplates-prop": "Como no se ha especificado ningún valor para el parámetro <var>prop</var>, se ha utilizado un formato heredado para la salida. Este formato está en desuso y, en el futuro, el parámetro <var>prop</var> tendrá un valor predeterminado, de forma que siempre se utilizará el formato nuevo.",
        "apiwarn-deprecation-httpsexpected": "Se ha utilizado HTTP cuando se esperaba HTTPS.",
+       "apiwarn-deprecation-login-botpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para proseguir el inicio de sesión mediante <kbd>action=login</kbd>, véase [[Special:BotPasswords]]. Para proseguir el inicio de sesión con la cuenta principal de forma segura, véase <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "El inicio de sesión con la cuenta principal mediante <kbd>action=login</kbd> está en desuso y puede dejar de funcionar sin aviso previo. Para iniciar sesión de forma segura, véase <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-parameter": "El parámetro <var>$1</var> ha quedado obsoleto.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está en desuso desde MediaWiki 1.28. Usa <kbd>prop=headhtml</kbd> cuando crees nuevos documentos HTML, o <kbd>prop=módulos|jsconfigvars</kbd> cuando actualices un documento en el lado del cliente.",
        "apiwarn-deprecation-purge-get": "El uso de <kbd>action=purge</kbd> mediante GET está obsoleto. Usa POST en su lugar.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> ha quedado obsoleto. En su lugar, utiliza <kbd>$2</kbd>.",
        "apiwarn-invalidcategory": "\"$1\" no es una categoría.",
        "apiwarn-invalidxmlstylesheetext": "Las hojas de estilo deben tener la extensión <code>.xsl</code>.",
        "apiwarn-invalidxmlstylesheet": "La hoja de estilos especificada no es válida o no existe.",
        "apiwarn-invalidxmlstylesheetns": "La hoja de estilos debería estar en el espacio de nombres {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "La propiedad <kbd>modules</kbd> está definida, pero no lo está <kbd>jsconfigvars</kbd> ni <kbd>encodedjsconfigvars</kbd>. Las variables de configuración son necesarias para el correcto uso del módulo.",
        "apiwarn-notfile": "\"$1\" no es un archivo.",
        "apiwarn-parse-nocontentmodel": "No se proporcionó <var>title</var> ni <var>contentmodel</var>. Se asume $1.",
        "apiwarn-tokennotallowed": "La acción «$1» no está permitida para el usuario actual.",
index 3f8fa9d..da85e64 100644 (file)
        "apihelp-edit-param-watch": "Ajouter la page à la liste de suivi de l'utilisateur actuel.",
        "apihelp-edit-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
        "apihelp-edit-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
-       "apihelp-edit-param-md5": "Le hachage MD5 du paramètre $1text, ou les paramètres $1prependtext et $1appendtext concaténés. Si défini, la modification ne sera pas effectuée à moins que le hachage ne soit correct.",
+       "apihelp-edit-param-md5": "Le hachage MD5 du paramètre $1text, ou les paramètres $1prependtext et $1appendtext concaténés. Si défini, la modification ne sera pas effectuée sauf si le hachage est correct.",
        "apihelp-edit-param-prependtext": "Ajouter ce texte au début de la page. Écrase $1text.",
        "apihelp-edit-param-appendtext": "Ajouter ce texte à la fin de la page. Écrase $1text.\n\nUtiliser $1section=new pour ajouter une nouvelle section, plutôt que ce paramètre.",
        "apihelp-edit-param-undo": "Annuler cette révision. Écrase $1text, $1prependtext et $1appendtext.",
        "apihelp-feedrecentchanges-param-from": "Afficher les modifications depuis lors.",
        "apihelp-feedrecentchanges-param-hideminor": "Masquer les modifications mineures.",
        "apihelp-feedrecentchanges-param-hidebots": "Masquer les modifications faites par des robots.",
-       "apihelp-feedrecentchanges-param-hideanons": "Masquer les modifications faites par des utilisateurs anonymes.",
-       "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par des utilisateurs enregistrés.",
+       "apihelp-feedrecentchanges-param-hideanons": "Masquer les modifications faites par les utilisateurs anonymes.",
+       "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par les utilisateurs enregistrés.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Masquer les modifications contrôlées.",
        "apihelp-feedrecentchanges-param-hidemyself": "Masquer les modifications faites par l'utilisateur actuel.",
        "apihelp-feedrecentchanges-param-hidecategorization": "Masquer les changements de la catégorie d'appartenance.",
        "apihelp-feedwatchlist-description": "Renvoie un flux de liste de suivi.",
        "apihelp-feedwatchlist-param-feedformat": "Le format du flux.",
        "apihelp-feedwatchlist-param-hours": "Lister les pages modifiées lors de ce nombre d’heures depuis maintenant.",
-       "apihelp-feedwatchlist-param-linktosections": "Lier directement pour modifier les sections si possible.",
+       "apihelp-feedwatchlist-param-linktosections": "Lier directement vers les sections modifées si possible.",
        "apihelp-feedwatchlist-example-default": "Afficher le flux de la liste de suivi",
        "apihelp-feedwatchlist-example-all6hrs": "Afficher toutes les modifications sur les pages suivies dans les dernières 6 heures",
        "apihelp-filerevert-description": "Rétablir un fichier dans une ancienne version.",
        "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
        "apihelp-help-param-recursivesubmodules": "Inclure l’aide pour les sous-modules de façon récursive.",
        "apihelp-help-param-helpformat": "Format de sortie de l’aide.",
-       "apihelp-help-param-wrap": "Inclut la sortie dans une structure de réponse API standard.",
-       "apihelp-help-param-toc": "Inclure une table des matières dans la sortir HTML.",
+       "apihelp-help-param-wrap": "Inclut la sortie dans une structure standard de réponse API.",
+       "apihelp-help-param-toc": "Inclure une table des matières dans la sortie HTML.",
        "apihelp-help-example-main": "Aide pour le module principal",
        "apihelp-help-example-submodules": "Aide pour <kbd>action=query</kbd> et tous ses sous-modules.",
-       "apihelp-help-example-recursive": "Toute l’aide sur une page",
-       "apihelp-help-example-help": "Aide pour le module d’aide lui-même",
-       "apihelp-help-example-query": "Aide pour deux sous-modules de recherche",
+       "apihelp-help-example-recursive": "Toute l’aide sur une page.",
+       "apihelp-help-example-help": "Aide pour le module d’aide lui-même.",
+       "apihelp-help-example-query": "Aide pour deux sous-modules de recherche.",
        "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.",
        "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
        "apihelp-imagerotate-param-tags": "Balises à appliquer à l’entrée dans le journal de téléchargement.",
        "apihelp-move-description": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
-       "apihelp-move-param-to": "Titre de la page renommée.",
+       "apihelp-move-param-to": "Nouveau titre de la page.",
        "apihelp-move-param-reason": "Motif du renommage.",
        "apihelp-move-param-movetalk": "Renommer la page de discussion, si elle existe.",
        "apihelp-move-param-movesubpages": "Renommer les sous-pages, le cas échéant.",
        "apihelp-move-param-noredirect": "Ne pas créer une redirection.",
-       "apihelp-move-param-watch": "Ajouter une page et la redirection à liste de suivi de l'utilisateur actuel.",
+       "apihelp-move-param-watch": "Ajouter la page et la redirection, à la liste de suivi de l'utilisateur actuel.",
        "apihelp-move-param-unwatch": "Supprimer la page et la redirection de la liste de suivi de l'utilisateur actuel.",
        "apihelp-move-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas changer le suivi.",
        "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
        "apihelp-move-param-tags": "Modifier les balises à appliquer à l'entrée du journal des renommages et à la version zéro de la page de destination.",
-       "apihelp-move-example-move": "Déplacer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
+       "apihelp-move-example-move": "Renommer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
        "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
-       "apihelp-opensearch-param-search": "Chaîne de recherche.",
+       "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-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 sont levés avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
+       "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
        "apihelp-opensearch-example-te": "Trouver les pages commençant par <kbd>Te</kbd>.",
        "apihelp-options-description": "Modifier les préférences de l’utilisateur courant.\n\nSeules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec des clés préfixées par <code>userjs-</code> (devant être utilisées dans les scripts utilisateur), peuvent être définies.",
-       "apihelp-options-param-reset": "Réinitialise les préférences aux valeurs par défaut du site.",
+       "apihelp-options-param-reset": "Réinitialise les préférences avec les valeurs par défaut du site.",
        "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option <var>$1reset</var> est définie.",
        "apihelp-options-param-change": "Liste des modifications, au format nom=valeur (par ex. skin=vector). Si aucune valeur n’est fournie (pas même un signe égal), par ex., nomoption|autreoption|…, l’option sera réinitialisée à sa valeur par défaut. Pour toute valeur passée contenant une barre verticale (<kbd>|</kbd>), utiliser le [[Special:ApiHelp/main#main/datatypes|séparateur alternatif de valeur multiple]] pour que l'opération soit correcte.",
-       "apihelp-options-param-optionname": "Un nom d’option qui doit être fixé à la valeur fournie par <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionname": "Nom de l’option qui doit être définie avec la valeur fournie par <var>$1optionvalue</var>.",
        "apihelp-options-param-optionvalue": "La valeur de l'option spécifiée par <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Réinitialiser toutes les préférences",
        "apihelp-options-example-change": "Modifier les préférences <kbd>skin</kbd> et <kbd>hideminor</kbd>.",
        "apihelp-paraminfo-description": "Obtenir des informations sur les modules de l’API.",
        "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Peut spécifier des sous-modules avec un <kbd>+</kbd>, ou tous les sous-modules avec <kbd>+*</kbd>, ou tous les sous-modules récursivement avec <kbd>+**</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Format des chaînes d’aide.",
-       "apihelp-paraminfo-param-querymodules": "Liste des noms de module de requêtage (valeur des paramètres <var>prop</var>, <var>meta</var> ou <var>list</var>=). Utiliser <kbd>$1modules=query+foo</kbd> au lieu de <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-querymodules": "Liste des noms des modules de requête (valeur des paramètres <var>prop</var>, <var>meta</var> ou <var>list</var>). Utiliser <kbd>$1modules=query+foo</kbd> au lieu de <kbd>$1querymodules=foo</kbd>.",
        "apihelp-paraminfo-param-mainmodule": "Obtenir aussi des informations sur le module principal (niveau supérieur). Utiliser plutôt <kbd>$1modules=main</kbd>.",
        "apihelp-paraminfo-param-pagesetmodule": "Obtenir aussi des informations sur le module pageset (en fournissant titles= et ses amis).",
        "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre <var>format</var>). Utiliser plutôt <var>$1modules</var>.",
        "apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd> pour une protection sans expiration.",
        "apihelp-protect-param-reason": "Motif de (dé)protection.",
        "apihelp-protect-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de protection.",
-       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les modèles transclus et les images utilisées dans cette page). Ignoré si aucun des niveaux de protection fournis ne prend en charge la mise en cascade.",
+       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les modèles transclus et les images utilisés dans cette page). Ignoré si aucun des niveaux de protection fournis ne prend en charge la mise en cascade.",
        "apihelp-protect-param-watch": "Si activé, ajouter la page (dé)protégée à la liste de suivi de l'utilisateur actuel.",
        "apihelp-protect-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-protect-example-protect": "Protéger une page",
        "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à <kbd>all</kbd> (c'est à dire tout le monde est autorisé à faire l'action).",
        "apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction",
-       "apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
+       "apihelp-purge-description": "Vider le cache des titres fournis.",
        "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
        "apihelp-purge-example-simple": "Purger les pages <kbd>Main Page</kbd> et <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
        "apihelp-query-description": "Extraire des données de et sur MediaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
-       "apihelp-query-param-prop": "Quelles propriétés obtenir des pages demandées.",
+       "apihelp-query-param-prop": "Quelles propriétés obtenir pour les pages demandées.",
        "apihelp-query-param-list": "Quelles listes obtenir.",
        "apihelp-query-param-meta": "Quelles métadonnées obtenir.",
        "apihelp-query-param-indexpageids": "Inclure une section pageids supplémentaire listant tous les IDs de page renvoyés.",
        "apihelp-query-param-exportnowrap": "Renvoyer le XML exporté sans l’inclure dans un résultat XML (même format que [[Special:Export]]). Utilisable uniquement avec $1export.",
        "apihelp-query-param-iwurl": "S’il faut obtenir l’URL complète si le titre est un lien interwiki.",
        "apihelp-query-param-rawcontinue": "Renvoyer les données <samp>query-continue</samp> brutes pour continuer.",
-       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Page principale</kbd>.",
+       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Main Page</kbd>.",
        "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par <kbd>API/</kbd>.",
        "apihelp-query+allcategories-description": "Énumérer toutes les catégories.",
        "apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.",
        "apihelp-query+allcategories-param-to": "La catégorie à laquelle terminer l’énumération.",
        "apihelp-query+allcategories-param-prefix": "Rechercher tous les titres de catégorie qui commencent avec cette valeur.",
-       "apihelp-query+allcategories-param-dir": "Direction dans laquelle trier.",
+       "apihelp-query+allcategories-param-dir": "Ordre dans lequel trier.",
        "apihelp-query+allcategories-param-min": "Renvoyer uniquement les catégories avec au moins ce nombre de membres.",
        "apihelp-query+allcategories-param-max": "Renvoyer uniquement les catégories avec au plus ce nombre de membres.",
        "apihelp-query+allcategories-param-limit": "Combien de catégories renvoyer.",
        "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: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-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+allfileusages-description": "Lister toutes les utilisations de fichier, y compris ceux n’existant pas.",
+       "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.",
        "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
        "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.",
        "apihelp-query+allfileusages-param-prefix": "Rechercher tous les fichiers dont le titre commence par cette valeur.",
-       "apihelp-query+allfileusages-param-unique": "Afficher uniquement les titres de fichier distincts. Impossible à utiliser avec $1prop=ids.\nQuand utilisé comme générateur, produit les pages cibles au lieu des sources.",
+       "apihelp-query+allfileusages-param-unique": "Afficher uniquement les titres de fichiers distincts. Impossible à utiliser avec $1prop=ids.\nQuand il est utilisé comme générateur, il produit les pages cible au lieu des pages source.",
        "apihelp-query+allfileusages-param-prop": "Quelles informations inclure :",
-       "apihelp-query+allfileusages-paramvalue-prop-ids": "Ajoute les IDs de page des pages l’utilisant (impossible à utiliser avec $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Ajoute l'ID des pages qui l’utilisent (incompatible avec $1unique).",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Ajoute le titre du fichier.",
        "apihelp-query+allfileusages-param-limit": "Combien d’éléments renvoyer au total.",
-       "apihelp-query+allfileusages-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+allfileusages-example-B": "Lister les titres de fichier, y compris les manquants, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
-       "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques",
-       "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants",
-       "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers",
+       "apihelp-query+allfileusages-param-dir": "L'ordre dans lequel lister.",
+       "apihelp-query+allfileusages-example-B": "Lister les titres des fichiers, y compris ceux manquants, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
+       "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques.",
+       "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants.",
+       "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers.",
        "apihelp-query+allimages-description": "Énumérer toutes les images séquentiellement.",
        "apihelp-query+allimages-param-sort": "Propriété par laquelle trier.",
-       "apihelp-query+allimages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allimages-param-dir": "L'ordre dans laquel lister.",
        "apihelp-query+allimages-param-from": "Le titre de l’image depuis laquelle démarrer l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
        "apihelp-query+allimages-param-to": "Le titre de l’image auquel arrêter l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
        "apihelp-query+allimages-param-start": "L’horodatage depuis lequel énumérer. Ne peut être utilisé qu’avec $1sort=timestamp.",
-       "apihelp-query+allimages-param-end": "L’horodatage de fin de l’énumération. Ne peut être utilisé qu’avec $1sort=timestamp.",
+       "apihelp-query+allimages-param-end": "L’horodatage de la fin d’énumération. Ne peut être utilisé qu’avec $1sort=timestamp.",
        "apihelp-query+allimages-param-prefix": "Rechercher toutes les images dont le titre commence par cette valeur. Utilisable uniquement avec $1sort=name.",
        "apihelp-query+allimages-param-minsize": "Restreindre aux images avec au moins ce nombre d’octets.",
        "apihelp-query+allimages-param-maxsize": "Restreindre aux images avec au plus ce nombre d’octets.",
        "apihelp-query+allimages-param-mime": "Quels types MIME rechercher, par ex. <kbd>image/jpeg</kbd>.",
        "apihelp-query+allimages-param-limit": "Combien d’images renvoyer au total.",
        "apihelp-query+allimages-example-B": "Afficher une liste des fichiers commençant par la lettre <kbd>B</kbd>.",
-       "apihelp-query+allimages-example-recent": "Afficher une liste des fichiers récemment téléchargés semblable à [[Special:NewFiles]]",
+       "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléchargés, semblable à [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Afficher une liste de fichiers avec le type MIME <kbd>image/png</kbd> ou <kbd>image/gif</kbd>",
        "apihelp-query+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
        "apihelp-query+alllinks-paramvalue-prop-title": "Ajoute le titre du lien.",
        "apihelp-query+alllinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+alllinks-param-limit": "Combien d’éléments renvoyer au total.",
-       "apihelp-query+alllinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris les manquants, avec les IDs des pages d’où ils proviennent, en démarrant à <kbd>B</kbd>.",
+       "apihelp-query+alllinks-param-dir": "L'ordre dans lequel lister.",
+       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris ceux manquants, avec les IDs des pages d’où ils proviennent, en démarrant à <kbd>B</kbd>.",
        "apihelp-query+alllinks-example-unique": "Lister les titres liés uniques",
        "apihelp-query+alllinks-example-unique-generator": "Obtient tous les titres liés, en marquant les manquants",
        "apihelp-query+alllinks-example-generator": "Obtient les pages contenant les liens",
        "apihelp-query+allmessages-description": "Renvoyer les messages depuis ce site.",
        "apihelp-query+allmessages-param-messages": "Quels messages sortir. <kbd>*</kbd> (par défaut) signifie tous les messages.",
        "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.",
-       "apihelp-query+allmessages-param-enableparser": "Si positionné pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
+       "apihelp-query+allmessages-param-enableparser": "Positionner pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
        "apihelp-query+allmessages-param-nocontent": "Si positionné, ne pas inclure le contenu des messages dans la sortie.",
        "apihelp-query+allmessages-param-includelocal": "Inclure aussi les messages locaux, c’est-à-dire les messages qui n’existent pas dans le logiciel mais dans l’espace de noms {{ns:MediaWiki}}.\nCela liste toutes les pages de l’espace de noms {{ns:MediaWiki}}, donc aussi celles qui ne sont pas vraiment des messages, telles que [[MediaWiki:Common.js|Common.js]].",
        "apihelp-query+allmessages-param-args": "Arguments à substituer dans le message.",
        "apihelp-query+allpages-param-prlevel": "Filtrer les protections basées sur le niveau de protection (doit être utilisé avec le paramètre $1prtype=).",
        "apihelp-query+allpages-param-prfiltercascade": "Filtrer les protections d’après leur cascade (ignoré si $1prtype n’est pas positionné).",
        "apihelp-query+allpages-param-limit": "Combien de pages renvoyer au total.",
-       "apihelp-query+allpages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allpages-param-dir": "L'ordre dans lequel lister.",
        "apihelp-query+allpages-param-filterlanglinks": "Filtrer si une page a des liens de langue. Noter que cela ne prend pas en compte les liens de langue ajoutés par des extensions.",
        "apihelp-query+allpages-param-prexpiry": "Quelle expiration de protection sur laquelle filtrer la page :\n;indefinite:N’obtenir que les pages avec une expiration de protection infinie.\n;definite:N’obtenir que les pages avec une expiration de protection définie (spécifique).\n;all:Obtenir toutes les pages avec une expiration de protection.",
        "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre <kbd>B</kbd>.",
        "apihelp-query+allredirects-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+allredirects-param-limit": "Combien d’éléments renvoyer au total.",
        "apihelp-query+allredirects-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris les manquantes, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris celles manquantes, avec les IDs de page d’où ils proviennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+allredirects-example-unique": "Lister les pages cible unique",
        "apihelp-query+allredirects-example-unique-generator": "Obtient toutes les pages cible, en marquant les manquantes",
        "apihelp-query+allredirects-example-generator": "Obtient les pages contenant les redirections",
        "apihelp-query+allrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.",
        "apihelp-query+allrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+allrevisions-param-generatetitles": "Utilisé comme générateur, génère des titres plutôt que des IDs de révision.",
-       "apihelp-query+allrevisions-example-user": "Lister les 50 dernières contributions de l’utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-query+allrevisions-example-user": "Lister les 50 dernières contributions de l’utilisateur <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Lister les 50 premières révisions dans l’espace de noms principal.",
        "apihelp-query+mystashedfiles-description": "Obtenir une liste des fichiers dans le cache de téléchargement de l’utilisateur actuel",
        "apihelp-query+mystashedfiles-param-prop": "Quelles propriétés récupérer pour les fichiers.",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Ajoute le titre de la transclusion.",
        "apihelp-query+alltransclusions-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+alltransclusions-param-limit": "Combien d’éléments renvoyer au total.",
-       "apihelp-query+alltransclusions-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+alltransclusions-param-dir": "L'ordre dans lequel lister.",
        "apihelp-query+alltransclusions-example-B": "Lister les titres inclus, y compris les manquants, avec les IDs des pages d’où ils viennent, en commençant à <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-unique": "Lister les titres inclus uniques",
-       "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants",
-       "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant des transclusions",
+       "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants.",
+       "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant les transclusions.",
        "apihelp-query+allusers-description": "Énumérer tous les utilisateurs enregistrés.",
        "apihelp-query+allusers-param-from": "Le nom d’utilisateur auquel démarrer l’énumération.",
        "apihelp-query+allusers-param-to": "Le nom d’utilisateur auquel stopper l’énumération.",
        "apihelp-query+allusers-paramvalue-prop-blockinfo": "Ajoute l’information sur le bloc actuel d’un utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-groups": "Liste des groupes auxquels appartient l’utilisateur. Cela utilise beaucoup de ressources du serveur et peut renvoyer moins de résultats que la limite.",
        "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Liste tous les groupes auxquels l’utilisateur est affecté automatiquement.",
-       "apihelp-query+allusers-paramvalue-prop-rights": "Liste les droits qu’à l’utilisateur.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Liste les droits qu’a l’utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-registration": "Ajoute l’horodatage de l’inscription de l’utilisateur, s’il est disponible (peut être vide).",
        "apihelp-query+allusers-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
        "apihelp-query+backlinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+backlinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+backlinks-param-filterredir": "Comment filtrer les redirections. Si positionné à <kbd>nonredirects</kbd> quand <var>$1redirect</var> est activé, cela ne s’applique qu’au second niveau.",
-       "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui signifie jusqu’à 2 * limite résultats peut être retourné).",
-       "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont un lien vers cette redirection aussi. La limite maximale est divisée par deux.",
+       "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si <var>$1redirect</var> est activé, la limite s’applique à chaque niveau séparément (ce qui signifie jusqu’à 2 * <var>$1limit</var> résultats pouvant être retournés).",
+       "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver également toutes les pages qui ont un lien vers cette redirection. La limite maximale est divisée par deux.",
        "apihelp-query+backlinks-example-simple": "Afficher les liens vers <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.",
        "apihelp-query+categories-paramvalue-prop-hidden": "Marque les catégories cachées avec <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Quelle sorte de catégories afficher.",
        "apihelp-query+categories-param-limit": "Combien de catégories renvoyer.",
-       "apihelp-query+categories-param-categories": "Lister uniquement ces catégories. Utile pour vérifier si une certaine page est dans une certaine catégorie.",
+       "apihelp-query+categories-param-categories": "Lister uniquement ces catégories. Utile pour vérifier si une certaine page est dans une catégorie donnée.",
        "apihelp-query+categories-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient la page <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans la page <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
-       "apihelp-query+contributors-param-group": "Inclure uniquement les utilisateurs dans les groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+contributors-param-group": "Inclut uniquement les utilisateurs dans les groupes donnés. N'inclut pas les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-rights": "Inclure uniquement les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
        "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
-       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
+       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
        "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
        "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
        "apihelp-query+disabled-description": "Ce module de requête a été désactivé.",
-       "apihelp-query+duplicatefiles-description": "Lister tous les fichiers qui sont des doublons des fichiers donnés d’après leurs valeurs de hachage.",
+       "apihelp-query+duplicatefiles-description": "Lister d’après leurs valeurs de hachage, tous les fichiers qui sont des doublons de fichiers donnés.",
        "apihelp-query+duplicatefiles-param-limit": "Combien de fichiers dupliqués à renvoyer.",
        "apihelp-query+duplicatefiles-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+duplicatefiles-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
-       "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Rechercher les doublons de tous les fichiers",
        "apihelp-query+embeddedin-description": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.",
        "apihelp-query+embeddedin-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
        "apihelp-query+embeddedin-param-filterredir": "Comment filtrer les redirections.",
        "apihelp-query+embeddedin-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant <kbd>Template:Stub</kbd>.",
-       "apihelp-query+embeddedin-example-generator": "Obteir des informations sur les pages incluant <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Template:Stub</kbd>.",
        "apihelp-query+extlinks-description": "Renvoyer toutes les URLs externes (non interwikis) des pages données.",
        "apihelp-query+extlinks-param-limit": "Combien de liens renvoyer.",
-       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vide pour lister tous les liens externes.",
+       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vides pour lister tous les liens externes.",
        "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.",
        "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
        "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
        "apihelp-query+exturlusage-paramvalue-prop-url": "Ajoute l’URL utilisée dans la page.",
        "apihelp-query+exturlusage-param-protocol": "Protocole de l’URL. Si vide et que <var>$1query</var>  est rempli, le protocole est <kbd>http</kbd>. Le laisser avec <var>$1query</var>  vide pour lister tous les liens externes.",
-       "apihelp-query+exturlusage-param-query": "Rechercher une chaîne sans protocole. Voyez [[Special:LinkSearch]]. Le laisser vide liste tous les liens externes.",
+       "apihelp-query+exturlusage-param-query": "Rechercher une chaîne sans protocole. Voyez [[Special:LinkSearch]]. Le laisser vide pour lister tous les liens externes.",
        "apihelp-query+exturlusage-param-namespace": "Les espaces de nom à énumérer.",
        "apihelp-query+exturlusage-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+exturlusage-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
        "apihelp-query+filearchive-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MédiaWiki).",
        "apihelp-query+filearchive-param-prop": "Quelle information obtenir sur l’image :",
        "apihelp-query+filearchive-paramvalue-prop-sha1": "Ajoute le hachage SHA-1 pour l’image.",
-       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l÷’horodatage pour la version téléchargée.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l’horodatage pour la version téléchargée.",
        "apihelp-query+filearchive-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé la version de l’image.",
        "apihelp-query+filearchive-paramvalue-prop-size": "Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias pour la taille.",
        "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Ajoute la profondeur de bit de la version.",
        "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’image configurés dans le wiki.",
+       "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-example-simple": "Obtenir l’information sur les référentiels de fichier",
+       "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+fileusage-paramvalue-prop-pageid": "ID de chaque page.",
        "apihelp-query+fileusage-example-simple": "Obtenir une liste des pages utilisant [[:File:Example.jpg]]",
        "apihelp-query+fileusage-example-generator": "Obtenir l’information sur les pages utilisant [[:File:Example.jpg]]",
        "apihelp-query+imageinfo-description": "Renvoyer l’information de fichier et l’historique de téléchargement.",
-       "apihelp-query+imageinfo-param-prop": "Quelles informations obtenir du fichier :\n;timestamp:Ajoute l’horodatage de la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé chaque version du fichier.\n;userid:Ajoute l’ID de l’utilisateur qui a téléchargé chaque version du fichier.\n;comment:Commentaire sur la version.\n;parsedcomment:Analyser le commentaire sur cette version.\n;canonicaltitle:Ajoute le titre canonique du fichier.\n;url:Fournit l’URL du fichier et la page de description.\n;size:Ajoute la taille du fichier en octets et la hauteur, la largeur et le nombre de pages (si applicable).\n;dimensions:Alias pour la taille.\n;sha1:Ajoute le hachage SHA-1 pour le fichier.\n;mime:Ajoute le type MIME du fichier.\n;thumbmime:Ajoute le type MIME de la vignette de l’image (nécessite l’URL et le paramètre $1urlwidth).\n;mediatype:Ajoute le type de média du fichier.\n;metadata:Liste les métadonnées Exif de la version du fichier.\n;commonmetadata:Liste les métadonnées génériques du format du fichier pour la version du fichier.\n;extmetadata:Liste les métadonnées mises en forme combinées depuis différentes sources. Les résultats sont au format HTML.\n;archivename:Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.\n;bitdepth:Ajoute la profondeur de bit de la version.\n;uploadwarning:Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
+       "apihelp-query+imageinfo-param-prop": "Quelle information obtenir du fichier :",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléchargée.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé chaque version du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "Ajouter l’ID de l’utilisateur qui a téléchargé chaque version du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analyser le commentaire de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Ajoute le titre canonique du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "Fournit l’URL du fichier et de la page de description.",
-       "apihelp-query+imageinfo-paramvalue-prop-size": "Ajoute la taille du fichier en octets et sa hauteur, largeur et compteur de page (le cas échéant).",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "Ajoute la taille du fichier en octets et sa hauteur, sa largeur et le compteur de page (le cas échéant).",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias pour la taille.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "Ajoute le hachage SH1-1 du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "Ajoute le type MIME du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Ajoute la profondeur de bits de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
        "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ajoute l'indication que le fichier est sur [[MediaWiki:Bad image list]]",
-       "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
+       "apihelp-query+imageinfo-param-limit": "Combien de révisions de fichier renvoyer par fichier.",
        "apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
        "apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
        "apihelp-query+imageinfo-param-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
        "apihelp-query+imageinfo-param-extmetadatalanguage": "Quelle langue pour analyser extmetadata. Cela affecte à la fois quelle traduction analyser, s’il y en a plusieurs, et comment les choses comme les nombres et d’autres valeurs sont mises en forme.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Si des traductions pour la propriété extmetadata sont disponibles, les analyser toutes.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Si spécifié et non vide, seules ces clés seront renvoyées pour $1prop=extmetadata.",
-       "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètres spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
        "apihelp-query+imageinfo-param-badfilecontexttitle": "Si <kbd>$2prop=badfile</kbd> est positionné, il s'agit du titre de la page utilisé pour évaluer la [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
-       "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]]",
-       "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008",
+       "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008.",
        "apihelp-query+images-description": "Renvoie tous les fichiers contenus dans les pages fournies.",
        "apihelp-query+images-param-limit": "Combien de fichiers renvoyer.",
        "apihelp-query+images-param-images": "Lister uniquement ces fichiers. Utile pour vérifier si une page donnée contient un fichier donné.",
        "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+info-description": "Obtenir les informations de base sur la page.",
-       "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :\n;protection:Liste de niveau de protection de chaque page.\n;talkid:L’ID de la page de discussion pour chaque page qui n’est pas une page de discussion.\n;watched:Liste de l’état de suivi de chaque page.\n;watchers:Le nombre d’observateurs, si c&est autorisé.\n;notificationtimestamp:L’horodatage de notification de la liste de suivi de chaque page.\n;subjectid:L’ID de la page parente de chaque page de discussion.\n;url:Fournit une URL complète, une URL de modification, et l’URL canonique pour chaque page.\n;readable:Si l’utilisateur peut lire cette page.\n;preload:Fournit le texte renvoyé par EditFormPreloadText.\n;displaytitle:Fournit la manière dont le titre de la page est vraiment affiché.",
+       "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :",
        "apihelp-query+info-paramvalue-prop-protection": "Lister le niveau de protection de chaque page.",
        "apihelp-query+info-paramvalue-prop-talkid": "L’ID de la page de discussion de chaque page qui n’est pas de discussion.",
        "apihelp-query+info-paramvalue-prop-watched": "Lister l’état de suivi de chaque page.",
        "apihelp-query+info-param-testactions": "Tester si l’utilisateur actuel peut effectuer certaines actions sur la page.",
        "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Obtenir des informations sur la page <kbd>Main Page</kbd>.",
-       "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur la page <kbd>Main Page</kbd>.",
-       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). N’utiliser aucun paramètre revient en pratique à « tous les liens interwiki ».",
+       "apihelp-query+info-example-protection": "Obtenir des informations générales et de protection sur la page <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). Sans paramètre, équivaut à « tous les liens interwiki ».",
        "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
        "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ajoute le préfixe de l’interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ajoute le titre de l’interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[wikibooks:Test]]",
-       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages qui ont un lien vers [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages qui ont un lien vers [[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.",
-       "apihelp-query+iwlinks-param-url": "S&il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
+       "apihelp-query+iwlinks-param-url": "S'il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
        "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ajoute l’URL complète.",
        "apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Ajoute le code de langue du lien de langue.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Ajoute le titre du lien de langue.",
        "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages avec un lien avec [[:fr:Test]]",
-       "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]]",
+       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]].",
        "apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.",
        "apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.",
        "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec <var>$1prop</var>).",
        "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-namespace": "Renvoyer seulement des pages de ces espaces de noms.",
-       "apihelp-query+random-param-limit": "Limite sur le nombre de pages aléatoires renvoyées.",
+       "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+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-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-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-description": "Effectuer une recherche en texte intégral.",
        "apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.",
-       "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
+       "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de noms.",
        "apihelp-query+search-param-what": "Quel type de recherche effectuer.",
        "apihelp-query+search-param-info": "Quelles métadonnées renvoyer.",
        "apihelp-query+search-param-prop": "Quelles propriétés renvoyer :",
        "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-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-unblock-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de blocage.",
        "apihelp-unblock-example-id": "Lever le blocage d’ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Débloquer l’utilisateur <kbd>Bob</kbd> avec le motif <kbd>Désolé Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Titre de la page à restaurer.",
        "apihelp-undelete-param-reason": "Motif de restauration.",
        "apihelp-undelete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de suppression.",
        "apierror-invalidexpiry": "Heure d'expiration invalide \"$1\".",
        "apierror-invalid-file-key": "Ne correspond pas à une clé valide de fichier.",
        "apierror-invalidlang": "Code de langue non valide pour le paramètre <var>$1</var>.",
-       "apierror-invalidoldimage": "Le paramètre oldimage a un format non valide.",
+       "apierror-invalidoldimage": "Le paramètre <var>oldimage</var> a un format non valide.",
        "apierror-invalidparammix-cannotusewith": "Le paramètre <kbd>$1</kbd> ne peut pas être utilisé avec <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "Le paramètre <kbd>$1</kbd> ne peut être utilisé qu’avec <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> ne peut pas être combiné avec le paramètre <var>oldid</var>, <var>pageid</var> ou <var>page</var>. Veuillez utiliser <var>title</var> et <var>text</var>.",
        "apierror-invalidparammix": "{{PLURAL:$2|Les paramètres}} $1 ne peuvent pas être utilisés ensemble.",
-       "apierror-invalidsection": "Le paramètre section doit être un ID de section valide ou <kbd>new</kbd>.",
+       "apierror-invalidsection": "Le paramètre <var>section</var> doit être un ID de section valide ou <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "Le hachage SHA1Base36 fourni n’est pas valide.",
        "apierror-invalidsha1hash": "Le hachage SHA1 fourni n’est pas valide.",
        "apierror-invalidtitle": "Mauvais titre « $1 ».",
        "apiwarn-redirectsandrevids": "La résolution de la redirection ne peut pas être utilisée avec le paramètre <var>revids</var>. Toutes les redirections vers lesquelles pointent <var>revids</var> n’ont pas été résolues.",
        "apiwarn-tokennotallowed": "L'action « $1 » n'est pas autorisée pour l'utilisateur actuel.",
        "apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.",
-       "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>: la limite est $2.",
+       "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>. La  limite est $2.",
        "apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.",
-       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now<kbd>.",
+       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valeur non reconnue|Valeurs non reconnues}} pour le paramètre <var>$1</var> : $2.",
        "apiwarn-unsupportedarray": "Le paramètre <var>$1</var> utilise une syntaxe PHP de tableau non prise en charge.",
        "apiwarn-urlparamwidth": "Valeur de la largeur définie dans <var>$1urlparam</var> ($2) ignorée en faveur de la largeur calculée à partir de <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
index 4dc2104..24cb77c 100644 (file)
@@ -29,6 +29,8 @@
        "apihelp-main-param-origin": "Cando se accede á API usando unha petición AJAX entre-dominios (CORS), inicializar o parámetro co dominio orixe. Isto debe incluírse en calquera petición pre-flight, e polo tanto debe ser parte da petición URI (non do corpo POST). Para peticións autenticadas, isto debe coincidir exactamente cunha das orixes na cabeceira <code>Origin</code>, polo que ten que ser fixado a algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parámetro non coincide coa cabeceira <code>Origin</code>, devolverase unha resposta 403. Se este parámetro coincide coa cabeceira <code>Origin</code> e a orixe está na lista branca, as cabeceiras <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serán fixadas.\n\nPara peticións non autenticadas, especifique o valor <kbd>*</kbd>. Isto fará que se fixe a cabeceira <code>Access-Control-Allow-Origin</code>, pero <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os datos específicos do usuario serán ocultados.",
        "apihelp-main-param-uselang": "Linga a usar para a tradución de mensaxes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devolve unha lista de códigos de lingua, ou especificando <kbd>user</kbd> coa preferencia de lingua do usuario actual, ou especificando <kbd>content</kbd> para usar a lingua do contido desta wiki.",
        "apihelp-main-param-errorformat": "Formato a usar para a saída do texto de aviso e de erroː\n; plaintext:  texto wiki sen as etiquetas HTML e coas entidades substituídas.\n; wikitext: texto wiki sen analizar.\n; html: HTML.\n; raw: Clave de mensaxe e parámetros.\n; none: Sen saída de texto, só os códigos de erro.\n; bc: Formato utilizado antes de MediaWiki 1.29. <var>errorlang</var> e <var>errorsuselocal</var> non se teñen en conta.",
+       "apihelp-main-param-errorlang": "Lingua usada para advertencias e erros. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devolve unha lista de códigos de lingua. Pode especificar <kbd>content</kbd> para utilizar a lingua do contido deste wiki ou <kbd>uselang</kbd> para utilizar o mesmo valor que o do parámetro <var>uselang</var>.",
+       "apihelp-main-param-errorsuselocal": "Se se indica, os textos de erro empregarán mensaxes adaptadas á lingua do espazo de nomes {{ns:MediaWiki}}.",
        "apihelp-block-description": "Bloquear un usuario.",
        "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear. Non pode usarse xunto con <var>$1userid</var>",
        "apihelp-block-param-userid": "Identificador de usuario a bloquear. Non pode usarse xunto con <var>$1user</var>.",
@@ -42,6 +44,7 @@
        "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-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-block-example-ip-simple": "Bloquear dirección IP <kbd>192.0.2.5</kbd> durante tres días coa razón <kbd>Primeiro aviso</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vandal</kbd> coa razón <kbd>Vandalism</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
        "apihelp-changeauthenticationdata-description": "Cambiar os datos de autenticación do usuario actual.",
        "apihelp-help-example-query": "Axuda para dous submódulos de consulta.",
        "apihelp-imagerotate-description": "Xirar unha ou máis imaxes.",
        "apihelp-imagerotate-param-rotation": "Graos a rotar a imaxe no sentido do reloxio.",
+       "apihelp-imagerotate-param-tags": "Etiquetas aplicar á entrada no rexistro de subas.",
        "apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> graos.",
        "apihelp-imagerotate-example-generator": "Rotar tódalas imaxes en <kbd>Category:Flip</kbd> <kbd>180</kbd> graos",
        "apihelp-import-description": "Importar unha páxina doutra wiki, ou dun ficheiro XML.\n\nDecátese de que o POST HTTP debe facerse como unha carga de ficheiro (p. ex. usando multipart/form-data) cando se envíe un ficheiro para o parámetro <var>xml</var>.",
        "apihelp-import-param-templates": "Para importacións interwiki: importar tódolos modelos incluídos.",
        "apihelp-import-param-namespace": "Importar a este espazo de nomes. Non se pode usar de forma conxunta con  <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpáxina desta páxina. Non se pode usar de forma conxunta con <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de importacións e á revisión nula das páxinas importadas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] ó espazo de nomes 100 con todo o historial.",
        "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
        "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
        "apihelp-managetags-param-tag": "Etiqueta para crear, borrar, activar ou desactivar. Para a creación da etiqueta, a etiqueta non pode existir previamente. Para o borrado da etiqueta, a etiqueta debe existir. Para a activación da etiqueta, a etiqueta debe existir e non pode ser usada por unha extensión. Para desactivar unha etiqueta, a etiqueta debe estar activa e definida manualmente.",
        "apihelp-managetags-param-reason": "Un motivo opcional para crear, borrar, activar ou desactivar a etiqueta.",
        "apihelp-managetags-param-ignorewarnings": "Ignorar calquera aviso que apareza durante a operación.",
+       "apihelp-managetags-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de xestión das etiquetas.",
        "apihelp-managetags-example-create": "Crear unha etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Borrar a etiqueta <kbd>vandalismo</kbd> coa razón <kbd>Erros ortográficos</kbd>",
        "apihelp-managetags-example-activate": "Activar a etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "Eliminar a páxina e a redirección da páxina de vixiancia do usuario actual.",
        "apihelp-move-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-move-param-ignorewarnings": "Ignorar as advertencias.",
+       "apihelp-move-param-tags": "Cambiar as etiquetas a aplicar á entrada do rexistro de traslados e na revisión nula da páxina de destino.",
        "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sen deixar unha redirección.",
        "apihelp-opensearch-description": "Buscar no wiki mediante o protocolo OpenSearch.",
        "apihelp-opensearch-param-search": "Buscar texto.",
        "apihelp-protect-example-protect": "Protexer unha páxina",
        "apihelp-protect-example-unprotect": "Desprotexer unha páxina poñendo as restricións a <kbd>all</kbd>. (isto quere dicir que todo o mundo pode realizar a acción).",
        "apihelp-protect-example-unprotect2": "Desprotexer unha páxina quitando as restricións.",
-       "apihelp-purge-description": "Borrar a caché para os títulos indicados.\n\nPrecisa dunha petición POST se o usuario non está conectado.",
+       "apihelp-purge-description": "Borrar a caché para os títulos indicados.",
        "apihelp-purge-param-forcelinkupdate": "Actualizar as táboas de ligazóns.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar a táboa de ligazóns, e actualizar as táboas de ligazóns para calquera páxina que use esta páxina como modelo.",
        "apihelp-purge-example-simple": "Purgar a <kbd>Main Page</kbd> e páxina da <kbd>API</kbd>.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Se as traducións para a propiedade extmetadata están dispoñibles, búscaas todas.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Se está especificado e non baleiro, só se devolverán esas claves para $1prop=extmetadata.",
        "apihelp-query+imageinfo-param-urlparam": "Unha cadea de parámetro específico no analizador. Por exemplo, os PDFs poden usar <kbd>page15-100px</kbd>. Debe usarse <var>$1urlwidth</var> que debe ser coherente con <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-badfilecontexttitle": "Se <kbd>$2prop=badfile</kbd> está definido, este é o título da páxina usado para avaliar a [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Só buscar ficheiros no repositorio local.",
        "apihelp-query+imageinfo-example-simple": "Busca a información sobre a versión actual de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Busca información sobre as versións de [[:File:Test.jpg]] posteriores a 2008.",
        "apihelp-query+usercontribs-param-limit": "Máximo número de contribucións a mostar.",
        "apihelp-query+usercontribs-param-start": "Selo de tempo de comezo ó que volver.",
        "apihelp-query+usercontribs-param-end": "Selo de tempo de fin ó que volver.",
-       "apihelp-query+usercontribs-param-user": "Usuarios para os que recuperar as contribucións.",
-       "apihelp-query+usercontribs-param-userprefix": "Recuperar as contribucións de todos os usuarios cuxo nome comece por este valor. Ignora $1user.",
+       "apihelp-query+usercontribs-param-user": "Usuarios para os que recuperar as contribucións. Non pode ser usado con <var>$1userids</var> ou <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "Recuperar as contribucións de todos os usuarios cuxo nome comece por este valor. Non pode usarse con <var>$1user</var> nin con  <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "IDs de usuarios para os que recuperar as contribucións. Non pode ser usado con <var>$1user</var> nin con <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "Só listar contribucións nestes espazos de nomes.",
        "apihelp-query+usercontribs-param-prop": "Engade información adicional:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Engade os identificadores de páxina e modificación.",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marca se o usuario actual está bloqueado, por que, e por que razón.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Engade unha etiqueta <samp>messages</samp> (mensaxe) se o usuario actual ten mensaxes pendentes.",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos os grupos ós que pertence o usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Lista os grupos ós que o usuario actual foi asignado explicitamente, incluíndo a data de caducidade de afiliación a cada grupo.",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lista todos so grupos dos que o usuario actual é membro automaticamente.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos os dereitos que ten o usuario actual.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos ós que o usuario pode engadir ou eliminar a outros usuarios.",
        "apihelp-query+users-param-prop": "Que información incluír:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Etiquetas se o usuario está bloqueado, por quen, e por que razón.",
        "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos ós que pertence cada usuario.",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "Lista os grupos ós que foi asignado explicitamente cada usuario, incluíndo a data de caducidade de afiliación a cada grupo.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Lista os grupos dos que un usuario é membro de forma automatica.",
        "apihelp-query+users-paramvalue-prop-rights": "Lista todos os dereitos que ten cada usuario.",
        "apihelp-query+users-paramvalue-prop-editcount": "Engade o contador de edicións do usuario.",
        "apihelp-query+users-paramvalue-prop-cancreate": "Indica se unha conta pode ser creada para nomes de usuario válidos pero non rexistrados.",
        "apihelp-query+users-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \nindica que o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
+       "apihelp-query+users-param-userids": "Unha lista de identificadores de usuarios dos que obter información.",
        "apihelp-query+users-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+users-example-simple": "Mostar información para o usuario <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Ver os cambios recentes das páxinas na lista de vixiancia do usuario actual.",
        "apihelp-revisiondelete-param-show": "Que mostrar para cada revisión.",
        "apihelp-revisiondelete-param-suppress": "Eliminar os datos dos administradores así coma dos doutros.",
        "apihelp-revisiondelete-param-reason": "Razón para o borrado ou restaurado.",
+       "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar á entrada no rexistro de borrados.",
        "apihelp-revisiondelete-example-revision": "Ocultar contido para revisión <kbd>12345</kbd> na <kbd>Páxina Principal</kbd>.",
        "apihelp-revisiondelete-example-log": "Ocultar todos os datos da entrada de rexistro <kbd>67890</kbd> coa razón <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "Desfacer a última modificación da páxina.\n\nSe o último usuario que modificou a páxina fixo varias modificacións nunha fila, desfaranse todas.",
        "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-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-setpagelanguage-param-reason": "Motivo do cambio.",
+       "apihelp-setpagelanguage-param-tags": "Cambiar as etiquetas a aplicar á entrada de rexistro resultante desta acción.",
        "apihelp-setpagelanguage-example-language": "Cambiar a lingua de <kbd>Main Page</kbd> ó éuscaro.",
        "apihelp-setpagelanguage-example-default": "Cambiar a lingua da páxina con identificador 123 á lingua predeterminada para o contido da wiki.",
        "apihelp-stashedit-description": "Preparar unha edición na caché compartida.\n\nEstá previsto que sexa usado vía AJAX dende o formulario de edición para mellorar o rendemento de gardado da páxina.",
        "apihelp-tag-param-add": "Etiquetas a engadir. Só poden engadirse etiquetas definidas manualmente.",
        "apihelp-tag-param-remove": "Etiquetas a eliminar. Só se poden eliminar as etiquetas definidas manualmente ou que non teñen ningunha definición.",
        "apihelp-tag-param-reason": "Razón para o cambio.",
+       "apihelp-tag-param-tags": "Etiquetas a aplicar á entrada de rexistro que será creada como resultado desta acción.",
        "apihelp-tag-example-rev": "Engadir a etiqueta <kbd>vandalismo</kbd> á revisión con identificador 123 sen indicar un motivo",
        "apihelp-tag-example-log": "Eliminar a etiqueta <kbd>publicidade</kbd> da entrada do rexistro con identificador 123 co motivo <kbd>aplicada incorrectamente</kbd>",
        "apihelp-tokens-description": "Obter os identificadores para accións de modificación de datos.\n\nEste módulo está obsoleto e foi reemprazado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-unblock-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de bloqueo.",
        "apihelp-unblock-example-id": "Desbloquear bloqueo ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear usuario <kbd>Bob</kbd> con razón <kbd>Síntoo Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da páxina a restaurar.",
        "apihelp-undelete-param-reason": "Razón para restaurar.",
        "apihelp-undelete-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de borrado.",
        "apihelp-userrights-description": "Cambiar a pertencia dun usuario a un grupo.",
        "apihelp-userrights-param-user": "Nome de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
-       "apihelp-userrights-param-add": "Engadir o usuario a estes grupos.",
+       "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-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-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Engadir ó usuario con ID <kbd>123</kbd> ó grupo <kbd>bot</kbd>, e borralo dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "apihelp-userrights-example-expiry": "Engadir o usuario <kbd>SometimeSysop</kbd> ó grupo <kbd>sysop</kbd> por 1 mes.",
+       "apihelp-validatepassword-description": "Valida un contrasinal contra as políticas de contrasinais da wiki.\n\nA validez é <samp>Good</samp> se o contrasinal é aceptable, <samp>Change</samp> se o contrasinal pode usarse para iniciar sesión pero debe cambiarse ou <samp>Invalid</samp> se o contrasinal non se pode usar.",
        "apihelp-validatepassword-param-password": "Contrasinal a validar.",
+       "apihelp-validatepassword-param-user": "Nome de usuario, para probas de creación de contas. O usuario nomeado non debe existir.",
+       "apihelp-validatepassword-param-email": "Enderezo de correo electrónico, para probas de creación de contas.",
+       "apihelp-validatepassword-param-realname": "Nome real, para probas de creación de contas.",
+       "apihelp-validatepassword-example-1": "Validar o contrasinal <kbd>foobar</kbd> para o usuario actual.",
+       "apihelp-validatepassword-example-2": "Validar o contrasinal <kbd>qwerty</kbd> para a creación do usuario <kbd>Example</kbd>.",
        "apihelp-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.",
        "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.",
        "api-help-authmanagerhelper-returnurl": "Devolve o URL para os fluxos de autenticación de terceiros, que debe ser absoluto. Este ou <var>$1continue</var> é obrigatorio.\n\nLogo da recepción dunha resposta <samp>REDIRECT</samp>, vostede normalmente abrirá un navegador web ou un visor web para ver a URL <samp>redirecttarget</samp> especificada para un fluxo de autenticación de terceiros. Cando isto se complete, a aplicación de terceiros enviará ó navegador web ou visor web a esta URL. Vostede debe eliminar calquera consulta ou parámetros POST da URL e pasalos como unha consulta <var>$1continue</var> a este módulo API.",
        "api-help-authmanagerhelper-continue": "Esta petición é unha continucación despois dun resposta precedente <samp>UI</samp> ou <samp>REDIRECT</samp>. Esta ou <var>$1returnurl</var> é requirida.",
        "api-help-authmanagerhelper-additional-params": "Este módulo acepta parámetros adicionais dependendo das consultas de autenticación dispoñibles. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (ou unha resposta previa deste módulo, se aplicable) para determinar as consultas dispoñibles e os campos que usan.",
+       "apierror-allimages-redirect": "Usar <kbd>gaifilterredir=nonredirects</kbd> no canto de <var>redirects</var> cando <kbd>allimages</kbd> é usado como xerador.",
+       "apierror-allpages-generator-redirects": "Usar <kbd>gapfilterredir=nonredirects</kbd> no canto de <var>redirects</var> cando <kbd>allpages</kbd> é usado como xerador.",
+       "apierror-appendnotsupported": "Non pode anexarse a páxinas que usan o modelo de contido $1.",
        "apierror-articleexists": "O artigo que intentou crear xa existe.",
+       "apierror-assertbotfailed": "A verificación de que o usuario ten o dereito de <code>bot</code> fallou.",
+       "apierror-assertnameduserfailed": "A verificación de que o usuario é «$1» fallou.",
+       "apierror-assertuserfailed": "A verificación de que o usuario está conectado fallou.",
+       "apierror-autoblocked": "O seu enderezo IP foi bloqueado automaticamente porque foi utilizado por un usuario bloqueado.",
+       "apierror-badconfig-resulttoosmall": "O valor de <code>$wgAPIMaxResultSize</code> neste wiki é demasiado pequeno como para conter información de resultados básicos.",
+       "apierror-badcontinue": "Parámetro de continuación non válido. Debe pasar o valor orixinal devolto pola consulta precedente.",
+       "apierror-baddiff": "A comparación non pode recuperarse. Unha ou ambas revisións non existen ou non ten permiso para velas.",
+       "apierror-baddiffto": "<var>$1diffto</var> debe fixarse cun número non negativo, <kbd>prev</kbd>, <kbd>next</kbd> ou <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "O formato solicitado $1 non está soportado polo modelo de contido $2.",
+       "apierror-badformat": "O formato solicitado $1 non está soportado polo modelo de contido $2 utilizado por $3.",
+       "apierror-badgenerator-notgenerator": "O módulo <kbd>$1</kbd> non pode utilizarse como xerador.",
        "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> descoñecido.",
        "apierror-badip": "O parámetro IP non é válido.",
        "apierror-badmd5": "O código hash MD5 non era incorrecto.",
        "apierror-badquery": "A consulta non é válida.",
        "apierror-badtimestamp": "Valor \"$2\" non válido para o parámetro de data e hora <var>$1</var>.",
        "apierror-badtoken": "Identificador CSRF non válido.",
+       "apierror-badupload": "O parámetro de suba de ficheiro <var>$1</var> non é unha suba de ficheiro, asegúrese de usar <code>multipart/form-data</code> para o seu POST e de incluír un nome de ficheiro na cabeceira <code>Content-Disposition</code>.",
        "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-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-cannotreauthenticate": "Esta acción non está dispoñible xa que súa identidade non se pode verificar.",
        "apierror-cannotviewtitle": "Non está autorizado para ver $1.",
+       "apierror-cantblock-email": "Non ten permiso para bloquear ós usuarios o envío de correo electrónico a través da wiki.",
        "apierror-cantblock": "Non ten permisos para bloquear usuarios.",
+       "apierror-cantchangecontentmodel": "Non ten permiso para cambiar o modelo de contido dunha páxina.",
+       "apierror-canthide": "Non ten permiso para ocultar nomes de usuario do rexistro de bloqueos.",
+       "apierror-cantimport-upload": "Non ten permiso para importar páxinas subidas.",
        "apierror-cantimport": "Non ten permisos para importar páxinas.",
+       "apierror-cantoverwrite-sharedfile": "O ficheiro obxectivo existe nun repositorio compartido e non ten permiso para substituílo.",
+       "apierror-cantsend": "Non está conectado na súa conta, non ten un enderezo de correo electrónico confirmado, ou non ten permiso para enviar correos electrónicos a outros usuarios, polo que non pode enviar correo electrónico.",
+       "apierror-cantundelete": "Non se puido restaurarː pode que as revisións solicitadas non existan, ou pode que xa se restauraran.",
        "apierror-changeauth-norequest": "Erro ó crear a petición de modificación.",
        "apierror-chunk-too-small": "O tamaño mínimo dun segmento é de  $1 {{PLURAL:$1|byte|bytes}} para os segmentos non finais.",
        "apierror-cidrtoobroad": "Os rangos CIDR $1 maiores que /$2 non son aceptados.",
        "apierror-invalidexpiry": "Hora de caducidade incorrecta \"$1\".",
        "apierror-invalid-file-key": "Non se corresponde cunha clave válida de ficheiro.",
        "apierror-invalidlang": "Código de lingua incorrecto para o parámetro <var>$1</var>.",
-       "apierror-invalidoldimage": "O parámetro oldimage ten un formato incorrecto.",
+       "apierror-invalidoldimage": "O parámetro <var>oldimage</var> ten un formato incorrecto.",
        "apierror-invalidparammix-cannotusewith": "O parámetro <kbd>$1</kbd> non pode usarse xunto con <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "O parámetro <kbd>$1</kbd> só pode usarse xunto con <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> non se pode combinar cos parámetros <var>oldid</var>, <var>pageid</var> e <var>page</var>. Por favor, utilice <var>title</var> e <var>text</var>.",
        "apierror-invalidparammix": "{{PLURAL:$2|Os parámetros}} $1 non poden usarse xuntos.",
-       "apierror-invalidsection": "O parámetro sección debe ser un ID de sección válido ou <kbd>new</kbd>.",
+       "apierror-invalidsection": "O parámetro <var>section</var> debe ser un ID de sección válido ou <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "O código hash SHA1Base36 proporcionado non é correcto.",
        "apierror-invalidsha1hash": "O código hash SHA1 proporcionado non é correcto.",
        "apierror-invalidtitle": "Título incorrecto \"$1\".",
        "apierror-invalidurlparam": "Valor non válido para <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
        "apierror-invaliduser": "Nome de usuario incorrecto \"$1\".",
+       "apierror-invaliduserid": "O identificador de usuario <var>$1</var> non é válido.",
        "apierror-maxlag-generic": "Esparando por un servidor de base de datosː $1 {{PLURAL:$1|segundo|segundos}} de atraso.",
        "apierror-maxlag": "Esperando por $2: $1 {{PLURAL:$1|segundo|segundos}} de atraso.",
-       "apierror-mimesearchdisabled": "A busca MIME está desactivada no modo Miser (tacaño).",
+       "apierror-mimesearchdisabled": "A busca MIME está desactivada no modo Miser (avaro).",
+       "apierror-missingcontent-pageid": "Falta contido para a páxina con identificador $1.",
+       "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|O parámetro|Polo menos un dos parámetros}} $1 é necesario.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|O parámetro|Un dos parámetros}} $1 é necesario.",
        "apierror-missingparam": "O parámetro <var>$1</var> debe estar definido.",
+       "apierror-missingrev-pageid": "Non hai ningunha revisión actual da páxina con ID $1.",
+       "apierror-missingtitle-createonly": "Os títulos faltantes só se poden protexer con <kbd>create</kbd>.",
        "apierror-missingtitle": "A páxina que especificou non existe.",
        "apierror-missingtitle-byname": "A páxina $1 non existe.",
        "apierror-moduledisabled": "O módulo <kbd>$1</kbd> foi deshabilitado.",
        "apierror-multival-only-one-of": "Só {{PLURAL:$3|se permite o valor|se permiten os valores}} $2 para o parámetro <var>$1</var>.",
        "apierror-multival-only-one": "Só se permite un valor para o parámetro <var>$1</var>.",
        "apierror-multpages": "<var>$1</var> non se pode utilizar máis que con unha soa páxina.",
+       "apierror-mustbeloggedin-changeauth": "Debe estar conectado para poder cambiar os datos de autentificación.",
+       "apierror-mustbeloggedin-generic": "Debe estar conectado.",
+       "apierror-mustbeloggedin-linkaccounts": "Debe estar conectado para ligar contas.",
+       "apierror-mustbeloggedin-removeauth": "Debe estar conectado para borrar datos de autentificación.",
+       "apierror-mustbeloggedin": "Debe estar conectado para $1.",
+       "apierror-mustbeposted": "O módulo <kbd>$1</kbd> require unha petición POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Atopouse o seguinte parámetro|Atopáronse os seguintes parámetros}} na cadea da consulta, pero deben estar no corpo do POST: $1.",
+       "apierror-noapiwrite": "A edición deste wiki a través da API está deshabilitada. Asegúrese de que a declaración <code>$wgEnableWriteAPI=true;</code> está incluída no ficheiro <code>LocalSettings.php</code> da wiki.",
+       "apierror-nochanges": "Non se solicitou ningún cambio.",
+       "apierror-nodeleteablefile": "Non existe esa versión antiga do ficheiro.",
+       "apierror-no-direct-editing": "A edición directa a través da API non é compatible co modelo de contido $1 utilizado por $2.",
        "apierror-noedit-anon": "Os usuarios anónimos non poden editar páxinas.",
        "apierror-noedit": "Non ten permisos para editar páxinas.",
+       "apierror-noimageredirect-anon": "Os usuarios anónimos non poden crear redireccións de imaxes.",
+       "apierror-noimageredirect": "Non ten permiso para crear redireccións de imaxes.",
+       "apierror-nosuchlogid": "Non hai ningunha entrada de rexistro con identificador $1.",
+       "apierror-nosuchpageid": "Non hai ningunha páxina con identificador $1.",
+       "apierror-nosuchrcid": "Non hai ningún cambio recente con identificador $1.",
+       "apierror-nosuchrevid": "Non hai ningunha revisión con identificador $1.",
        "apierror-nosuchsection": "Non hai ningunha sección $1.",
        "apierror-nosuchsection-what": "Non hai ningunha sección $1 en $2.",
+       "apierror-nosuchuserid": "Non hai ningún usuario con identificador $1.",
+       "apierror-notarget": "Non indicou un destino válido para esta acción.",
+       "apierror-notpatrollable": "A revisión r$1 non pode patrullarse por ser demasiado antiga.",
+       "apierror-opensearch-json-warnings": "Non se poden representar os avisos en formato JSON de OpenSearch.",
+       "apierror-pagecannotexist": "O espazo de nomes non permite as páxinas actuais.",
+       "apierror-pagelang-disabled": "Neste wiki non se pode cambiar a lingua dunha páxina.",
+       "apierror-paramempty": "O parámetro <var>$1</var> non pode estar baleiro.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> só está soportado para o contido wikitexto.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> só está soportado para o contido wikitexto. $1 usa o modelo de contido $2.",
+       "apierror-pastexpiry": "A tempo de caducidade \"$1\" está no pasado.",
+       "apierror-permissiondenied": "Non ten permiso para $1.",
        "apierror-permissiondenied-generic": "Permisos rexeitados.",
+       "apierror-permissiondenied-unblock": "Non ten permiso para desbloquear usuarios.",
+       "apierror-prefixsearchdisabled": "A busca de prefixo está desactivada no modo Miser (avaro).",
+       "apierror-promised-nonwrite-api": "A cabeceira HTTP <code>Promise-Non-Write-API-Action</code> non se pode enviar a módulos da API en modo escritura.",
        "apierror-protect-invalidaction": "Tipo de protección \"$1\" non válido.",
        "apierror-protect-invalidlevel": "Nivel de protección \"$1\" non válido.",
+       "apierror-ratelimited": "Superou o seu límite de rango. Agarde uns minutos e inténteo de novo",
        "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-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-sectionsnotsupported": "As seccións non son compatibles co modelo de contido $1.",
+       "apierror-sectionsnotsupported-what": "As seccións non son compatibles con $1.",
+       "apierror-show": "Parámetro incorrecto - non se poden proporcionar valores mutuamente excluíntes.",
+       "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostNames</var> teña valor verdadeiro.",
+       "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-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-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-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-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
        "apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
        "apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
        "apiwarn-invalidtitle": "\"$1\" non é un título válido.",
        "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-validationfailed-badpref": "non é unha preferencia válida.",
+       "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.",
+       "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)",
        "api-usage-docref": "Consulte $1 para ver o uso da API.",
        "api-exception-trace": "$1 en $2($3)\n$4",
index e684be5..f10334a 100644 (file)
@@ -12,7 +12,9 @@
                        "Umherirrender",
                        "Macofe",
                        "MojoMann",
-                       "Mikey641"
+                       "Mikey641",
+                       "Esh77",
+                       "שמזן"
                ]
        },
        "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]].",
@@ -45,6 +47,7 @@
        "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
+       "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ <kbd>192.0.2.5</kbd> לשלושה ימים עם הסיבה <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "חסימת המשתמש <kbd>Vandal</kbd> ללא הגבלת זמן עם הסיבה <kbd>Vandalism</kbd>, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.",
        "apihelp-changeauthenticationdata-description": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
@@ -88,7 +91,7 @@
        "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1title</var>.",
        "apihelp-delete-param-reason": "סיבת המחיקה. אם לא הוגדרה, תתווסף סיבה שנוצרה אוטומטית.",
-       "apihelp-delete-param-tags": "×\9cשנ×\95ת ×\90ת ×\94ת×\92×\99×\9d ×\9b×\93י שיחולו על העיול ביומן המחיקה.",
+       "apihelp-delete-param-tags": "ת×\92×\99 ×©×\99× ×\95י שיחולו על העיול ביומן המחיקה.",
        "apihelp-delete-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-delete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
        "apihelp-import-param-templates": "ליבוא בין אתרי ויקי: לייבא גם את כל התבניות המוכללות.",
        "apihelp-import-param-namespace": "לייבא למרחב השם הזה. לא ניתן להשתמש בזה יחד עם <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "לייבא בתור תת־משנה של הדף הזה. לא ניתן להשתמש בזה יחד עם <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "תגי שינוי שיחולו על העיול ביומן הייבוא ולגרסה הריקה בדפים המיובאים.",
        "apihelp-import-example-import": "לייבא את [[meta:Help:ParserFunctions]] למרחב השם 100 עם היסטוריה מלאה.",
        "apihelp-linkaccount-description": "קישור חשבון של ספק צד־שלישי למשתמש הנוכחי.",
        "apihelp-linkaccount-example-link": "תחילת תהליך הקישור לחשבון מ־<kbd>Example</kbd>.",
        "apihelp-managetags-param-tag": "תג ליצירה, מחיקה, הפעלה או כיבוי. ליצירת תג, התג לא צריך להיות קיים. למחיקת תג, התג צריך להיות קיים. להפעלת תג, התג צריך להתקיים ולא להיות בשימוש של הרחבה. לכיבוי תג, התג צריך להיות קיים ומוגדר ידנית.",
        "apihelp-managetags-param-reason": "סיבה אופציונלית ליצירה, מחיקה, הפעלה או כיבוי של תג.",
        "apihelp-managetags-param-ignorewarnings": "האם להתעלם מכל האזהרות שמופיעות תוך כדי הפעולה.",
+       "apihelp-managetags-param-tags": "תגי השינוי שיחולו על העיול ביומן ניהול התגים.",
        "apihelp-managetags-example-create": "יצירת תג בשם <kbd>spam</kbd> עם הסיבה <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "מחיקת התג <kbd>vandlaism</kbd> עם הסיבה <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "הפעלת התג <kbd>spam</kbd> עם הסיבה <kbd>For use in edit patrolling</kbd>",
        "apihelp-move-param-unwatch": "הסרת הדף וההפניה מרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-move-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-move-param-ignorewarnings": "להתעלם מכל האזהרות.",
+       "apihelp-move-param-tags": "תגי שינוי שיחולו על העיול ביומן ההעברות ולגרסה הריקה בדף היעד.",
        "apihelp-move-example-move": "העברת <kbd>Badtitle</kbd> ל־<kbd>Goodtitle</kbd> בלי להשאיר הפניה.",
        "apihelp-opensearch-description": "חיפוש בוויקי בפרוטוקול OpenSearch.",
        "apihelp-opensearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-patrol-param-rcid": "מזהה שינויים אחרונים לניטור.",
        "apihelp-patrol-param-revid": "מזהה גרסה לניטור.",
        "apihelp-patrol-param-tags": "תגי שינוי שיחולו על העיול ביומן הניטור.",
-       "apihelp-patrol-example-rcid": "×\9c× ×\98ר ×¢×\99×\95×\9c משינויים אחרונים.",
+       "apihelp-patrol-example-rcid": "×\9c× ×\98ר ×¨×©×\95×\9e×\94 משינויים אחרונים.",
        "apihelp-patrol-example-revid": "לנטר גרסה.",
        "apihelp-protect-description": "לשנות את רמת ההגנה של דף.",
        "apihelp-protect-param-title": "כותרת הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1pageid.",
        "apihelp-protect-example-protect": "הגנה על דף.",
        "apihelp-protect-example-unprotect": "להסיר את ההגנה מהדף על־ידי הגדרת מגבלות על <kbd>all</kbd> (למשל: כולם מורשים לבצע את הפעולה).",
        "apihelp-protect-example-unprotect2": "הסרת הגנה מדף על־ידי הגדרה של אפס הגבלות.",
-       "apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.\n\nדורש בקשת POST אם המשתמש לא נכנס לחשבון.",
+       "apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.",
        "apihelp-purge-param-forcelinkupdate": "עדכון טבלאות הקישורים.",
        "apihelp-purge-param-forcerecursivelinkupdate": "עדכון טבלת הקישורים ועדכון טבלאות הקישורים עבור כל דף שמשתמש בדף הזה בתור תבנית.",
        "apihelp-purge-example-simple": "ניקוי המטמון של הדפים <kbd>Main Page</kbd> ו־<kbd>API</kbd>.",
        "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-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות <var>$1inlanguagecode</var>, אחרת זה יהיה בשפת התוכן).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.",
        "apihelp-query+usercontribs-param-end": "באיזה חותם־הזמן לסיים",
        "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות. לא יכול לשמש עם <var>$1userids</var> או <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-userprefix": "אחזור תרומות עבור כל המשתמשים שהשמות שלהם מתחילים בערך הזה. לא יכול לשמש עם <var>$1user</var> או <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "מזהי המשתמשים לאחזור תרומות.  לא יכול לשמש עם  <var>$1user</var> או <var>$1userprefix</var>.",
        "apihelp-query+usercontribs-param-namespace": "לרשום רק תרומות במרחבי השם האלה.",
        "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "הוספת מזהה הדף ומזהה הגרסה.",
        "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-revisiondelete-param-reason": "סיבה למחיקה או לשחזור ממחיקה.",
        "apihelp-revisiondelete-param-tags": "אילו תגים להחיל על העיול ביומן המחיקה.",
        "apihelp-revisiondelete-example-revision": "הסתרת התוכן של הגרסה <kbd>12345</kbd> בדף <kbd>Main Page</kbd>.",
-       "apihelp-revisiondelete-example-log": "×\94סתרת ×\9b×\9c ×\94נת×\95×\94×\99×\9d ×¢×\9c ×¢×\99×\95×\9c היומן <kbd>67890</kbd> עם הסיבה <kbd>BLP violation</kbd>.",
+       "apihelp-revisiondelete-example-log": "×\94סתרת ×\9b×\9c ×\94נת×\95× ×\99×\9d ×¢×\9c ×¨×©×\95×\9eת היומן <kbd>67890</kbd> עם הסיבה <kbd>BLP violation</kbd>.",
        "apihelp-rollback-description": "ביטול העריכה האחרונה לדף.\n\nאם המשמש האחרון שערך את הדף עשה מספר עריכות זו אחר זו, הן תשוחזרנה.",
        "apihelp-rollback-param-title": "שם הדף לשחזור. לא יכול לשמש יחד עם <var>$1pageid</var>.",
        "apihelp-rollback-param-pageid": "מזהה הדף לשחזור. לא יכול לשמש יחד עם <var>$1title</var>.",
        "apihelp-setpagelanguage-description": "שנה את השפה של דף",
        "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw: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-setpagelanguage-param-reason": "הסיבה לשינוי.",
        "apihelp-setpagelanguage-param-tags": "אילו תגי שינוי להחיל על העיול ביומן שמתבצע כתוצאה מהפעולה הזאת.",
+       "apihelp-setpagelanguage-example-language": "שינוי השפה של <kbd>Main Page</kbd> לבסקית.",
+       "apihelp-setpagelanguage-example-default": "שינוי השפה של הדף בעל המזהה 123 לשפה הרגילה של הוויקי.",
        "apihelp-stashedit-description": "הכנת עריכה במטמון משותף.\n\nזה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.",
        "apihelp-stashedit-param-title": "כותרת הדף הנערך.",
        "apihelp-stashedit-param-section": "מספר הפסקה. <kbd>0</kbd> עבור הפסקה הראשונה, <kbd>new</kbd> עבור פסקה חדשה.",
        "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.",
        "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.",
        "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.",
-       "apihelp-tag-param-logid": "×\9e×\96×\94×\94 ×¢×\99×\95×\9c ×\99×\95×\9e×\9f ×\90×\97×\93 ×\90×\95 ×\99×\95תר ×©×ª×\92 ×\99ת×\95×\95סף ×\90×\9c×\99×\95 ×\90×\95 ×\99×\95סר ×\9e×\9e× ×\95.",
+       "apihelp-tag-param-logid": "×\9e×\96×\94×\94 ×¨×©×\95×\9eת ×\99×\95×\9e×\9f ×\90×\97ת ×\90×\95 ×\99×\95תר ×©×ª×\92 ×\99ת×\95×\95סף ×\90×\9c×\99×\94 ×\90×\95 ×\99×\95סר ×\9e×\9e× ×\94.",
        "apihelp-tag-param-add": "התגים להוספה. אפשר להוסיף רק תגים קיימים.",
        "apihelp-tag-param-remove": "תגים להסרה. רק תגים שהוגדרו ידנית או שאינם מוגדרים כלל יכולים להיות מוסרים.",
        "apihelp-tag-param-reason": "סיבה לשינוי.",
-       "apihelp-tag-param-tags": "×\90×\99×\9c×\95 ×ª×\92×\99×\9d ×\9c×\94×\97×\99×\9c ×¢×\9c ×¢×\99×\95×\9c ×\94×\99×\95×\9e×\9f ×©×\99יווצר כתוצאה מהפעולה הזאת.",
+       "apihelp-tag-param-tags": "×\90×\99×\9c×\95 ×ª×\92×\99×\9d ×\9c×\94×\97×\99×\9c ×¢×\9c ×¨×©×\95×\9eת ×\94×\99×\95×\9e×\9f ×©×ªיווצר כתוצאה מהפעולה הזאת.",
        "apihelp-tag-example-rev": "הוספת התג <kbd>vandalism</kbd> לגרסה עם המזהה 123 בלי לציין סיבה",
        "apihelp-tag-example-log": "הסרת התג <kbd>spam</kbd> מעיול עם המזהה 123 עם הסיבה <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-unblock-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-unblock-example-id": "לשחרר את החסימה עם מזהה #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "לשחרר את החסימה של המשתמש <kbd>Bob</kbd> עם הסיבה <kbd>Sorry Bob</kbd>.",
-       "apihelp-undelete-description": "שחזור גרסאות של דף מחוק.\n\nאפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "שחזור גרסאות של דף מחוק.\n\nאפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "שם הדף לשחזור ממחיקה.",
        "apihelp-undelete-param-reason": "סיבה לשחזור.",
        "apihelp-undelete-param-tags": "תגי שינוי שיחולו על העיול ביומן המחיקה.",
        "apihelp-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.",
        "apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.",
        "apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.",
-       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91×\99×\99×\98ים.",
+       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94פ×\9c×\97 ×\91×\91תים.",
        "apihelp-upload-param-chunk": "תוכן החתיכה.",
        "apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.",
        "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.",
        "apihelp-userrights-description": "שינוי חברות בקבוצות של המשתמש.",
        "apihelp-userrights-param-user": "שם משתמש.",
        "apihelp-userrights-param-userid": "מזהה משתמש.",
-       "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו.",
+       "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו, ואם הוא כבר חבר, עדכון זמן התפוגה של החברות בקבוצה הזאת.",
+       "apihelp-userrights-param-expiry": "חותמי־זמן תפוגה. יכולים להיות יחסיים (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלטים (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם מוגדר רק חותם־זמן אחד, הוא ישמש לכל הקבוצות שהועברו לפרמטר <var>$1add</var>. יש להשתמש ב־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>‏, <kbd>infinity</kbd>, או <kbd>never</kbd> בשביל קבוצת משתמשים שאינה פגה לעולם.",
        "apihelp-userrights-param-remove": "הסרת משתמש מהקבוצות האלו.",
        "apihelp-userrights-param-reason": "סיבה לשינוי.",
        "apihelp-userrights-param-tags": "לשנות את התגים שיוחלו על העיול ביומן הרשאות המשתמש.",
        "apihelp-userrights-example-user": "הוספת המשתמש <kbd>FooBot</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "הוספת המשתמש עם המזהה <kbd>123</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "להוסיף את <kbd>SometimeSysop</kbd> לקבוצה <kbd>sysop</kbd> לחודש אחד.",
        "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
        "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
        "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
        "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
        "apierror-blocked": "נחסמת מעריכה.",
        "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+       "apierror-cannot-async-upload-file": "הפרמטרים  <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
        "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
        "apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
        "apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
        "apierror-integeroutofrange-abovemax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור משתמשים.",
        "apierror-integeroutofrange-belowminimum": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3).",
        "apierror-invalidcategory": "שם הקטגוריה שהזנת אינו תקין.",
+       "apierror-invalid-chunk": "ההיסט בתוספת הפלח הנוכחי גדולים מגודל הקובץ כפי שנטען.",
+       "apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
        "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
+       "apierror-invalidlang": "קוד שפה בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-invalidoldimage": "הפרמטר <var>oldimage</var> נשלח בתסדיר בלתי־תקין.",
+       "apierror-invalidparammix-cannotusewith": "הפרמטר <kbd>$1</kbd> אינו יכול לשמש עם <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "הפרמטר <kbd>$1</kbd> יכול לשמש רק עם <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "לא ניתן לשלב את <kbd>section=new</kbd> עם הפרמטרים <var>oldid</var>‏, <var>pageid</var> או <var>page</var>. נא להשתמש ב־<var>title</var> ו־<var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|הפרמטרים}} $1 אינם יכולים לשמש יחדיו.",
+       "apierror-invalidsection": "הפרמטר <var>section</var> להיות מזהה מקטע תקין או <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "גיבוב ה־SHA1Base36 שסופק אינו תקין.",
+       "apierror-invalidsha1hash": "גיבוב ה־SHA1 שסופק אינו תקין.",
        "apierror-invalidtitle": "כותרת רעה \"$1\".",
+       "apierror-invalidurlparam": "ערך בלתי־תקין עבור <var>$1urlparam</var> (ערך: <kbd>$2=$3</kbd>).",
        "apierror-invaliduser": "שם משתמש בלתי־תקין \"$1\".",
+       "apierror-invaliduserid": "מזהה המשתמש <var>$1</var> אינו תקין.",
+       "apierror-maxlag-generic": "ממתין לשרת מסד נתונים: עיכוב של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
        "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
+       "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
+       "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
+       "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
+       "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
+       "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
+       "apierror-missingrev-pageid": "אין גרסה נוכחית של דף עם המזהה $1.",
+       "apierror-missingtitle-createonly": "כותרות חסרות יכולות להיות מוגנות עם <kbd>create</kbd>.",
+       "apierror-missingtitle": "הדף שנתת אינו קיים.",
+       "apierror-missingtitle-byname": "הדף $1 אינו קיים.",
+       "apierror-moduledisabled": "המודול <kbd>$1</kbd> כובה.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|רק הערך|רק אחד מתוך הערכים}} $2 מותר עבור הפרמטר <var>$1</var>.",
+       "apierror-multival-only-one": "רק ערך אחד מותר עבור הפרמטר <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> יכול לשמש רק בדף בודד.",
+       "apierror-mustbeloggedin-changeauth": "יש להיכנס לחשבון כדי לשנות נתוני אימות.",
        "apierror-mustbeloggedin-generic": "חובה להיכנס.",
        "apierror-mustbeloggedin-linkaccounts": "חובה להיכנס לחשבון כדי לקשר חשבונות.",
        "apierror-mustbeloggedin-removeauth": "חובה להיכנס לחשבון כדי להסיר מידע אימות.",
        "apierror-mustbeloggedin-uploadstash": "סליק ההעלאה זמין רק למשתמשים שנכנסו לחשבון.",
        "apierror-mustbeloggedin": "חובה להיכנס לחשבון כדי $1.",
+       "apierror-mustbeposted": "המודול <kbd>$1</kbd> דורש בקשת POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|הפרמטר הבא|הפרמטרים הבאים}} נמצאו במחרוזת השאילתה, אבל חייבים להיות ב־POST בגוף: $1.",
+       "apierror-noapiwrite": "עריכת הוויקי הזה דרך ה־API כובתה. נא לוודא שהמשפט <code dir=\"ltr\">$wgEnableWriteAPI=true;</code> כלול בקובץ <code>LocalSettings.php</code> של הוויקי.",
        "apierror-nochanges": "לא התבקשו שינויים.",
        "apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
        "apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$2}}.",
        "apierror-noedit-anon": "משתמשים אלמוניים אינם יכולים לערוך דפים.",
-       "apierror-nosuchlogid": "אין עיול יומן עם המזהה $1.",
+       "apierror-noedit": "אין לך הרשאה לערוך דפים.",
+       "apierror-noimageredirect-anon": "משתמשים אלמוניים אינם יכולים ליצור הפניות לתמונות.",
+       "apierror-noimageredirect": "אין לך הרשאה ליצור הפניות לתמונות.",
+       "apierror-nosuchlogid": "אין רשומה ביומן עם המזהה $1.",
+       "apierror-nosuchpageid": "אין דף עם המזהה $1.",
+       "apierror-nosuchrcid": "לא נעשה לאחרונה שינוי עם המזהה $1.",
+       "apierror-nosuchrevid": "אין גרסה עם המזהה $1.",
+       "apierror-nosuchsection": "לא קיים מקטע $1.",
+       "apierror-nosuchsection-what": "אין מקטע $1 ב{{GRAMMAR:תחילית|$2}}.",
+       "apierror-nosuchuserid": "אין משתמש עם המזהה $1.",
+       "apierror-notarget": "לא נתת יעד תקין לפעולה הזאת.",
+       "apierror-notpatrollable": "לא ניתן לנטר את הגרסה $1 כי היא ישנה מדי.",
+       "apierror-nouploadmodule": "לא הוגדר מודול העלאה.",
+       "apierror-opensearch-json-warnings": "לא ניתן לייצג את האזהרות בתסדיר JSON של OpenSearch.",
+       "apierror-pagecannotexist": "מרחב השם אינו מתיר דפים אמתיים.",
+       "apierror-pagedeleted": "הדף הזה נמחק מאז שאחזרת את חותם הזמן שלו.",
+       "apierror-pagelang-disabled": "שינוי שפת הדף אסור בוויקי הזה.",
+       "apierror-paramempty": "הפרמטר <var>$1</var> אינו יכול להיות ריק.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext).",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-pastexpiry": "זמן התפוגה \"$1\" בעבר.",
+       "apierror-permissiondenied": "אין לך הרשאה $1.",
+       "apierror-permissiondenied-generic": "ההרשאה נדחתה.",
+       "apierror-permissiondenied-patrolflag": "עליך להחזיק בהרשאות <code>patrol</code> או <code>patrolmarks</code> כדי לבקש דגל מנוטר.",
+       "apierror-permissiondenied-unblock": "אין לך הרשאה לשחרר חסימה של משתמשים.",
+       "apierror-prefixsearchdisabled": "חיפוש תחילית כבוי במצב קמצן.",
+       "apierror-promised-nonwrite-api": "כותר <code>Promise-Non-Write-API-Action</code> של HTTP אינו יכול להישלח למודולי API שפועלים במצב כתיבה.",
+       "apierror-protect-invalidaction": "סוג הגנה בלתי־תקין \"$1\".",
+       "apierror-protect-invalidlevel": "קמת הגנה בלתי־תקינה \"$1\".",
+       "apierror-ratelimited": "עברת את מכסת הקצב שלך. נא להמתין זמן־מה ונסות שוב.",
+       "apierror-readapidenied": "יש צורך בהרשאת קריאה כדי להשתמש במודול הזה.",
+       "apierror-readonly": "הוויקי הזה במצב לקריאה בלבד עכשיו.",
+       "apierror-reauthenticate": "לא עברת אימות לאחרונה בשיחה הזאת, נא להתאמת מחדש.",
+       "apierror-redirect-appendonly": "ניסית לערוך במצב מעבר־אחר־הפניות (redirect-following), שצריך לשמש יחד עם <kbd>section=new</kbd>‏, <var>prependtext</var>, או <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "אותו השדה אינו יכול לשמש עם <var>hide</var> ועם <var>show</var>.",
+       "apierror-revdel-needtarget": "כותרת יעד נחוצה בשביל סוג ה־RevDel הזה.",
+       "apierror-revdel-paramneeded": "לפחות ערך אחד נחוץ בשביל <var>hide</var> או <var>show</var>.",
+       "apierror-revisions-norevids": "הפרמטר <var>revids</var> אינו יכול לשמש עם אפשרויות הרשימה (<var>$1limit</var>‏, <var>$1startid</var>‏, <var>$1endid</var>‏, <kbd>$1dir=newer</kbd>‏, <var>$1user</var>‏, <var>$1excludeuser</var>‏, <var>$1start</var>, ו־<var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>‏, <var>pageids</var> או מחולל שימשו לאספקת דפים מרובים, אבל הפרמטרים <var>$1limit</var>‏, <var>$1startid</var>‏, <var>$1endid</var>‏, <kbd>$1dir=newer</kbd>‏, <var>$1user</var>‏, <var>$1excludeuser</var>‏, <var>$1start</var>, ו־<var>$1end</var> יכולים לשמש רק בדף בודד.",
+       "apierror-revwrongpage": "הגרסה $1 אינה גרסה של $2.",
+       "apierror-searchdisabled": "חיפוש <var>$1</var> כבוי.",
+       "apierror-sectionreplacefailed": "לא היה אפשר למזג את המקטע המעודכן.",
+       "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
+       "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
+       "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
+       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostNames</var> מוגדר להיות true.",
+       "apierror-sizediffdisabled": "ההבדל בגודל כבוי במצב קמצן.",
+       "apierror-spamdetected": "העריכה שלך סורבה כי הכילה חלק ספאם: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "אין לך הרשאה להציג את התוצאות של הדף המיוחד הזה.",
+       "apierror-stashedfilenotfound": "לא היה אפשר למצור את הקובץ בסליק: $1.",
+       "apierror-stashedit-missingtext": "לא נמצא טקסט מוסלק עם הגיבוב שניתן.",
+       "apierror-stashfailed-complete": "העלאה מפולחת הושלמה, יש לבדוק את המצב בשביל לראות פרטים.",
+       "apierror-stashfailed-nosession": "אין שיחת העלאה מפולחת עם המפתח הזה.",
+       "apierror-stashfilestorage": "לא היה אפשר לאחסן את ההעלאה בסליק: $1",
        "apierror-stashinvalidfile": "קובץ מוסלק בלתי־תקין.",
        "apierror-stashnosuchfilekey": "אין מפתח קובץ כזה: $1.",
        "apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
        "apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
        "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
        "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+       "apierror-templateexpansion-notwikitext": "הרחבת תבניות נתמכת רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-toofewexpiries": "{{PLURAL:$1|ניתן חותם זמן תפוגה אחד|ניתנו $1 חותמי זמן תפוגה}} כאשר {{PLURAL:$2|היה נחוץ אחד|היו נחוצים $1}}.",
+       "apierror-unknownaction": "הפעולה שניתנה, <kbd>$1</kbd>, אינה מוכרת.",
+       "apierror-unknownerror-editpage": "שגיאת EditPage בלתי־ידועה: $1.",
        "apierror-unknownerror-nocode": "שגיאה בלתי־ידועה.",
        "apierror-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
        "apierror-unknownformat": "תסדיר בלתי־ידוע \"$1\".",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|פרמטר בלתי־מוכר|פרמטרים בלתי־מוכרים}}: $1.",
+       "apierror-unrecognizedvalue": "לפרמטר <var>$1</var> יש ערך בלתי־מוכר: $2.",
+       "apierror-unsupportedrepo": "מאגר קבצים מקומי אינו תומך בשאילתה לכל התמונות.",
        "apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
        "apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
+       "apierror-upload-inprogress": "העלאה מתוך סליק כבר התחילה.",
        "apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+       "apierror-urlparamnormal": "לא היה אפשר לנרמל את פרמטרי התמונה עבור $1.",
+       "apierror-writeapidenied": "אין לך הרשאה לערוך את הוויקי הזה דרך ה־API.",
+       "apiwarn-alldeletedrevisions-performance": "לביצועים טובים יותר בעת יצירת כותרת, יש להשתמש ב־<kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
+       "apiwarn-badutf8": "הערך הערך שהועבר ל־<var>$1</var> מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC ללא תווי בקרה C0 למעט HT (\\t)‏, LF (\\n), ו־CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
+       "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
+       "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
+       "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "כניסה בחשבון ראשי עם <kbd>action=login</kbd> מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "אחזור אסימון דרך <kbd>action=login</kbd> מיושן. נא להשתמש ב־<kbd>action=query&meta=tokens&type=login</kbd> במקום זה.",
+       "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
+       "apiwarn-deprecation-purge-get": "שימוש ב־<kbd>action=purge</kbd> דרך GET מיושן. יש להשתמש ב־POST במקום זה.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
+       "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
+       "apiwarn-errorprinterfailed": "מדפיס השגיאות לא עבד. ינסה שוב ללא פרמטרים.",
+       "apiwarn-errorprinterfailed-ex": "מדפיס השגיאות לא עבד (ינסה שוב ללא פרמטרים): $1",
        "apiwarn-invalidcategory": "\"$1\" אינה קטגוריה.",
        "apiwarn-invalidtitle": "\"$1\" אינה כותרת תקינה.",
+       "apiwarn-invalidxmlstylesheetext": "לגיליון הסגנונות אמור להיות הסיומת <code dir=\"ltr\">.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "ניתן גיליון סגנונות שאינו תקין או אינו קיים.",
+       "apiwarn-invalidxmlstylesheetns": "גיליון הסגנונות אמור להיות במרחב השם {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "המאפיין <kbd>modules</kbd> לא הוגדר, אבל לא <kbd>jsconfigvars</kbd> או <kbd>encodedjsconfigvars</kbd>. משתני הגדרות נחוצים בשביל שימוש נכון במודולים.",
        "apiwarn-notfile": "\"$1\" אינו קובץ.",
+       "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-tokens-origin": "לא ניתן לקבל אסימונים כשמדיניות המקור הזהה אינה חלה.",
+       "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>. המגבלה היא $2.",
+       "apiwarn-truncatedresult": "התוצאה נחתכה כי אחרת היא הייתה ארוכה מהמגבלה של $1 בתים.",
+       "apiwarn-unclearnowtimestamp": "העברת \"$2\" בתור פרמטר חותם־זמן <var>$1</var> הוצהרה בתור מיושנת. אם מסיבה כלשהי אתם צריכים להגדיר במפורש את הזמן הנוכחי ללא חישובו בצד הלקוח, יש להשתמש ב־<kbd>now</kbd>.",
+       "apiwarn-unrecognizedvalues": "לפרמטר <var>$1</var> היתנ ג{{PLURAL:$3|ניתן ערך בלתי־ידוע|ניתנו ערכים בלתי־ידועים}}: $2.",
+       "apiwarn-unsupportedarray": "הפרמטר <var>$1</var> משתמש בתחביר מערכים שאינו נתמך ב־PHP.",
+       "apiwarn-urlparamwidth": "התעלמות מרוחב (width) שהוגדר ב־<var>$1urlparam</var> (ערך: $2) לטובת רוחב שנגזר מ־<var>$1urlwidth</var>/<var>$1urlheight</var> (ערך: $3).",
+       "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": "לא יכולה להיות מוגדרת על־ידי המודול הזה.",
        "apiwarn-validationfailed-keytoolong": "המפתח ארוך מדי (מותר לכתוב לא יותר מ־$1 בתים).",
        "apiwarn-wgDebugAPI": "<strong>אזהרת אבטחה</strong>: <var dir=\"ltr\">$wgDebugAPI</var> מופעל.",
        "api-feed-error-title": "שגיאה ($1)",
        "api-usage-docref": "ר' $1 לשימוש ב־API.",
+       "api-usage-mailinglist-ref": "עשו מינוי לרשימת התפוצה mediawiki-api-announce בכתובת &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; בשביל הודעות על התיישנות API ושינויים שוברים.",
        "api-exception-trace": "$1 בקובץ $2 (שורה $3)\n$4",
        "api-credits-header": "קרדיטים",
        "api-credits": "מפתחי ה־API:\n* רואן קטאו (מפתח מוביל 2007–2009)\n* ויקטור וסילייב\n* בריאן טונג מין\n* סאם ריד\n* יורי אסטרחן (יוצר, מפתח מוביל מספטמבר 2006 עד ספטמבר 2007)\n* בראד יורש (מפתח מוביל מאז 2013)\n\nאנא שלחו הערות, הצעות ושאלות לכתובת mediawiki-api@lists.wikimedia.org או כתבו דיווח באג באתר https://phabricator.wikimedia.org."
index 727ce02..d84775f 100644 (file)
        "apihelp-protect-example-protect": "Proteggi una pagina.",
        "apihelp-protect-example-unprotect": "Sproteggi una pagina impostando restrizione su <kbd>all</kbd> (cioè a tutti è consentito intraprendere l'azione).",
        "apihelp-protect-example-unprotect2": "Sproteggi una pagina impostando nessuna restrizione.",
+       "apihelp-purge-description": "Pulisce la cache per i titoli indicati.",
        "apihelp-purge-param-forcelinkupdate": "Aggiorna la tabella dei collegamenti.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Aggiorna la tabella dei collegamenti per questa pagina, e per ogni pagina che usa questa pagina come template.",
        "apihelp-query-param-list": "Quali elenchi ottenere.",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
+       "apierror-invalidoldimage": "Il parametro <var>oldimage</var> ha un formato non valido.",
        "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
        "apierror-nosuchuserid": "Non c'è alcun utente con ID $1.",
        "api-credits-header": "Crediti"
index 49f8de7..e17b9ad 100644 (file)
        "apihelp-protect-example-protect": "ページを保護する。",
        "apihelp-protect-example-unprotect": "制限値を <kbd>all</kbd> にしてページの保護を解除する。",
        "apihelp-protect-example-unprotect2": "制限を設定されたページ保護を解除します。",
-       "apihelp-purge-description": "指定されたページのキャッシュをパージします。\n\n利用者がログインしていない場合は、 POST リクエストが必要です。",
+       "apihelp-purge-description": "指定されたページのキャッシュを破棄します。",
        "apihelp-purge-param-forcelinkupdate": "リンクテーブルを更新します。",
        "apihelp-purge-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>API</kbd> をパージする。",
        "apihelp-purge-example-generator": "標準名前空間にある最初の10ページをパージする。",
        "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
        "apihelp-query+usercontribs-param-limit": "返す投稿記録の最大数。",
-       "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。",
-       "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。$1user をオーバーライドします。",
+       "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。<var>$1userids</var> または <var>$1userprefix</var> とは同時に使用できません。",
+       "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。<var>$1user</var> または <var>$1userids</var> とは同時に使用できません。",
+       "apihelp-query+usercontribs-param-userids": "投稿記録を取得する利用者のID。<var>$1user</var> または <var>$1userprefix</var> とは同時に使用できません。",
        "apihelp-query+usercontribs-param-namespace": "この名前空間への投稿記録のみを一覧表示する。",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "ページIDと版IDを追加します。",
        "apihelp-query+usercontribs-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
        "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+watchlistraw-param-dir": "一覧表示する方向。",
        "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。",
+       "apihelp-resetpassword-example-user": "利用者 <kbd>Example</kbd> にパスワード再設定の電子メールを送信する。",
        "apihelp-revisiondelete-description": "版の削除および復元を行います。",
        "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
        "apihelp-revisiondelete-example-revision": "<kbd>Main Page</kbd> の版 <kbd>12345</kbd> の本文を隠す。",
        "apihelp-unblock-param-tags": "ブロック記録の項目に適用する変更タグ。",
        "apihelp-unblock-example-id": "ブロックID #<kbd>105</kbd> を解除する。",
        "apihelp-unblock-example-user": "<kbd>Sorry Bob</kbd> という理由で利用者 <kbd>Bob</kbd> のブロックを解除する。",
-       "apihelp-undelete-description": "削除されたページの版を復元します。\n\n削除された版の一覧 (タイムスタンプを含む) は[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。",
+       "apihelp-undelete-description": "削除されたページの版を復元します。\n\n削除された版の一覧 (タイムスタンプを含む) は[[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。",
        "apihelp-undelete-param-title": "復元するページ名。",
        "apihelp-undelete-param-reason": "復元の理由。",
        "apihelp-undelete-param-tags": "削除記録の項目に適用する変更タグ。",
        "api-help-permissions": "{{PLURAL:$1|権限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2",
        "api-help-open-in-apisandbox": "<small>[サンドボックスで開く]</small>",
+       "apierror-missingparam": "パラメーター <var>$1</var> を設定してください。",
        "api-credits-header": "クレジット",
        "api-credits": "API の開発者:\n* Roan Kattouw (2007年9月-2009年の主任開発者)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (作成者、2006年9月-2007年9月の主任開発者)\n* Brad Jorsch (2013年-現在の主任開発者)\n\nコメント、提案、質問は mediawiki-api@lists.wikimedia.org にお送りください。\nバグはこちらへご報告ください: https://phabricator.wikimedia.org/"
 }
index b91b806..30dec54 100644 (file)
@@ -84,6 +84,8 @@
        "apihelp-createaccount-param-language": "사용자에게 기본으로 설정할 언어 코드. (선택 사항, 기본값으로는 본문의 언어입니다)",
        "apihelp-createaccount-example-pass": "사용자 <kbd>testuser</kbd>를 만들고 비밀번호를 <kbd>test123</kbd>으로 설정합니다.",
        "apihelp-createaccount-example-mail": "사용자 <kbd>testmailuser</kbd>를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.",
+       "apihelp-cspreport-description": "브라우저가 콘텐츠 보안 정책의 위반을 보고하기 위해 사용합니다. 이 모듈은 SCP를 준수하는 웹 브라우저에 의해 자동으로 사용될 때를 제외하고는 사용해서는 안 됩니다.",
+       "apihelp-cspreport-param-reportonly": "강제적 정책이 아닌, 모니터링 정책에서 나온 보고서인 것으로 표시합니다",
        "apihelp-delete-description": "문서 삭제",
        "apihelp-delete-param-title": "삭제할 문서의 제목. <var>$1pageid</var>과 함께 사용할 수 없습니다.",
        "apihelp-delete-param-pageid": "삭제할 문서의 ID. <var>$1title</var>과 함께 사용할 수 없습니다.",
        "apihelp-edit-param-redirect": "자동으로 넘겨주기 처리하기.",
        "apihelp-edit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
        "apihelp-edit-example-edit": "문서 편집",
+       "apihelp-edit-example-undo": "자동 편집요약으로 13579판에서 13585판까지 되돌리기.",
        "apihelp-emailuser-description": "사용자에게 이메일을 보냅니다.",
        "apihelp-emailuser-param-target": "이메일을 받을 사용자.",
        "apihelp-emailuser-param-subject": "제목 헤더.",
        "apihelp-feedwatchlist-param-feedformat": "피드 포맷.",
        "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
+       "apihelp-filerevert-param-filename": "파일: 접두어가 없는 대상 파일 이름.",
        "apihelp-filerevert-param-comment": "업로드 댓글입니다.",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
-       "apihelp-help-description": "지정된 모듈의 도움말을 보여줍니다.",
+       "apihelp-help-description": "지정된 모듈의 도움말을 표시합니다.",
+       "apihelp-help-param-modules": "(<var>action</var>, <var>format</var> 변수의 값 또는 <kbd>main</kbd>)에 대한 도움말을 표시하는 모듈입니다. <kbd>+</kbd>로 하위 모듈을 지정할 수 있습니다.",
+       "apihelp-help-param-submodules": "명명된 모듈의 하위 모듈의 도움말을 포함합니다.",
+       "apihelp-help-param-recursivesubmodules": "하위 모듈의 도움말을 반복하여 포함합니다.",
        "apihelp-help-param-helpformat": "도움말 출력 포맷.",
+       "apihelp-help-param-wrap": "표준 API 응답 구조로 출력을 감쌉니다.",
+       "apihelp-help-param-toc": "HTML 출력에 목차를 포함합니다.",
        "apihelp-help-example-main": "메인 모듈의 도움말입니다.",
        "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.",
+       "apihelp-help-example-help": "도움말 모듈 자체에 대한 도움말입니다.",
+       "apihelp-help-example-query": "2개의 쿼리 하위 모듈의 도움말입니다.",
        "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.",
        "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.",
        "apihelp-import-param-xml": "업로드한 XML 파일.",
        "apihelp-opensearch-param-limit": "반환할 결과의 최대 수",
        "apihelp-opensearch-param-namespace": "검색할 이름공간.",
        "apihelp-opensearch-param-format": "출력 포맷.",
+       "apihelp-opensearch-example-te": "<kbd>Te</kbd>로 시작하는 문서를 찾기.",
        "apihelp-options-param-reset": "사이트 기본으로 설정 초기화",
        "apihelp-options-example-reset": "모든 설정 초기화",
        "apihelp-paraminfo-description": "API 모듈의 정보를 가져옵니다.",
        "apihelp-parse-example-page": "페이지의 구문을 분석합니다.",
        "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.",
        "apihelp-parse-example-summary": "요약을 구문 분석합니다.",
+       "apihelp-patrol-param-rcid": "점검할 최근 바뀜 ID입니다.",
+       "apihelp-patrol-param-revid": "점검할 판 ID입니다.",
+       "apihelp-patrol-example-rcid": "최근의 변경사항을 점검합니다.",
        "apihelp-patrol-example-revid": "판을 점검합니다.",
        "apihelp-protect-description": "문서의 보호 수준을 변경합니다.",
        "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.",
        "apihelp-protect-example-protect": "문서 보호",
+       "apihelp-purge-description": "주어진 제목을 위한 캐시를 새로 고침.",
        "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.",
        "apihelp-query-param-prop": "조회된 페이지에 대해 가져올 속성입니다.",
        "apihelp-query-param-list": "가져올 목록입니다.",
        "apihelp-query+allusers-description": "등록된 모든 사용자를 열거합니다.",
        "apihelp-query+allusers-param-dir": "정렬 방향.",
        "apihelp-query+allusers-param-prop": "포함할 정보:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "현재 차단된 사용자의 정보를 추가함.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
        "apihelp-query+allusers-param-witheditsonly": "편집을 한 사용자만 나열합니다.",
        "apihelp-query+allusers-example-Y": "<kbd>Y</kbd>로 시작하는 사용자를 나열합니다.",
        "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.",
        "apihelp-removeauthenticationdata-description": "현재 사용자의 인증 데이터를 제거합니다.",
+       "apihelp-resetpassword-description": "비밀번호 재설정 이메일을 사용자에게 보냅니다.",
+       "apihelp-resetpassword-param-user": "재설정할 사용자입니다.",
+       "apihelp-resetpassword-param-email": "재설정할 사용자의 이메일 주소입니다.",
+       "apihelp-resetpassword-example-user": "사용자 <kbd>Example</kbd>에게 비밀번호 재설정 이메일을 보냅니다.",
+       "apihelp-resetpassword-example-email": "<kbd>user@example.com</kbd> 이메일 주소를 가진 모든 사용자에 대해 비밀번호 재설정 이메일을 보냅니다.",
        "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.",
        "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.",
        "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
        "apihelp-unblock-param-userid": "차단을 해제할 사용자 ID입니다. <var>$1id</var> 또는 <var>$1user</var>와(과) 함께 사용할 수 없습니다.",
        "apihelp-unblock-param-reason": "차단 해제 이유.",
        "apihelp-unblock-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.",
+       "apihelp-upload-param-filename": "대상 파일 이름.",
        "apihelp-upload-param-ignorewarnings": "모든 경고를 무시합니다.",
        "apihelp-userrights-param-user": "사용자 이름.",
        "apihelp-userrights-param-userid": "사용자 ID.",
        "apierror-filenopath": "로컬 파일 경로를 가져올 수 없습니다.",
        "apierror-import-unknownerror": "알 수 없는 가져오기 오류: $1.",
        "apierror-invalidcategory": "입력한 분류 이름이 올바르지 않습니다.",
+       "apierror-invalidexpiry": "잘못된 만료 기한 \"$1\".",
        "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.",
-       "apierror-invalidoldimage": "oldimage 변수에 유효하지 않은 형식이 있습니다.",
+       "apierror-invalidoldimage": "<var>oldimage</var> 변수에 유효하지 않은 형식이 있습니다.",
        "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd> 변수는 <kbd>$2</kbd>와(과) 함께 사용할 수 없습니다.",
        "apierror-invalidsha1base36hash": "제공된 SHA1Base36 해시가 유효하지 않습니다.",
        "apierror-invalidsha1hash": "제공된 SHA1 해시가 유효하지 않습니다.",
index 3abfdeb..3045332 100644 (file)
@@ -13,8 +13,8 @@
        "apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
-       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
-       "apihelp-main-param-curtimestamp": "Ð\91клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82от.",
+       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во исходот.",
+       "apihelp-main-param-curtimestamp": "Ð\92клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ð¸Ñ\81Ñ\85одот.",
        "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како <kbd>https://mk.wikipedia.org</kbd>  or <kbd>https://meta.wikimedia.org</kbd>. Ако овој параметар не се совпаѓа со заглавието <code>Origin</code>:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе заглавието <code>Access-Control-Allow-Origin</code>.",
        "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> со <kbd>siprop=languages</kbd> или укажете <kbd>user</kbd> за да го користите тековно зададениот јазик корисникот, или пак укажете <kbd>content</kbd> за да го користите јазикот на содржината на ова вики.",
        "apihelp-block-description": "Блокирај корисник.",
@@ -79,7 +79,7 @@
        "apihelp-edit-param-tags": "Ознаки за измена што се однесуваат на преработката.",
        "apihelp-edit-param-minor": "Ситно уредување.",
        "apihelp-edit-param-notminor": "Неситно уредување.",
-       "apihelp-edit-param-bot": "Означи го уредувањево како ботско.",
+       "apihelp-edit-param-bot": "Означи го уредувањево како ботовско.",
        "apihelp-edit-param-basetimestamp": "Датум и време на преработката на базата, кои се користат за утврдување на спротиставености во уредувањето. Може да се добие преку [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Датум и време кога сте почнало уредувањето, кои се користат за утврдување на спротиставености во уредувањата. Соодветната вредност се добива користејќи <var>[[Special:ApiHelp/main|curtimestamp]]</var> кога ќе почнете со уредување (на пр. кога ќе се вчита содржината што ќе ја уредувате).",
        "apihelp-edit-param-recreate": "Занемари ги грешките што се појавуваат во врска со страницата што е избришана во меѓувреме.",
        "apihelp-expandtemplates-param-title": "Наслов на страница.",
        "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
        "apihelp-expandtemplates-param-revid": "Назнака на преработката, за <nowiki>{{REVISIONID}}</nowiki> и слични променливи.",
-       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, резултатот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
+       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, исходот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Проширениот викитекст.",
        "apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.",
        "apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).",
        "apihelp-feedcontributions-param-deletedonly": "Прикажувај само избришани придонеси.",
        "apihelp-feedcontributions-param-toponly": "Прикажувај само последни преработки.",
        "apihelp-feedcontributions-param-newonly": "Прикажувај само новосоздадени страници",
+       "apihelp-feedcontributions-param-hideminor": "Сокриј ситни уредувања.",
        "apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.",
        "apihelp-feedcontributions-example-simple": "Покажувај придонеси на <kbd>Пример</kbd>.",
        "apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.",
        "apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.",
-       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82иÑ\82е.",
+       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87и Ð¸Ñ\81Ñ\85одоÑ\82.",
        "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
        "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
-       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82ите.",
+       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\81Ñ\82авките.",
        "apihelp-feedrecentchanges-param-limit": "Највеќе ставки во исходот за прикажување.",
        "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
        "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
        "apihelp-feedrecentchanges-param-hideliu": "Скриј ги промените направени од регистрирани корисници.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Скриј ги испатролираните промени.",
        "apihelp-feedrecentchanges-param-hidemyself": "Скриј ги промените на тековниот корисник.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Сокриј префрлања во други категории.",
        "apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
        "apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
+       "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.",
+       "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.",
        "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
        "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
        "apihelp-feedwatchlist-description": "Дава канал од набљудуваните.",
        "apihelp-help-param-wrap": "Обвиткај го изводот како станрадна одѕивна структура од прилотот.",
        "apihelp-help-param-toc": "Вклучи табела со содржина во HTML-изводот.",
        "apihelp-help-example-main": "Помош за главниот модул",
+       "apihelp-help-example-submodules": "Помош за <kbd>action=query</kbd> и сите негови подмодули.",
        "apihelp-help-example-recursive": "Сета помош на една страница",
        "apihelp-help-example-help": "Помош за самиот помошен модул",
        "apihelp-help-example-query": "Помош за два подмодула за барања",
        "apihelp-imagerotate-description": "Сврти една или повеќе слики.",
        "apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.",
+       "apihelp-imagerotate-param-tags": "Ознаки за примена врз ставката во дневникот на подигања.",
        "apihelp-imagerotate-example-simple": "Сврти ја <kbd>Податотека:Пример.png</kbd> за <kbd>90</kbd> степени.",
        "apihelp-imagerotate-example-generator": "Сврти ги сите слики во <kbd>Категорија:Некоја</kbd> за <kbd>180</kbd> степени.",
        "apihelp-import-description": "Увези страница од друго вики или од XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот <var>xml</var>.",
-       "apihelp-import-param-summary": "Увези Ð¾пис.",
+       "apihelp-import-param-summary": "Ð\9eпиÑ\81 Ð½Ð° Ñ\83возоÑ\82 Ð½Ð° Ð´Ð½ÐµÐ²Ð½Ð¸Ñ\87ки Ð·Ð°пис.",
        "apihelp-import-param-xml": "Подигната XML-податотека.",
        "apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.",
        "apihelp-import-param-interwikipage": "За меѓујазични увози: страница за увоз.",
        "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
-       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки за прикажување.",
        "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
        "apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
-       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\80езÑ\83лÑ\82аÑ\82и.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
+       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\81Ñ\82авки.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
        "apihelp-opensearch-param-format": "Формат на изводот.",
        "apihelp-opensearch-example-te": "Најди страници што почнуваат со <kbd>Те</kbd>.",
        "apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката <code>userjs-</code> (предвиден за употреба од кориснички скрипти).",
        "apihelp-query+revisions-example-first5-user": "Дај ги првите 5 преработки на <kbd>Главна страница</kbd> кои се направени од корисникот „зададен од МедијаВики“ (<kbd>MediaWiki default</kbd>)",
        "apihelp-query+search-example-simple": "Побарај <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Побарај го <kbd>meaning</kbd> по текстовите.",
-       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во резултатите од пребарувањето на <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во исходот од пребарувањето на <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.",
        "apihelp-upload-param-filename": "Целно име на податотеката.",
        "apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано <var>$1text</var>.",
        "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
        "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
-       "api-format-title": "РезÑ\83лÑ\82аÑ\82 од Извршникот на МедијаВики",
+       "api-format-title": "Ð\98Ñ\81Ñ\85од од Извршникот на МедијаВики",
        "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-pageset-param-titles": "Список на наслови на кои ќе се работи",
        "api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи",
        "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-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> исходни ставки пред да продолжите; во крајни случаи може да не добиете ниедна ставка.",
        "api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.",
        "api-help-param-continue": "Употребете го ова за да продолжите кога има повеќе расположиви ставки.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
index decd400..a305bc2 100644 (file)
@@ -25,6 +25,7 @@
        "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.",
+       "apihelp-main-param-assertuser": "Bevestig dat de huidige gebruiker de genoemde gebruiker is.",
        "apihelp-main-param-requestid": "Elke waarde die hier gegeven wordt, wordt aan het antwoord toegevoegd. Dit kan gebruikt worden om verzoeken te onderscheiden.",
        "apihelp-main-param-servedby": "Voeg de hostnaam van de server die de aanvraag heeft afgehandeld toe aan het antwoord.",
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
@@ -41,6 +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-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.",
@@ -56,6 +58,7 @@
        "apihelp-clearhasmsg-example-1": "Wis de <code>hasmsg</code> vlag voor de huidige gebruiker.",
        "apihelp-clientlogin-description": "Log in op de wiki met behulp van de interactieve flow.",
        "apihelp-clientlogin-example-login": "Start het inlogproces op de wiki als gebruiker <kbd>Example</kbd> met wachtwoord <kbd>ExamplePassword</kbd>.",
+       "apihelp-compare-description": "Toon het verschil tussen 2 pagina's.\n\nEen versienummer, een paginatitel of een pagina-ID is vereist voor zowel de \"from\" en \"to\" parameter.",
        "apihelp-compare-param-fromtitle": "Eerste paginanaam om te vergelijken.",
        "apihelp-compare-param-fromid": "Eerste pagina-ID om te vergelijken.",
        "apihelp-compare-param-fromrev": "Eerste versie om te vergelijken.",
@@ -63,6 +66,7 @@
        "apihelp-compare-param-toid": "Tweede pagina-ID om te vergelijken.",
        "apihelp-compare-param-torev": "Tweede versie om te vergelijken.",
        "apihelp-createaccount-description": "Nieuwe gebruikersaccount aanmaken.",
+       "apihelp-createaccount-example-create": "Start het proces voor het aanmaken van de gebruiker <kbd>Example</kbd> met het wachtwoord <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Gebruikersnaam.",
        "apihelp-createaccount-param-password": "Wachtwoord (genegeerd als <var>$1mailpassword</var> is ingesteld).",
        "apihelp-createaccount-param-domain": "Domein voor externe authentificatie (optioneel).",
        "apihelp-createaccount-example-pass": "Maak gebruiker <kbd>testuser</kbd> aan met wachtwoord <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Maak gebruiker <kbd>testmailuser</kbd> aan en e-mail een willekeurig gegenereerd wachtwoord.",
        "apihelp-delete-description": "Een pagina verwijderen.",
+       "apihelp-delete-param-title": "Titel van de pagina om te verwijderen. Kan niet samen worden gebruikt met <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID van de pagina om te verwijderen. Kan niet samen worden gebruikt met <var>$1title</var>.",
        "apihelp-delete-param-reason": "Reden voor verwijdering. Wanneer dit niet is opgegeven wordt een automatisch gegenereerde reden gebruikt.",
+       "apihelp-delete-param-tags": "Wijzigingslabels om toe te passen op de regel in het verwijderlogboek.",
        "apihelp-delete-param-watch": "De pagina aan de volglijst van de huidige gebruiker toevoegen.",
        "apihelp-delete-param-unwatch": "De pagina van de volglijst van de huidige gebruiker verwijderen.",
        "apihelp-delete-example-simple": "Verwijder <kbd>Main Page</kbd>.",
        "apihelp-help-example-recursive": "Alle hulp op een pagina.",
        "apihelp-help-example-help": "Help voor de help-module zelf.",
        "apihelp-imagerotate-description": "Een of meerdere afbeeldingen draaien.",
+       "apihelp-imagerotate-param-rotation": "Aantal graden om de afbeelding met de klok mee te draaien.",
        "apihelp-imagerotate-param-tags": "Labels om toe te voegen aan de regel in het uploadlogboek.",
        "apihelp-imagerotate-example-simple": "Roteer <kbd>File:Example.png</kbd> met <kbd>90</kbd> graden.",
        "apihelp-imagerotate-example-generator": "Roteer alle afbeeldingen in <kbd>Category:Flip</kbd> met <kbd>180</kbd> graden.",
        "apihelp-import-param-interwikisource": "Voor interwiki imports: wiki om van te importeren.",
        "apihelp-import-param-namespace": "Importeren in deze naamruimte. Can niet samen gebruikt worden met <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importeren als subpagina van deze pagina. Kan niet samen met <var>$1namespace</var> gebruikt worden.",
+       "apihelp-import-example-import": "Importeer [[meta:Help:ParserFunctions]] in naamruimte 100 met de volledige geschiedenis.",
        "apihelp-login-param-name": "Gebruikersnaam.",
        "apihelp-login-param-password": "Wachtwoord.",
        "apihelp-login-param-domain": "Domein (optioneel).",
        "apihelp-logout-example-logout": "Meldt de huidige gebruiker af.",
        "apihelp-managetags-param-tag": "Label om aan te maken, te activeren of te deactiveren. Voor het aanmaken van een label, mag het niet bestaan. Voor het verwijderen van een label, moet het bestaan. Voor het activeren van een label, moet het bestaan en mag het niet gebruikt worden door een uitbreiding. Voor het deactiveren van een label, moet het gebruikt worden en handmatig gedefinieerd zijn.",
        "apihelp-managetags-example-create": "Maak een label met de naam <kbd>spam</kbd> aan met als reden <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-delete": "Verwijder het <kbd>vandlaism</kbd> label met de reden <kbd>Misspelt</kbd>",
+       "apihelp-mergehistory-description": "Geschiedenis van pagina's samenvoegen.",
+       "apihelp-mergehistory-param-reason": "Reden voor samenvoegen van de geschiedenis.",
+       "apihelp-mergehistory-example-merge": "Voeg de hele geschiedenis van <kbd>Oldpage</kbd> samen met <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Pagina hernoemen.",
        "apihelp-move-param-to": "Nieuwe paginanaam.",
        "apihelp-move-param-reason": "Reden voor de naamswijziging.",
        "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.",
        "apihelp-options-example-change": "Voorkeuren wijzigen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
+       "apihelp-paraminfo-description": "Verkrijg informatie over API-modules.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Vraagt een HTML-versie van de categorieën op.",
        "apihelp-parse-example-page": "Een pagina verwerken.",
        "apihelp-parse-example-text": "Wikitext verwerken.",
        "apihelp-patrol-example-revid": "Een versie markeren als gecontroleerd.",
        "apihelp-protect-param-reason": "Reden voor opheffen van de beveiliging.",
        "apihelp-protect-example-protect": "Een pagina beveiligen",
+       "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-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.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Toon geen versies door deze gebruiker.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Toon alleen pagina's in deze naamruimte.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Voegt de titel van het bestand toe.",
+       "apihelp-query+allfileusages-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
+       "apihelp-query+allimages-example-recent": "Toon een lijst van recentlijk geüploade bestanden, vergelijkbaar met [[Special:NewFiles]].",
        "apihelp-query+alllinks-param-namespace": "De naamruimte om door te lopen.",
        "apihelp-query+alllinks-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
        "apihelp-query+allmessages-param-enableparser": "Stel in om de parser in te schakelen, zorgt voor het voorverwerken van de wikitekst van een bericht (vervangen van magische woorden, de afhandeling van sjablonen, enzovoort).",
+       "apihelp-query+allmessages-param-lang": "Toon berichten in deze taal.",
+       "apihelp-query+allmessages-param-from": "Toon berichten vanaf dit bericht.",
+       "apihelp-query+allmessages-param-to": "Toon berichten tot aan dit bericht.",
        "apihelp-query+allredirects-description": "Toon alle doorverwijzingen naar een naamruimte.",
+       "apihelp-query+allrevisions-example-user": "Toon de laatste 50 bijdragen van de gebruiker <kbd>Example</kbd>.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Vraag het MIME- en mediatype van het bestand op.",
        "apihelp-query+mystashedfiles-param-limit": "Hoeveel bestanden te tonen.",
        "apihelp-query+allusers-param-excludegroup": "Sluit gebruikers in de gegeven groepen uit.",
index 1dfbcba..91e3e50 100644 (file)
        "apihelp-mergehistory-param-reason": "Powód łączenia historii.",
        "apihelp-mergehistory-example-merge": "Połącz całą historię strony <kbd>Oldpage</kbd> ze stroną <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Przenieś stronę.",
+       "apihelp-move-param-from": "Tytuł strony do zmiany nazwy. Nie można używać razem z <var>$1fromid</var>.",
        "apihelp-move-param-to": "Tytuł na jaki zmienić nazwę strony.",
        "apihelp-move-param-reason": "Powód zmiany nazwy.",
        "apihelp-move-param-movetalk": "Zmień nazwę strony dyskusji, jeśli istnieje.",
        "apihelp-parse-paramvalue-prop-images": "Zdjęcia z przetworzonego wikitekstu.",
        "apihelp-parse-paramvalue-prop-externallinks": "Linki zewnętrzne z przetworzonego wikitekstu.",
        "apihelp-parse-paramvalue-prop-sections": "Sekcje z przetworzonego wikitekstu.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "Dodaje tytuł parsowanego wikitekstu.",
        "apihelp-parse-paramvalue-prop-wikitext": "Zwróć oryginalny wikitext, który został przeanalizowany.",
        "apihelp-parse-param-preview": "Analizuj w trybie podglądu.",
        "apihelp-parse-param-disabletoc": "Pomiń spis treści na wyjściu.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
        "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>all</kbd> (czyli każdy może wykonać działanie).",
        "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
-       "apihelp-purge-description": "Wyczyść pamięć podręczną dla stron o podanych tytułach.\n\nWymaga wysłania jako żądanie POST jeżeli użytkownik jest niezalogowany.",
+       "apihelp-purge-description": "Wyczyść pamięć podręczną dla stron o podanych tytułach.",
        "apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Uaktualnij tabele linków włącznie z linkami dotyczącymi każdej strony wykorzystywanej jako szablon na tej stronie.",
        "apihelp-purge-example-simple": "Wyczyść strony <kbd>Main Page</kbd> i <kbd>API</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Wyświetl pierwsze 50 wersji w przestrzeni głównej.",
        "apihelp-query+mystashedfiles-param-limit": "Liczba plików do pobrania.",
        "apihelp-query+alltransclusions-param-prop": "Jakie informacje dołączyć:",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Dodaje tytuł osadzenia.",
        "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+alltransclusions-param-limit": "Łączna liczba elementów do zwrócenia.",
        "apihelp-query+allusers-param-from": "Nazwa użytkownika, od którego rozpocząć wyliczanie.",
        "apihelp-query+backlinks-description": "Znajdź wszystkie strony, które linkują do danej strony.",
        "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+backlinks-example-simple": "Pokazuj linki do <kbd>Main page</kbd>.",
+       "apihelp-query+blocks-description": "Lista wszystkich zablokowanych użytkowników i adresów IP.",
        "apihelp-query+blocks-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
        "apihelp-query+blocks-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
        "apihelp-query+blocks-param-ids": "Lista zablokowanych ID do wylistowania (opcjonalne).",
        "apihelp-query+blocks-param-users": "Lista użytkowników do wyszukania (opcjonalne).",
        "apihelp-query+blocks-param-limit": "Maksymalna liczba blokad do wylistowania.",
+       "apihelp-query+blocks-paramvalue-prop-id": "Dodaje identyfikator blokady.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Dodaje nazwę zablokowanego użytkownika.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Dodaje identyfikator zablokowanego użytkownika.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Dodaje znacznik czasu założenia blokady.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Dodaje znacznik czasu wygaśnięcia blokady.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Dodaje powód zablokowania.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Dodaje zakres adresów IP, na który zastosowano blokadę.",
        "apihelp-query+blocks-example-simple": "Listuj blokady.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Dodaje znacznik czasu dodania kategorii.",
        "apihelp-query+categories-param-limit": "Liczba kategorii do zwrócenia.",
+       "apihelp-query+categoryinfo-description": "Zwraca informacje o danych kategoriach.",
        "apihelp-query+categorymembers-description": "Wszystkie strony w danej kategorii.",
        "apihelp-query+categorymembers-param-title": "Kategoria, której zawartość wymienić (wymagane). Musi zawierać prefiks <kbd>{{ns:category}}:</kbd>. Nie może być używany równocześnie z <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID strony kategorii, z której wymienić strony. Nie może być użyty równocześnie z <var>$1title</var>.",
        "apihelp-query+exturlusage-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias rozmiaru.",
        "apihelp-query+filearchive-paramvalue-prop-description": "Dodaje opis wersji obrazka.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Dodaje typ MIME obrazka.",
        "apihelp-query+filearchive-example-simple": "Pokaż listę wszystkich usuniętych plików.",
        "apihelp-query+filerepoinfo-example-simple": "Uzyskaj informacje na temat repozytoriów plików.",
        "apihelp-query+fileusage-description": "Znajdź wszystkie strony, które używają danych plików.",
        "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Dodaje tytuł interwiki.",
+       "apihelp-query+iwlinks-description": "Wyświetla wszystkie liki interwiki z danych stron.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
        "apihelp-query+iwlinks-param-limit": "Łączna liczba linków interwiki do zwrócenia.",
        "apihelp-query+langbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Dodaje kod języka linku językowego.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Dodaje tytuł linku językowego.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
+       "apihelp-query+links-description": "Zwraca wszystkie linki z danych stron.",
+       "apihelp-query+links-param-namespace": "Pokaż linki tylko w tych przestrzeniach nazw.",
        "apihelp-query+links-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+linkshere-description": "Znajdź wszystkie strony, które linkują do danych stron.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+linkshere-param-limit": "Liczba do zwrócenia.",
        "apihelp-query+logevents-description": "Pobierz eventy z logu.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
+       "apihelp-query+pagepropnames-param-limit": "Maksymalna liczba zwracanych nazw.",
        "apihelp-query+pageswithprop-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Doda ID strony.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Dodaje wartość właściwości strony.",
+       "apihelp-query+pageswithprop-param-limit": "Maksymalna liczba zwracanych stron.",
+       "apihelp-query+pageswithprop-param-dir": "W jakim kierunku sortować.",
        "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Wyszukaj tekst.",
        "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania.",
        "apihelp-query+protectedtitles-description": "Lista wszystkich tytułów zabezpieczonych przed tworzeniem.",
        "apihelp-query+protectedtitles-param-namespace": "Listuj tylko strony z tych przestrzeni nazw.",
        "apihelp-query+protectedtitles-param-limit": "Łączna liczba stron do zwrócenia.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Dodaje poziom zabezpieczeń.",
        "apihelp-query+protectedtitles-example-simple": "Lista chronionych nagłówków",
+       "apihelp-query+querypage-param-page": "Nazwa strony specjalnej. Należy pamiętać o wielkości liter.",
        "apihelp-query+querypage-param-limit": "Liczba zwracanych wyników.",
        "apihelp-query+random-param-namespace": "Zwraca strony tylko w tych przestrzeniach nazw.",
+       "apihelp-query+random-param-filterredir": "Jaki filtrować przekierowania.",
+       "apihelp-query+random-example-simple": "Zwraca dwie losowe strony z głównej przestrzeni nazw.",
        "apihelp-query+recentchanges-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+recentchanges-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+recentchanges-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Dodaje komentarz do edycji.",
        "apihelp-query+recentchanges-example-simple": "Lista ostatnich zmian.",
        "apihelp-query+redirects-description": "Zwraca wszystkie przekierowania do danej strony.",
        "apihelp-query+redirects-paramvalue-prop-title": "Nazwa każdego przekierowania.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "Identyfikator wersji.",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "Znaczniki wersji (drobne).",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Znacznik czasu wersji.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Użytkownik, który utworzył wersję.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Długość wersji (w bajtach).",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) wersji.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Tekst wersji.",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Ogólne informacje o systemie.",
        "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista zarejestrowanych przestrzeni nazw i ich nazwy kanoniczne.",
        "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lista zarejestrowanych aliasów przestrzeni nazw.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Lista słów magicznych i ich aliasów.",
        "apihelp-query+siteinfo-param-numberingroup": "Wyświetla liczbę użytkowników w grupach użytkowników.",
        "apihelp-query+siteinfo-example-simple": "Pobierz informacje o stronie.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias dla $1filekey, dla kompatybilności wstecznej.",
        "apihelp-query+tags-paramvalue-prop-active": "Czy znacznik jest nadal stosowany.",
        "apihelp-query+tags-example-simple": "Lista dostęnych tagów.",
        "apihelp-query+templates-description": "Zwraca wszystkie strony osadzone w danych stronach.",
+       "apihelp-query+templates-param-namespace": "Pokaż szablony tylko w tych przestrzeniach nazw.",
        "apihelp-query+templates-param-limit": "Ile szablonów zwrócić?",
        "apihelp-query+transcludedin-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+transcludedin-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-query+transcludedin-param-limit": "Ile zwrócić.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Dodaje komentarz edycji.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Dodaje sparsowany komentarz edycji.",
        "apihelp-query+userinfo-description": "Pobierz informacje o aktualnym użytkowniku.",
        "apihelp-query+userinfo-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Wyświetla wszystkie grupy, do których należy bieżący użytkownik.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Wyświetla wszystkie uprawnienia, które ma bieżący użytkownik.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Dodaje liczbę edycji bieżącego użytkownika.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Dodaje adres e-mail użytkownika i datę jego potwierdzenia.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Dodaje datę rejestracji użytkownika.",
        "apihelp-query+userinfo-example-simple": "Pobierz informacje o aktualnym użytkowniku.",
        "apihelp-query+userinfo-example-data": "Pobierz dodatkowe informacje o aktualnym użytkowniku.",
        "apihelp-query+watchlist-paramvalue-type-external": "Zmiany zewnętrzne.",
        "apihelp-resetpassword-description": "Wyślij użytkownikowi e-mail do resetowania hasła.",
        "apihelp-resetpassword-example-email": "Wyślij e-mail do resetowania hasła do wszystkich użytkowników posiadających adres <kbd>user@example.com</kbd>.",
+       "apihelp-revisiondelete-param-ids": "Identyfikatory wersji do usunięcia.",
+       "apihelp-revisiondelete-param-hide": "Co ukryć w każdej z wersji.",
+       "apihelp-revisiondelete-param-show": "Co pokazać w każdej z wersji.",
+       "apihelp-revisiondelete-param-reason": "Powód usunięcia lub przywrócenia.",
+       "apihelp-setpagelanguage-description": "Zmień język strony.",
+       "apihelp-setpagelanguage-param-reason": "Powód zmiany.",
        "apihelp-stashedit-param-title": "Tytuł edytowanej strony.",
        "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.",
        "apihelp-stashedit-param-text": "Zawartość strony.",
+       "apihelp-stashedit-param-summary": "Opis zmian.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-description": "Odblokuj użytkownika.",
        "apihelp-unblock-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz odblokować. Nie można używać jednocześnie z <var>$1id</var> lub <var>$1userid</var>.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
+       "apihelp-undelete-param-title": "Tytuł strony do przywrócenia.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
        "apihelp-upload-param-watch": "Obserwuj stronę.",
        "apihelp-upload-param-ignorewarnings": "Ignoruj wszystkie ostrzeżenia.",
        "apihelp-upload-param-file": "Zawartość pliku.",
        "apihelp-userrights-param-user": "Nazwa użytkownika.",
+       "apihelp-userrights-param-userid": "Identyfikator użytkownika.",
        "apihelp-userrights-param-add": "Dodaj użytkownika do tych grup.",
+       "apihelp-userrights-param-remove": "Usuń użytkownika z tych grup.",
        "apihelp-userrights-param-reason": "Powód zmiany.",
+       "apihelp-validatepassword-param-password": "Hasło do walidacji.",
        "apihelp-json-description": "Dane wyjściowe w formacie JSON.",
        "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).",
        "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.",
        "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).",
        "apihelp-xml-description": "Dane wyjściowe w formacie XML.",
        "apihelp-xml-param-xslt": "Jeśli określony, dodaje podaną stronę jako arkusz styli XSL. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwa kończy się na <code>.xsl</code>.",
+       "apihelp-xml-param-includexmlnamespace": "Jeśli zaznaczono, dodaje przestrzeń nazw XML.",
        "apihelp-xmlfm-description": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).",
        "api-format-title": "Wynik MediaWiki API",
        "api-pageset-param-titles": "Lista tytułów, z którymi pracować.",
        "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.",
+       "apierror-badparameter": "Nieprawidłowa wartość parametru <var>$1</var>.",
        "apierror-badquery": "Nieprawidłowe zapytanie.",
+       "apierror-badtoken": "Nieprawidłowy token CSRF.",
        "apierror-blockedfrommail": "Została Ci zablokowana możliwość wysyłania e-maili.",
        "apierror-blocked": "Została Ci zablokowana możliwość edycji.",
+       "apierror-botsnotsupported": "Interfejs nie jest obsługiwany dla botów.",
+       "apierror-cannotviewtitle": "Nie masz uprawnień do oglądania $1.",
        "apierror-cantblock": "Nie masz uprawnień do blokowania użytkowników.",
+       "apierror-cantimport-upload": "Nie masz uprawnień do importowania przesłanych stron.",
        "apierror-cantimport": "Nie masz uprawnień do importowania stron.",
        "apierror-cantsend": "Nie jesteś zalogowany, nie masz potwierdzonego adresu e-mail, albo nie masz prawa wysyłać e-maili do innych użytkowników, więc nie możesz wysłać wiadomości e-mail.",
+       "apierror-cantundelete": "Nie można przywrócić: dana wersja nie istnieje albo została już przywrócona.",
+       "apierror-databaseerror": "[$1] Błąd zapytania do bazy danych.",
+       "apierror-exceptioncaught": "[$1] Stwierdzono wyjątek: $2",
        "apierror-filedoesnotexist": "Plik nie istnieje.",
+       "apierror-import-unknownerror": "Nieznany błąd podczas importowania: $1.",
        "apierror-integeroutofrange-abovebotmax": "Wartość <var>$1</var> dla botów i administratorów nie może przekraczać $2 (ustawiono $3).",
        "apierror-integeroutofrange-abovemax": "Wartość <var>$1</var> dla użytkowników nie może przekraczać $2 (ustawiono $3).",
        "apierror-integeroutofrange-belowminimum": "Wartość <var>$1</var> nie może być mniejsza niż $2 (ustawiono $3).",
+       "apierror-invalidcategory": "Wprowadzona nazwa kategorii jest nieprawidłowa.",
        "apierror-invalidlang": "Nieprawidłowy kod języka dla parametru <var>$1</var>.",
+       "apierror-invalidoldimage": "Parametr <var>oldimage</var> ma nieprawidłowy format.",
        "apierror-invalidparammix": "{{PLURAL:$2|Parametry}} $1 nie mogą być używane razem.",
        "apierror-invalidtitle": "Zły tytuł „$1”.",
        "apierror-invalidurlparam": "Nieprawidłowa wartość <var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "Niepoprawna nazwa użytkownika „$1”.",
+       "apierror-invaliduserid": "Identyfikator użytkownika <var>$1</var> jest nieprawidłowy.",
+       "apierror-maxlag-generic": "Oczekiwania na serwer bazy danych: opóźnienie $1 {{PLURAL:$1|sekunda|sekundy|sekund}}.",
        "apierror-missingparam": "Parametr <var>$1</var> musi być podany.",
        "apierror-missingtitle": "Wybrana przez ciebie strona nie istnieje.",
        "apierror-missingtitle-byname": "Strona $1 nie istnieje.",
        "apierror-moduledisabled": "Moduł <kbd>$1</kbd> został wyłączony.",
        "apierror-mustbeloggedin-generic": "Musisz być zalogowany.",
        "apierror-mustbeloggedin": "Musisz się zalogować, aby mieć możliwość $1.",
+       "apierror-nodeleteablefile": "Nie ma takiej starej wersji pliku.",
        "apierror-noedit-anon": "Niezarejestrowani użytkownicy nie mogą edytować stron.",
        "apierror-noedit": "Nie masz uprawnień do edytowania stron.",
+       "apierror-noimageredirect-anon": "Anonimowi użytkownicy nie mogą tworzyć przekierowań plików.",
+       "apierror-noimageredirect": "Nie masz uprawnień do tworzenia przekierowań plików.",
+       "apierror-nosuchpageid": "Nie ma strony z identyfikatorem $1.",
+       "apierror-nosuchrevid": "Nie ma wersji z identyfikatorem $1.",
+       "apierror-nosuchsection": "Nie ma sekcji $1.",
        "apierror-permissiondenied": "Nie masz uprawnień do $1.",
        "apierror-permissiondenied-generic": "Brak dostępu.",
        "apierror-permissiondenied-unblock": "Nie masz uprawnień do odblokowania użytkowników.",
        "apierror-protect-invalidaction": "Nieprawidłowy rodzaj zabezpieczenia „$1”.",
        "apierror-protect-invalidlevel": "Nieprawidłowy poziom zabezpieczeń „$1”.",
+       "apierror-readonly": "Wiki jest teraz w trybie tylko do odczytu.",
+       "apierror-revwrongpage": "r$1 nie jest wersją strony $2.",
+       "apierror-sectionsnotsupported-what": "Sekcje nie są obsługiwane przez $1.",
        "apierror-specialpage-cantexecute": "Nie masz uprawnień, aby zobaczyć wyniki tej strony specjalnej.",
        "apierror-stashwrongowner": "Nieprawidłowy właściciel: $1",
        "apierror-unknownerror-nocode": "Nieznany błąd.",
        "apiwarn-invalidcategory": "„$1” nie jest kategorią.",
        "apiwarn-invalidtitle": "„$1” nie jest poprawnym tytułem.",
        "apiwarn-notfile": "„$1” nie jest plikiem.",
+       "apiwarn-toomanyvalues": "Podano zbyt wiele wartości dla parametru <var>$1</var>. Ograniczenie do $2.",
+       "apiwarn-validationfailed": "Błąd walidacji dla <kbd>$1</kbd>: $2",
        "api-feed-error-title": "Błąd ($1)",
        "api-exception-trace": "$1 w $2($3)\n$4",
        "api-credits-header": "Twórcy",
index 9899945..c340d4a 100644 (file)
                        "Raphaelras",
                        "Caçador de Palavras",
                        "LucyDiniz",
-                       "Eduardo Addad de Oliveira"
+                       "Eduardo Addad de Oliveira",
+                       "Warley Felipe C."
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
        "apihelp-main-param-format": "O formato da saída.",
        "apihelp-main-param-smaxage": "Define o cabeçalho <code>s-maxage</code> para esta quantidade de segundos. Os erros não são armazenados em cache.",
        "apihelp-main-param-maxage": "Define o cabeçalho <code>max-age</code> para esta quantidade de segundos. Os erros não são armazenados em cache.",
+       "apihelp-main-param-assertuser": "Verificar que o utilizador atual é o utilizador nomeado.",
        "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.",
@@ -28,6 +30,7 @@
        "apihelp-block-param-autoblock": "Bloquear automaticamente o endereço IP usado e quaisquer endereços IPs subseqüentes que tentarem acessar a partir deles.",
        "apihelp-block-param-hidename": "Oculta o nome do usuário do ''log'' de bloqueio. (Requer o direito <code>hideuser</code>).",
        "apihelp-block-param-reblock": "Se o usuário já estiver bloqueado, sobrescrever o bloqueio existente.",
+       "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
        "apihelp-block-example-ip-simple": "Bloquear endereço IP <kbd>192.0.2.5</kbd> por três dias com razão <kbd>Primeira medida</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear usuário <kbd>Vandal</kbd> indefinidamente com razão <kbd>Vandalism</kbd> e o impede de criar nova conta e envio de emails.",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
@@ -86,6 +89,7 @@
        "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições excluídas.",
        "apihelp-feedcontributions-param-toponly": "Mostrar somente as edições que sejam a última revisão.",
        "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-param-feedformat": "O formato do feed.",
@@ -95,7 +99,9 @@
        "apihelp-feedrecentchanges-param-from": "Mostra modificações desde então.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar modificações menores.",
        "apihelp-feedrecentchanges-param-hidebots": "Ocultar modificações menores feitas por bots.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar mudanças patrulhadas.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas pelo usuário atual.",
+       "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-query+alllinks-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+alllinks-param-limit": "Quantos itens retornar.",
        "apihelp-query+alllinks-example-generator": "Obtém páginas contendo os links.",
+       "apihelp-query+allmessages-description": "Devolver as mensagens deste site.",
        "apihelp-query+allmessages-param-prop": "Quais propriedades obter.",
        "apihelp-query+allmessages-param-customised": "Retornar apenas mensagens neste estado personalização.",
        "apihelp-query+allmessages-param-lang": "Retornar mensagens neste idioma.",
        "apihelp-query+allredirects-param-from": "O título do redirecionamento a partir do qual começar a enumerar.",
        "apihelp-query+allredirects-param-to": "O título do redirecionamento onde parar de enumerar.",
        "apihelp-query+allredirects-param-namespace": "O espaço nominal a se enumerar.",
+       "apihelp-query+allrevisions-description": "Listar todas as revisões.",
        "apihelp-query+alltransclusions-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+alltransclusions-param-limit": "Quantos itens retornar.",
        "apihelp-query+backlinks-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-query+iwbacklinks-description": "Encontra todas as páginas que apontam para o determinado link interwiki.\n\nPode ser usado para encontrar todos os links com um prefixo, ou todos os links para um título (com um determinado prefixo). Usar nenhum parâmetro é efetivamente \"todos os links interwiki\".",
        "apihelp-query+iwbacklinks-param-prefix": "Prefixo para o interwiki.",
        "apihelp-query+iwbacklinks-param-limit": "Quantas páginas retornar.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.",
        "apihelp-query+langbacklinks-param-limit": "Quantas páginas retornar.",
        "apihelp-query+langlinks-param-limit": "Quantos links de idioma retornar.",
        "apihelp-query+links-param-limit": "Quantos links retornar.",
        "apihelp-query+linkshere-param-limit": "Quantos retornar.",
+       "apihelp-query+logevents-example-simple": "Listar os eventos recentes do registo.",
        "apihelp-query+prefixsearch-param-limit": "O número máximo a se retornar.",
        "apihelp-query+protectedtitles-param-limit": "Quantas páginas retornar.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Adicionar o nível de proteção",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos",
+       "apihelp-query+querypage-param-limit": "O número máximo a se retornar.",
        "apihelp-query+random-param-filterredir": "Como filtrar por redirecionamentos.",
        "apihelp-query+recentchanges-param-user": "Listar apenas alterações de usuário.",
        "apihelp-query+recentchanges-param-excludeuser": "Não listar as alterações deste usuário.",
        "apihelp-userrights-param-add": "Adicionar o usuário para estes grupos.",
        "apihelp-userrights-param-remove": "Remover o usuário destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para a mudança.",
-       "apihelp-none-description": "Nenhuma saída."
+       "apihelp-none-description": "Nenhuma saída.",
+       "api-help-flag-deprecated": "Este módulo é obsoleto.",
+       "api-help-source": "Fonte: $1",
+       "api-help-source-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
+       "api-help-license": "Licença: [[$1|$2]]",
+       "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
+       "api-help-license-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
+       "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:",
+       "api-help-param-deprecated": "Obsoleto",
+       "api-help-param-required": "Este parâmetro é obrigatório."
 }
index 38b7bc0..cb5997b 100644 (file)
        "apihelp-protect-example-protect": "Proteger uma página.",
        "apihelp-protect-example-unprotect": "Desproteger uma página definindo a restrição <kbd>all</kbd> (isto é, todos podem executar a operação).",
        "apihelp-protect-example-unprotect2": "Desproteger uma página definindo que não há restrições.",
-       "apihelp-purge-description": "Limpar a ''cache'' para os títulos especificados.\n\nRequer um pedido POST se o utilizador não tiver iniciado uma sessão.",
+       "apihelp-purge-description": "Limpar a ''cache'' para os títulos especificados.",
        "apihelp-purge-param-forcelinkupdate": "Atualizar as tabelas de ligações.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Atualizar a tabela de ligações, e atualizar as tabelas de ligações de qualquer página que usa esta página como modelo.",
        "apihelp-purge-example-simple": "Purgar as páginas <kbd>Main Page</kbd> e <kbd>API</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve informação sobre os direitos (a licença) da wiki, se disponível.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve informação sobre os tipos de restrição (proteção) disponíveis.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve uma lista das línguas que o MediaWiki suporta (opcionalmente localizada, usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve uma lista dos códigos de língua para os quais o [[mw:LanguageConverter|LanguageConverter]] está ativado, e as variantes suportadas para cada código.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve uma lista de todos os temas ativados (opcionalmente localizada, usando <var>$1inlanguagecode</var>, ou então na língua do conteúdo).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve uma lista dos elementos de extensões do analisador sintático.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve uma lista dos ''hooks'' de funções do analisador sintático.",
        "apihelp-unblock-param-tags": "As etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-unblock-example-id": "Desfazer o bloqueio com o identificador #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear o utilizador <kbd>Bob</kbd> com o motivo <kbd>Sorry Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurar revisões de uma página eliminada.\n\nPode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restaurar revisões de uma página eliminada.\n\nPode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da página a restaurar.",
        "apihelp-undelete-param-reason": "Motivo para restaurar a página.",
        "apihelp-undelete-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de eliminações.",
        "apihelp-upload-param-checkstatus": "Obter só o estado de carregamento para a chave de ficheiro indicada.",
        "apihelp-upload-example-url": "Carregar de um URL.",
        "apihelp-upload-example-filekey": "Prosseguir um carregamento que falhou devido a avisos.",
-       "apihelp-userrights-description": "Alterar os membros de um grupo de utilizadores.",
+       "apihelp-userrights-description": "Alterar os grupos a que um utilizador pertence.",
        "apihelp-userrights-param-user": "O nome de utilizador.",
        "apihelp-userrights-param-userid": "O identificador de utilizador.",
-       "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
+       "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos ou, se já for membro de um grupo, atualizar a data de expiração da sua pertença a esse grupo.",
        "apihelp-userrights-param-remove": "Remover o utilizador destes grupos.",
        "apihelp-userrights-param-reason": "O motivo da alteração.",
        "apihelp-userrights-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de privilégios de utilizadores.",
index 297f7ed..cca3a3c 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "{{doc-apihelp-paramvalue|query+siteinfo|prop|rightsinfo}}",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|restrictions}}",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languages}}",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languagevariants}}",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "{{doc-apihelp-paramvalue|query+siteinfo|prop|skins}}",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "{{doc-apihelp-paramvalue|query+siteinfo|prop|extensiontags}}",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "{{doc-apihelp-paramvalue|query+siteinfo|prop|functionhooks}}",
        "api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated",
        "api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries",
        "api-help-open-in-apisandbox": "Text for the link to open an API example in [[Special:ApiSandbox]].",
-       "api-help-authmanager-general-usage": "Text giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
+       "api-help-authmanager-general-usage": "{{doc-important|Do not translate text that either quoted, or inside <nowiki><var></var></nowiki>, <nowiki><kbd></kbd></nowiki>, <nowiki><samp></samp></nowiki>, or <nowiki><code></code></nowiki> in this message.}}\nText giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
        "api-help-authmanagerhelper-requests": "{{doc-apihelp-param|description=the \"requests\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
        "api-help-authmanagerhelper-request": "{{doc-apihelp-param|description=the \"request\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
        "api-help-authmanagerhelper-messageformat": "{{doc-apihelp-param|description=the \"messageformat\" parameter for AuthManager-using API modules|noseealso=1}}",
        "apiwarn-deprecation-parse-headitems": "{{doc-apierror}}",
        "apiwarn-deprecation-purge-get": "{{doc-apierror}}",
        "apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
-       "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+       "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n\n\"r\" is short for \"revision\". You may translate it.",
        "apiwarn-errorprinterfailed": "{{doc-apierror}}",
        "apiwarn-errorprinterfailed-ex": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, which may already end in punctuation. Probably in English.",
        "apiwarn-invalidcategory": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied category name.",
index 2b9fc8a..007c9d7 100644 (file)
@@ -75,7 +75,7 @@
        "apihelp-compare-param-toid": "Второй идентификатор страницы для сравнения",
        "apihelp-compare-param-torev": "Вторая версия для сравнения",
        "apihelp-compare-example-1": "Создание различий между версиями 1 и 2.",
-       "apihelp-createaccount-description": "Создайте новую учетную запись Пользователя.",
+       "apihelp-createaccount-description": "Создайте новую учётную запись.",
        "apihelp-createaccount-param-preservestate": "Если <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> возвращается True для <samp>hasprimarypreservedstate</samp>, просит отмечен как <samp>основной-обязательно</samp> должен быть опущен. Если он возвращает непустое значение для <samp>preservedusername</samp>, что имя пользователя должно быть использовано для <var>пользователя</var> параметр.",
        "apihelp-createaccount-example-create": "Запустить процесс создания пользователя <kbd>пример</kbd> с паролем <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Имя участника.",
        "apihelp-login-param-name": "Имя участника.",
        "apihelp-login-param-password": "Пароль.",
        "apihelp-login-param-domain": "Домен (необязательно).",
+       "apihelp-login-example-gettoken": "Получить токен входа.",
        "apihelp-login-example-login": "Войти",
        "apihelp-logout-description": "Выйти и очистить данные сессии.",
        "apihelp-mergehistory-description": "Объединение историй правок",
        "apihelp-query+usercontribs-description": "Получить все правки пользователя",
        "apihelp-revisiondelete-description": "удалить и восстановить редакции",
        "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.",
-       "apihelp-unblock-description": "Разблокировать пользователя.",
+       "apihelp-unblock-description": "Разблокировать участника.",
        "apihelp-unblock-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите разблокировать. Нельзя использовать одновременно с <var>$1id</var> или <var>$1userid</var>.",
        "apihelp-unblock-param-userid": "ID участника, которого вы хотите разблокировать. Нельзя использовать одновременно с <var>$1id</var> или <var>$1user</var>.",
        "apihelp-unblock-param-reason": "Причина разблокировки",
        "apihelp-upload-param-chunk": "Кусок содержимого.",
        "apihelp-upload-example-url": "Загрузить через URL",
        "apihelp-userrights-description": "Изменить членство в группе пользователей.",
-       "apihelp-userrights-param-user": "Имя пользователя",
+       "apihelp-userrights-param-user": "Имя учётной записи.",
        "apihelp-userrights-param-userid": "Идентификатор пользователя.",
        "apihelp-userrights-param-add": "Добавить пользователя в эти группы.",
        "apihelp-userrights-param-remove": "Удалить пользователя из этих групп.",
        "api-help-param-continue": "Когда доступно больше результатов, использовать этот чтобы продолжить.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(описание отсутствует)</span>",
        "api-help-examples": "Пример{{PLURAL:$1||ы}}:",
-       "api-help-permissions": "{{PLURAL:$1|Permission|Permissions}}:",
+       "api-help-permissions": "{{PLURAL:$1|Разрешение|Разрешения}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Granted to}}: $2",
        "apierror-integeroutofrange-abovemax": "<var>$1</var> не может быть более $2 (на $3) для пользователей.",
        "apierror-nosuchuserid": "Нет пользователя с ID $1.",
index 0c4bd1c..1396458 100644 (file)
@@ -14,7 +14,8 @@
                        "VickyC",
                        "Josve05a",
                        "Rockyfelle",
-                       "Macofe"
+                       "Macofe",
+                       "Magol"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R|Buggar & förslag]\n</div>\n<strong>Status:</strong> Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\n<strong>Felaktiga förfrågningar:</strong> När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs [[mw:API:Errors_and_warnings|API: Fel och varningar]].",
        "apihelp-main-param-smaxage": "Ange headervärdet <code>s-maxage</code> till så här många sekunder. Fel cachelagras aldrig.",
        "apihelp-main-param-maxage": "Ange headervärdet <code>max-age</code> till så här många sekunder. Fel cachelagras aldrig.",
        "apihelp-main-param-assert": "Bekräfta att användaren är inloggad om satt till <kbd>user</kbd>, eller har bot-användarrättigheter om satt till <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Verifiera att den nuvarande användaren är den namngivne användaren.",
        "apihelp-main-param-requestid": "Alla värde som anges här kommer att inkluderas i svaret. Kan användas för att särskilja förfrågningar.",
        "apihelp-main-param-servedby": "Inkludera det värdnamn som besvarade förfrågan i resultatet.",
        "apihelp-main-param-curtimestamp": "Inkludera den aktuella tidsstämpeln i resultatet.",
+       "apihelp-main-param-responselanginfo": "Inkluderar de språk som används för <var>uselang</var> och <var>errorlang</var> i resultatet.",
        "apihelp-main-param-origin": "När API:et används genom en cross-domain AJAX-begäran (CORS), ange detta till den ursprungliga domänen. Detta måste inkluderas i alla pre-flight-begäran, och mpste därför vara en del av den begärda URI:n (inte i POST-datat). Detta måste överensstämma med en av källorna i headern <code>Origin</code> exakt, så den måste sättas till något i stil med <kbd>http://en.wikipedia.org</kbd> eller <kbd>https://meta.wikimedia.org</kbd>. Om denna parameter inte överensstämmer med headern <code>Origin</code>, returneras ett 403-svar. Om denna parameter överensstämmer med headern <code>Origin</code> och källan är vitlistad, sätts en <code>Access-Control-Allow-Origin</code>-header.",
        "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. En lista med koder kan hämtas från <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd>, eller ange <kbd>user</kbd> för att använda den aktuella användarens språkpreferenser, eller ange <kbd>content</kbd> för att använda innehållsspråket.",
        "apihelp-block-description": "Blockera en användare.",
        "apihelp-patrol-example-revid": "Patrullera en sidversion",
        "apihelp-protect-description": "Ändra skyddsnivån för en sida.",
        "apihelp-protect-example-protect": "Skydda en sida",
+       "apihelp-purge-description": "Rensa cachen för angivna titlar.",
        "apihelp-query-param-list": "Vilka listor att hämta.",
        "apihelp-query-param-meta": "Vilka metadata att hämta.",
        "apihelp-query-example-allpages": "Hämta sidversioner av sidor som börjar med <kbd>API/</kbd>.",
        "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-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\".",
        "apierror-systemblocked": "Du har blockerats automatiskt av MediaWiki.",
index 11a79c2..e3dba0b 100644 (file)
        "apihelp-protect-example-protect": "Захистити сторінку.",
        "apihelp-protect-example-unprotect": "Зняти захист зі сторінки, встановивши обмеження для <kbd>all</kbd> (тобто будь-хто зможе робити дії).",
        "apihelp-protect-example-unprotect2": "Зняти захист з сторінки, встановивши відсутність обмежень.",
-       "apihelp-purge-description": "Очистити кеш для вказаних заголовків.\n\nВимагає запиту POST, якщо користувач не ввійшов у систему.",
+       "apihelp-purge-description": "Очистити кеш для вказаних заголовків.",
        "apihelp-purge-param-forcelinkupdate": "Оновити таблиці посилань.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Оновити таблицю посилань, і оновити таблиці посилань для кожної сторінки, що використовує цю сторінку як шаблон.",
        "apihelp-purge-example-simple": "Очистити кеш <kbd>Main Page</kbd> і сторінки <kbd>API</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-unblock-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі блокувань.",
        "apihelp-unblock-example-id": "Зняти блокування з ідентифікатором #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Розблокувати користувача <kbd>Bob</kbd> з причиною <kbd>Sorry Bob</kbd>.",
-       "apihelp-undelete-description": "Відновити версії вилученої сторінки.\n\nСписок вилучених версій (включено з часовими мітками) може бути отримано через [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], а список ідентифікаторів вилучених файлів може бути отримано через [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Відновити версії вилученої сторінки.\n\nСписок вилучених версій (включено з часовими мітками) може бути отримано через [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], а список ідентифікаторів вилучених файлів може бути отримано через [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Назва сторінки, яку слід відновити.",
        "apihelp-undelete-param-reason": "Причина відновлення.",
        "apihelp-undelete-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі вилучень.",
        "apihelp-userrights-description": "Змінити членство користувача у групах.",
        "apihelp-userrights-param-user": "Ім'я користувача.",
        "apihelp-userrights-param-userid": "Ідентифікатор користувача.",
-       "apihelp-userrights-param-add": "Додати користувача до цих груп.",
+       "apihelp-userrights-param-add": "Додати користувача до цих груп. Якщо він вже є членом групи, оновити термін дії членства.",
+       "apihelp-userrights-param-expiry": "Часові мітки, коли завершується членство. Можуть бути відносними (наприклад, <kbd>5 months</kbd> або <kbd>2 weeks</kbd>) або абсолютними (як <kbd>2014-09-18T12:34:56Z</kbd>). Якщо задано тільки оду часову мітку, вона буде стосуватися всіх груп, переданих параметром <var>$1add</var>. Використовуйте <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> або <kbd>never</kbd>, щоб задати безстрокове членство.",
        "apihelp-userrights-param-remove": "Вилучити користувача із цих груп.",
        "apihelp-userrights-param-reason": "Причина зміни.",
        "apihelp-userrights-param-tags": "Змінити теги для застосування до запису в журналі зміни прав користувача.",
        "apihelp-userrights-example-user": "Додати користувача <kbd>FooBot</kbd> до групи <kbd>bot</kbd> та вилучити із груп <kbd>sysop</kbd> та <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Додати користувача з ідентифікатором <kbd>123</kbd> до групи <kbd>bot</kbd> та вилучити із груп <kbd>sysop</kbd> та <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "Додати користувача <kbd>SometimeSysop</kbd> в групу <kbd>sysop</kbd> на 1 місяць.",
        "apihelp-validatepassword-description": "Перевірити пароль на предмет відповідності політикам вікі щодо паролів.\n\nРезультати перевірки вказуються як <samp>Good</samp> якщо пароль прийнятний, <samp>Change</samp> якщо пароль може використовуватись для входу, але його треба змінити, і <samp>Invalid</samp> — якщо пароль використовувати не можна.",
        "apihelp-validatepassword-param-password": "Пароль до перевірки.",
        "apihelp-validatepassword-param-user": "Ім'я користувача, для використання при тестуванні створення облікового запису. Вказаний користувач не повинен існувати.",
        "apierror-blockedfrommail": "Вам заблоковано можливість надсилання електронної пошти.",
        "apierror-blocked": "Вам заблоковано можливість редагування.",
        "apierror-botsnotsupported": "Інтерфейс не підтримується для ботів.",
+       "apierror-cannot-async-upload-file": "Параметри <var>async</var> та <var>file</var> не можна поєднувати. Якщо Ви хочете, щоб завантажений Вами файл був опрацьований асинхронно, спершу завантажте його у сховок (використавши параметр <var>stash</var>), а тоді опублікуйте цей підготовлений файл (використавши <var>filekey</var> та <var>async</var>).",
        "apierror-cannotreauthenticate": "Ця діє недоступна, оскільки Вашу ідентичність неможливо перевірити.",
        "apierror-cannotviewtitle": "Ви не маєте дозволу на перегляд $1.",
        "apierror-cantblock-email": "Ви не маєте прав на блокування користувачам можливості надсилання електронної пошти через вікі.",
        "apiwarn-tokens-origin": "Токени не можна отримати, поки не застосована політика одного походження.",
        "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>: ліміт становить $2.",
        "apiwarn-truncatedresult": "Цей результат було скорочено, оскільки інакше він перевищив би ліміт у $1 байтів.",
-       "apiwarn-unclearnowtimestamp": "Вказування «$2» для параметра мітки часу <var>$1</var> є застарілим. Якщо з якоїсь причини Вам треба чітко вказати поточний час без вираховування його з боку клієнта, використайте <kbd>now<kbd>.",
+       "apiwarn-unclearnowtimestamp": "Вказування «$2» для параметра мітки часу <var>$1</var> є застарілим. Якщо з якоїсь причини Вам треба чітко вказати поточний час без вираховування його з боку клієнта, використайте <kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Нерозпізнане|Нерозпізнані}} значення для параметра <var>$1</var>: $2.",
        "apiwarn-unsupportedarray": "Параметр <var>$1</var> використовує непідтримуваний синтаксис PHP-масиву.",
        "apiwarn-urlparamwidth": "Ігнорування значення ширини, встановленого в <var>$1urlparam</var> ($2) на користь значення ширини, запозиченого із <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
        "apiwarn-wgDebugAPI": "<strong>Попередження щодо безпеки</strong>: увімкнено <var>$wgDebugAPI</var>.",
        "api-feed-error-title": "Помилка ($1)",
        "api-usage-docref": "Див. $1 щодо використання API.",
+       "api-usage-mailinglist-ref": "Щоб взнавати про заплановані і остаточні критичні зміни API, підпишіться на розсилку mediawiki-api-announce тут: &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt;.",
        "api-exception-trace": "$1 у $2($3)\n$4",
        "api-credits-header": "Автор(и)",
        "api-credits": "Розробники API:\n* Roan Kattouw (головний розробник вер. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (творець, головний розробник вер. 2006 – вер. 2007)\n* Brad Jorsch (головний розробник 2013 – тепер)\n\nБудь ласка, надсилайте свої коментарі, пропозиції та запитання на mediawiki-api@lists.wikimedia.org\nабо зафайліть звіт про баґ на https://phabricator.wikimedia.org/."
index 026b489..731a9c0 100644 (file)
        "apihelp-protect-example-protect": "保护一个页面。",
        "apihelp-protect-example-unprotect": "通过设置限制为<kbd>all</kbd>解除保护一个页面(就是说任何人都可以执行操作)。",
        "apihelp-protect-example-unprotect2": "通过设置没有限制解除保护一个页面。",
-       "apihelp-purge-description": "为指定标题刷新缓存。\n\n如果用户尚未登录的话,就需要POST请求。",
+       "apihelp-purge-description": "为指定标题刷新缓存。",
        "apihelp-purge-param-forcelinkupdate": "更新链接表。",
        "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。",
        "apihelp-purge-example-simple": "刷新<kbd>Main Page</kbd>和<kbd>API</kbd>页面。",
        "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-skins": "返回所有启用的皮肤列表(可选择使用<var>$1inlanguagecode</var>本地化,否则是内容语言)。",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "返回解析器扩展标签列表。",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "返回解析器函数钩列表。",
        "apihelp-unblock-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "apihelp-unblock-example-id": "解封封禁ID #<kbd>105</kbd>。",
        "apihelp-unblock-example-user": "解封用户<kbd>Bob</kbd>,原因<kbd>Sorry Bob</kbd>。",
-       "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。",
+       "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。",
        "apihelp-undelete-param-title": "要恢复的页面标题。",
        "apihelp-undelete-param-reason": "恢复的原因。",
        "apihelp-undelete-param-tags": "要在删除日志中应用到实体的更改标签。",
        "apihelp-userrights-param-user": "用户名。",
        "apihelp-userrights-param-userid": "用户ID。",
        "apihelp-userrights-param-add": "将用户加入至这些组中,或如果其已作为成员,更新其所在用户组成员资格的终止时间。",
+       "apihelp-userrights-param-expiry": "到期时间戳。可以是相对值(例如<kbd>5 months</kbd>或<kbd>2 weeks</kbd>)或绝对值(例如<kbd>2014-09-18T12:34:56Z</kbd>)。如果只设置一个时间戳,它将被用于所有传递给<var>$1add</var>参数的组。对于永不过时的用户组,使用<kbd>infinite</kbd>、<kbd>indefinite</kbd>、<kbd>infinity</kbd>或<kbd>never</kbd>。",
        "apihelp-userrights-param-remove": "将用户从这些组中移除。",
        "apihelp-userrights-param-reason": "更改原因。",
        "apihelp-userrights-param-tags": "要在用户权限日志中应用到实体的更改标签。",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
-       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证可以工作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
+       "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交的内容。\n# 发送(POST)至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失败),则认为操作结束。成功与否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用户显示新字段,并再次获取其提交的内容。然后再次使用<var>$1continue</var>,向本模块提交相关字段,并重复第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,将用户指向<samp>redirecttarget</samp>中的目标,等待其返回<var>$1returnurl</var>。然后再次使用<var>$1continue</var>,向本模块提交返回URL中提供的一切字段,并重复第四步。\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证正常运作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-help-authmanagerhelper-requests": "只使用这些身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>,或来自此模块之前的响应。",
        "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
        "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
        "apierror-invalidexpiry": "无效的过期时间“$1”。",
        "apierror-invalid-file-key": "不是有效的文件关键词。",
        "apierror-invalidlang": "用于参数<var>$1</var>的语言值无效。",
-       "apierror-invalidoldimage": "旧图片参数有无效格式。",
+       "apierror-invalidoldimage": "<var>oldimage</var>参数有无效格式。",
        "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd>参数不能与<kbd>$2</kbd>一起使用。",
        "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd>参数只能与<kbd>$2</kbd>一起使用。",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd>不能连同<var>oldid</var>、<var>pageid</var>或<var>page</var>参数使用。请使用<var>title</var>和<var>text</var>。",
        "apierror-invalidparammix": "{{PLURAL:$2|参数}}$1不能一起使用。",
-       "apierror-invalidsection": "章节参数必须为有效的章节ID或<kbd>new</kbd>。",
+       "apierror-invalidsection": "<var>section</var>参数必须为有效的章节ID或<kbd>new</kbd>。",
        "apierror-invalidsha1base36hash": "提供的SHA1Base36哈希无效。",
        "apierror-invalidsha1hash": "提供的SHA1哈希无效。",
        "apierror-invalidtitle": "错误标题“$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-tokennotallowed": "操作“$1”不允许当前用户使用。",
-       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值上限为$2。",
+       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值上限为$2。",
        "apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。",
-       "apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now<kbd>。",
+       "apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now</kbd>。",
        "apiwarn-unrecognizedvalues": "参数<var>$1</var>有无法识别的{{PLURAL:$3|值}}:$2。",
        "apiwarn-unsupportedarray": "参数<var>$1</var>使用未受支持的PHP数组语法。",
        "apiwarn-validationfailed-badchars": "关键词中的字符无效(只允许<code>a-z</code>、<code>A-Z</code>、<code>0-9</code>、<code>_</code>和<code>-</code>)。",
index 86ddc4c..6f2bcd6 100644 (file)
@@ -8,7 +8,9 @@
                        "Zhxy 519",
                        "Macofe",
                        "Jasonzhuocn",
-                       "Winstonyin"
+                       "Winstonyin",
+                       "Arthur2e5",
+                       "烈羽"
                ]
        },
        "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收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n<strong>測試:</strong>要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-feedcontributions-description": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+       "apihelp-feedcontributions-param-hideminor": "隱藏小修改。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
        "apihelp-feedrecentchanges-description": "返回最近變更摘要。",
        "api-help-examples": "{{PLURAL:$1|範例}}:",
        "api-help-permissions": "{{PLURAL:$1|權限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|已授權給}}: $2",
+       "api-help-authmanager-general-usage": "使用此模組的一般程式是:\n# 通過<kbd>amirequestsfor=$4</kbd>取得來自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用欄位,和來自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用戶顯示欄位,並獲得其提交的內容。\n# 提交(POST)至此模組,提供<var>$1returnurl</var>及任何相關欄位。\n# 在回应中檢查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失敗),則認為操作結束。成功與否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用戶顯示新欄位,並再次獲取其提交的內容。然後再次使用<var>$1continue</var>,向本模組提交相關欄位,並重復第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,將使用者指向<samp>redirecttarget</samp>中的目標,等待其返回<var>$1returnurl</var>。然後再次使用<var>$1continue</var>,向本模組提交返回URL中提供的一切欄位,並重復第四步。\n#* 如果您收到了<samp>RESTART</samp>,這意味著身份驗證正常運作,但我們沒有連結的使用者賬戶。您可以將此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-credits-header": "製作群",
        "api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。"
 }
index 3f6a47d..ae0bc6b 100644 (file)
@@ -167,7 +167,9 @@ class ThrottlePreAuthenticationProvider extends AbstractPreAuthenticationProvide
 
                $data = $this->manager->getAuthenticationSessionData( 'LoginThrottle' );
                if ( !$data ) {
-                       $this->logger->error( 'throttler data not found for {user}', [ 'user' => $user->getName() ] );
+                       // this can occur when login is happening via AuthenticationRequest::$loginRequest
+                       // so testForAuthentication is skipped
+                       $this->logger->info( 'throttler data not found for {user}', [ 'user' => $user->getName() ] );
                        return;
                }
 
index 9e6cf1e..0a07a93 100644 (file)
@@ -26,6 +26,9 @@
  * @copyright © 2011, Antoine Musso
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Class for fetching backlink lists, approximate backlink counts and
  * partitions. This is a shared cache.
@@ -407,7 +410,7 @@ class BacklinkCache {
 
                // 4) ... finally fetch from the slow database :(
                $cacheEntry = [ 'numRows' => 0, 'batches' => [] ]; // final result
-               // Do the selects in batches to avoid client-side OOMs (bug 43452).
+               // Do the selects in batches to avoid client-side OOMs (T45452).
                // Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
                $selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
                $start = false;
index d773fff..77ab2d5 100644 (file)
@@ -22,6 +22,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Class representing a list of titles
index 9bf0840..4facc20 100644 (file)
@@ -584,7 +584,8 @@ class MessageCache {
                                        return;
                                }
                                // Load the messages from the master DB to avoid race conditions
-                               $this->loadFromDB( $code, self::FOR_UPDATE );
+                               $cache = $this->loadFromDB( $code, self::FOR_UPDATE );
+                               $this->mCache[$code] = $cache;
                                // Load the process cache values and set the per-title cache keys
                                $page = WikiPage::factory( Title::makeTitle( NS_MEDIAWIKI, $title ) );
                                $page->loadPageData( $page::READ_LATEST );
index 15a00c7..cffb59a 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLiked
  *
@@ -152,7 +154,7 @@ class ChangesFeed {
                        if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
                                wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
                                if ( $feedLastmodUnix < $lastmodUnix ) {
-                                       $wgOut->setLastModified( $feedLastmod ); // bug 21916
+                                       $wgOut->setLastModified( $feedLastmod ); // T23916
                                }
                                return $cache->get( $key );
                        } else {
index 77038ed..3f4ad14 100644 (file)
@@ -23,6 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class ChangesList extends ContextSource {
        /**
@@ -158,19 +159,43 @@ class ChangesList extends ContextSource {
        protected function getHTMLClasses( $rc, $watched ) {
                $classes = [];
                $logType = $rc->mAttribs['rc_log_type'];
+               $prefix = 'mw-changeslist-';
 
                if ( $logType ) {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType );
+                       $classes[] = Sanitizer::escapeClass( $prefix . 'log-' . $logType );
                } else {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
+                       $classes[] = Sanitizer::escapeClass( $prefix . 'ns' .
                                $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
 
                // Indicate watched status on the line to allow for more
                // comprehensive styling.
                $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
-                       ? 'mw-changeslist-line-watched'
-                       : 'mw-changeslist-line-not-watched';
+                       ? $prefix . 'line-watched'
+                       : $prefix . 'line-not-watched';
+
+               $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rc ) );
+
+               return $classes;
+       }
+
+       protected function getHTMLClassesForFilters( $rc ) {
+               $classes = [];
+               $prefix = 'mw-changeslist-';
+
+               $classes[] = $prefix . ( $rc->getAttribute( 'rc_bot' ) ? 'bot' : 'human' );
+               $classes[] = $prefix . ( $rc->getAttribute( 'rc_user' ) ? 'liu' : 'anon' );
+               $classes[] = $prefix . ( $rc->getAttribute( 'rc_minor' ) ? 'minor' : 'major' );
+               $classes[] = $prefix .
+                       ( $rc->getAttribute( 'rc_patrolled' ) ? 'patrolled' : 'unpatrolled' );
+               $classes[] = $prefix .
+                       ( $this->getUser()->equals( $rc->getPerformer() ) ? 'self' : 'others' );
+               $classes[] = $prefix . 'src-' . str_replace( '.', '-', $rc->getAttribute( 'rc_source' ) );
+
+               $performer = $rc->getPerformer();
+               if ( $performer && $performer->isLoggedIn() ) {
+                       $classes[] = $prefix . 'user-' . $performer->getExperienceLevel();
+               }
 
                return $classes;
        }
@@ -379,7 +404,7 @@ class ChangesList extends ContextSource {
                        $diffLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['diff'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $query
                        );
                }
@@ -391,7 +416,7 @@ class ChangesList extends ContextSource {
                        $diffhist .= $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
                                new HtmlArmor( $this->message['hist'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-history' ],
                                [
                                        'curid' => $rc->mAttribs['rc_cur_id'],
                                        'action' => 'history'
@@ -444,8 +469,10 @@ class ChangesList extends ContextSource {
 
                # TODO: Deprecate the $s argument, it seems happily unused.
                $s = '';
+               # Avoid PHP 7.1 warning from passing $this by reference
+               $changesList = $this;
                Hooks::run( 'ChangesListInsertArticleLink',
-                       [ &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ] );
+                       [ &$changesList, &$articlelink, &$s, &$rc, $unpatrolled, $watched ] );
 
                return "{$s} {$articlelink}";
        }
index d3a414b..3aad60e 100644 (file)
@@ -358,16 +358,17 @@ class EnhancedChangesList extends ChangesList {
        protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = [] ) {
                $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
 
-               $classes = [ 'mw-enhanced-rc' ];
                $type = $rcObj->mAttribs['rc_type'];
                $data = [];
                $lineParams = [];
 
+               $classes = [ 'mw-enhanced-rc' ];
                if ( $rcObj->watched
                        && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                ) {
-                       $classes = [ 'mw-enhanced-watched' ];
+                       $classes[] = 'mw-enhanced-watched';
                }
+               $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rcObj ) );
 
                $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
@@ -530,7 +531,7 @@ class EnhancedChangesList extends ChangesList {
                                $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $nchanges[$n] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
@@ -540,7 +541,7 @@ class EnhancedChangesList extends ChangesList {
                                        $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
                                                        new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
-                                                       [],
+                                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
@@ -562,7 +563,7 @@ class EnhancedChangesList extends ChangesList {
                        $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $this->message['enhancedrc-history'] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-history' ],
                                        $params
                                );
                }
@@ -717,7 +718,7 @@ class EnhancedChangesList extends ChangesList {
                                        . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
                                                new HtmlArmor( $this->message['hist'] ),
-                                               [],
+                                               [ 'class' => 'mw-changeslist-history' ],
                                                $query
                                        ) )->escaped();
                return $retVal;
index 8eb06ce..a5d5191 100644 (file)
@@ -34,7 +34,7 @@ class OldChangesList extends ChangesList {
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
 
                $classes = $this->getHTMLClasses( $rc, $watched );
-               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from T16468)
                if ( $linenumber ) {
                        if ( $linenumber & 1 ) {
                                $classes[] = 'mw-line-odd';
@@ -50,7 +50,9 @@ class OldChangesList extends ChangesList {
                                $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
 
-               if ( !Hooks::run( 'OldChangesListRecentChangesLine', [ &$this, &$html, $rc, &$classes ] ) ) {
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $list = $this;
+               if ( !Hooks::run( 'OldChangesListRecentChangesLine', [ &$list, &$html, $rc, &$classes ] ) ) {
                        return false;
                }
 
index 2c5c8b1..8ce21f5 100644 (file)
@@ -186,7 +186,7 @@ class RCCacheEntryFactory {
                        $curLink = $curMessage;
                } else {
                        $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $curLink = "<a href=\"$curUrl\">$curMessage</a>";
+                       $curLink = "<a class=\"mw-changeslist-diff-cur\" href=\"$curUrl\">$curMessage</a>";
                }
 
                return $curLink;
@@ -229,16 +229,18 @@ class RCCacheEntryFactory {
                                return $diffMessage;
                        }
                        $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                }
 
                return $diffLink;
        }
 
        /**
+        * Builds the link to the previous version
+        *
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
         *
@@ -257,7 +259,7 @@ class RCCacheEntryFactory {
                        $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
                                new HtmlArmor( $lastMessage ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
                }
index 13a5fc7..dcab158 100644 (file)
@@ -329,7 +329,9 @@ class RecentChange {
                $this->mAttribs['rc_id'] = $dbw->insertId();
 
                # Notify extensions
-               Hooks::run( 'RecentChange_save', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $rc = $this;
+               Hooks::run( 'RecentChange_save', [ &$rc ] );
 
                if ( count( $this->tags ) ) {
                        ChangeTags::addTags( $this->tags, $this->mAttribs['rc_id'],
@@ -389,8 +391,8 @@ class RecentChange {
 
                $performer = $this->getPerformer();
 
-               foreach ( $feeds as $feed ) {
-                       $feed += [
+               foreach ( $feeds as $params ) {
+                       $params += [
                                'omit_bots' => false,
                                'omit_anon' => false,
                                'omit_user' => false,
@@ -399,62 +401,48 @@ class RecentChange {
                        ];
 
                        if (
-                               ( $feed['omit_bots'] && $this->mAttribs['rc_bot'] ) ||
-                               ( $feed['omit_anon'] && $performer->isAnon() ) ||
-                               ( $feed['omit_user'] && !$performer->isAnon() ) ||
-                               ( $feed['omit_minor'] && $this->mAttribs['rc_minor'] ) ||
-                               ( $feed['omit_patrolled'] && $this->mAttribs['rc_patrolled'] ) ||
+                               ( $params['omit_bots'] && $this->mAttribs['rc_bot'] ) ||
+                               ( $params['omit_anon'] && $performer->isAnon() ) ||
+                               ( $params['omit_user'] && !$performer->isAnon() ) ||
+                               ( $params['omit_minor'] && $this->mAttribs['rc_minor'] ) ||
+                               ( $params['omit_patrolled'] && $this->mAttribs['rc_patrolled'] ) ||
                                $this->mAttribs['rc_type'] == RC_EXTERNAL
                        ) {
                                continue;
                        }
 
-                       $engine = self::getEngine( $feed['uri'] );
-
                        if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
                                $actionComment = $this->mExtra['actionCommentIRC'];
                        } else {
                                $actionComment = null;
                        }
 
-                       /** @var $formatter RCFeedFormatter */
-                       $formatter = is_object( $feed['formatter'] ) ? $feed['formatter'] : new $feed['formatter']();
-                       $line = $formatter->getLine( $feed, $this, $actionComment );
-                       if ( !$line ) {
-                               // T109544
-                               // If a feed formatter returns null, this will otherwise cause an
-                               // error in at least RedisPubSubFeedEngine.
-                               // Not sure where/how this should best be handled.
-                               continue;
-                       }
-
-                       $engine->send( $feed, $line );
+                       $feed = RCFeed::factory( $params );
+                       $feed->notify( $this, $actionComment );
                }
        }
 
        /**
-        * Gets the stream engine object for a given URI from $wgRCEngines
-        *
+        * @since 1.22
+        * @deprecated since 1.29 Use RCFeed::factory() instead
         * @param string $uri URI to get the engine object for
-        * @throws MWException
         * @return RCFeedEngine The engine object
+        * @throws MWException
         */
-       public static function getEngine( $uri ) {
+       public static function getEngine( $uri, $params = [] ) {
+               // TODO: Merge into RCFeed::factory().
                global $wgRCEngines;
-
                $scheme = parse_url( $uri, PHP_URL_SCHEME );
                if ( !$scheme ) {
-                       throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" );
+                       throw new MWException( "Invalid RCFeed uri: '$uri'" );
                }
-
                if ( !isset( $wgRCEngines[$scheme] ) ) {
-                       throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" );
+                       throw new MWException( "Unknown RCFeedEngine scheme: '$scheme'" );
                }
-
                if ( defined( 'MW_PHPUNIT_TEST' ) && is_object( $wgRCEngines[$scheme] ) ) {
                        return $wgRCEngines[$scheme];
                }
-               return new $wgRCEngines[$scheme];
+               return new $wgRCEngines[$scheme]( $params );
        }
 
        /**
index 7659d6c..d67bc7e 100644 (file)
@@ -67,7 +67,7 @@ abstract class Collation {
                                return new CollationFa;
                        default:
                                $match = [];
-                               if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
+                               if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) {
                                        return new IcuCollation( $match[1] );
                                }
 
index 5dc9fa2..ca7b765 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 /**
- * Workaround for incorrect collation of Estonian language ('et') in ICU (bug 54168).
+ * Workaround for incorrect collation of Estonian language ('et') in ICU (T56168).
  *
  * 'W' and 'V' should not be considered the same letter for the purposes of collation in modern
  * Estonian. We work around this by replacing 'W' and 'w' with 'ᴡ' U+1D21 'LATIN LETTER SMALL
index bc5a209..bf1fe74 100644 (file)
@@ -513,8 +513,12 @@ class IcuCollation extends Collation {
         * can't be determined.
         *
         * The constant INTL_ICU_VERSION this function refers to isn't really
-        * documented. It is available since PHP 5.3.7 (see PHP bug 54561).
-        * This function will return false on older PHPs.
+        * documented. It is available since PHP 5.3.7 (see PHP 54561
+        * https://bugs.php.net/bug.php?id=54561). This function will return
+        * false on older PHPs.
+        *
+        * TODO: Remove the backwards-compatibility as MediaWiki now requires
+        * higher levels of PHP.
         *
         * @since 1.21
         * @return string|bool
diff --git a/includes/compat/Timestamp.php b/includes/compat/Timestamp.php
new file mode 100644 (file)
index 0000000..bd25432
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This file is loaded by composer.json#autoload.files instead of autoload.php,
+// because PHP's class loader does not support autoloading an alias for a class that
+// isn't already loaded. See also AutoLoaderTest and ClassCollector.
+
+// By using an autoload file, this will trigger directly at runtime outside any class
+// loading context. This file will then register the alias and, as class_alias() does
+// by default, it will trigger a plain autoload for the destination class.
+
+// The below uses string concatenation for the alias to avoid being seen by ClassCollector,
+// which would insist on adding it to autoload.php, after which AutoLoaderTest will
+// complain about class_alias() not being in the target class file.
+
+/**
+ * @deprecated since 1.29
+ * @since 1.20
+ */
+class_alias( Wikimedia\Timestamp\TimestampException::class, 'Timestamp' . 'Exception' );
index 119144a..bccb147 100644 (file)
@@ -361,7 +361,9 @@ abstract class ContentHandler {
        public static function getContentModels() {
                global $wgContentHandlers;
 
-               return array_keys( $wgContentHandlers );
+               $models = array_keys( $wgContentHandlers );
+               Hooks::run( 'GetContentModels', [ &$models ] );
+               return $models;
        }
 
        public static function getAllContentFormats() {
@@ -897,7 +899,7 @@ abstract class ContentHandler {
                        $onlyAuthor = $row->rev_user_text;
                        // Try to find a second contributor
                        foreach ( $res as $row ) {
-                               if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+                               if ( $row->rev_user_text != $onlyAuthor ) { // T24999
                                        $onlyAuthor = false;
                                        break;
                                }
@@ -1155,8 +1157,11 @@ abstract class ContentHandler {
         * @return array Map of name=>value for fields
         * @since 1.28
         */
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $output,
+               SearchEngine $engine
+       ) {
                $fieldData = [];
                $content = $page->getContent();
 
index 26f1190..843d540 100644 (file)
@@ -30,8 +30,11 @@ class FileContentHandler extends WikitextContentHandler  {
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $parserOutput,
+               SearchEngine $engine
+       ) {
                $fields = [];
 
                $title = $page->getTitle();
index 09cdcee..698a37b 100644 (file)
@@ -30,7 +30,7 @@
  */
 class TextContentHandler extends ContentHandler {
 
-       // @codingStandardsIgnoreStart bug 57585
+       // @codingStandardsIgnoreStart T59585
        public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = [ CONTENT_FORMAT_TEXT ] ) {
                parent::__construct( $modelId, $formats );
        }
@@ -150,8 +150,11 @@ class TextContentHandler extends ContentHandler {
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $output,
+               SearchEngine $engine
+       ) {
                $fields = parent::getDataForSearchIndex( $page, $output, $engine );
                $fields['language'] =
                        $this->getPageLanguage( $page->getTitle(), $page->getContent() )->getCode();
index f4a6dc6..9f79aa8 100644 (file)
@@ -27,26 +27,32 @@ class WikiTextStructure {
         * @var string[] selectors to elements that are excluded entirely from search
         */
        private $excludedElementSelectors = [
-               'audio', 'video',       // "it looks like you don't have javascript enabled..."
-                                       // do not need to index
-               'sup.reference',        // The [1] for references
-               '.mw-cite-backlink',    // The ↑ next to references in the references section
-               'h1', 'h2', 'h3',       // Headings are already indexed in their own field.
-               'h5', 'h6', 'h4',
-               '.autocollapse',        // Collapsed fields are hidden by default so we don't want them
-                                                               // showing up.
+               // "it looks like you don't have javascript enabled..." – do not need to index
+               'audio', 'video',
+               // The [1] for references
+               'sup.reference',
+               // The ↑ next to references in the references section
+               '.mw-cite-backlink',
+               // Headings are already indexed in their own field.
+               'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+               // Collapsed fields are hidden by default so we don't want them showing up.
+               '.autocollapse',
        ];
 
        /**
         * @var string[] selectors to elements that are considered auxiliary to article text for search
         */
        private $auxiliaryElementSelectors = [
-               '.thumbcaption',        // Thumbnail captions aren't really part of the text proper
-               'table',                // Neither are tables
-               '.rellink',             // Common style for "See also:".
-               '.dablink',             // Common style for calling out helpful links at the top
-                                                               // of the article.
-               '.searchaux',           // New class users can use to mark stuff as auxiliary to searches.
+               // Thumbnail captions aren't really part of the text proper
+               '.thumbcaption',
+               // Neither are tables
+               'table',
+               // Common style for "See also:".
+               '.rellink',
+               // Common style for calling out helpful links at the top of the article.
+               '.dablink',
+               // New class users can use to mark stuff as auxiliary to searches.
+               '.searchaux',
        ];
 
        /**
index 74b2f1a..9c26ae1 100644 (file)
@@ -128,16 +128,20 @@ class WikitextContentHandler extends TextContentHandler {
 
                $fields['opening_text'] =
                        $engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT );
-               $fields['opening_text']->setFlag( SearchIndexField::FLAG_SCORING |
-                                                 SearchIndexField::FLAG_NO_HIGHLIGHT );
+               $fields['opening_text']->setFlag(
+                       SearchIndexField::FLAG_SCORING | SearchIndexField::FLAG_NO_HIGHLIGHT
+               );
                // Until we have full first-class content handler for files, we invoke it explicitly here
                $fields = array_merge( $fields, $this->getFileHandler()->getFieldsForSearchIndex( $engine ) );
 
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $parserOutput,
+               SearchEngine $engine
+       ) {
                $fields = parent::getDataForSearchIndex( $page, $parserOutput, $engine );
 
                $structure = new WikiTextStructure( $parserOutput );
index ecd274b..3dfa456 100644 (file)
@@ -428,7 +428,7 @@ class RequestContext implements IContextSource, MutableContext {
                                }
 
                                // Normalize the key in case the user is passing gibberish
-                               // or has old preferences (bug 69566).
+                               // or has old preferences (T71566).
                                $normalized = Skin::normalizeKey( $userSkin );
 
                                // Skin::normalizeKey will also validate it, so
index 6a1bbd6..da660bd 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * Base class for objects that allow access to other wiki's databases using
  * the foreign database access mechanism implemented by LBFactoryMulti.
index 2b394b6..c4921e2 100644 (file)
@@ -79,7 +79,7 @@ class CloneDatabase {
                foreach ( $this->tablesToClone as $tbl ) {
                        if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
                                // Shared tables don't work properly when cloning due to
-                               // how prefixes are handled (bug 65654)
+                               // how prefixes are handled (T67654)
                                throw new RuntimeException( "Cannot clone shared table $tbl." );
                        }
                        # Clean up from previous aborted run.  So that table escaping
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
deleted file mode 100644 (file)
index d567d8b..0000000
+++ /dev/null
@@ -1,1384 +0,0 @@
-<?php
-/**
- * This is the MS SQL Server Native database abstraction layer.
- *
- * 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 Database
- * @author Joel Penner <a-joelpe at microsoft dot com>
- * @author Chris Pucci <a-cpucci at microsoft dot com>
- * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
- * @author Ryan Schmidt <skizzerz at gmail dot com>
- */
-
-/**
- * @ingroup Database
- */
-class DatabaseMssql extends Database {
-       protected $mInsertId = null;
-       protected $mLastResult = null;
-       protected $mAffectedRows = null;
-       protected $mSubqueryId = 0;
-       protected $mScrollableCursor = true;
-       protected $mPrepareStatements = true;
-       protected $mBinaryColumnCache = null;
-       protected $mBitColumnCache = null;
-       protected $mIgnoreDupKeyErrors = false;
-       protected $mIgnoreErrors = [];
-
-       protected $mPort;
-
-       public function implicitGroupby() {
-               return false;
-       }
-
-       public function implicitOrderby() {
-               return false;
-       }
-
-       public function unionSupportsOrderAndLimit() {
-               return false;
-       }
-
-       /**
-        * Usually aborts on failure
-        * @param string $server
-        * @param string $user
-        * @param string $password
-        * @param string $dbName
-        * @throws DBConnectionError
-        * @return bool|resource|null
-        */
-       public function open( $server, $user, $password, $dbName ) {
-               # Test for driver support, to avoid suppressed fatal error
-               if ( !function_exists( 'sqlsrv_connect' ) ) {
-                       throw new DBConnectionError(
-                               $this,
-                               "Microsoft SQL Server Native (sqlsrv) functions missing.
-                               You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n"
-                       );
-               }
-
-               global $wgDBport, $wgDBWindowsAuthentication;
-
-               # e.g. the class is being loaded
-               if ( !strlen( $user ) ) {
-                       return null;
-               }
-
-               $this->close();
-               $this->mServer = $server;
-               $this->mPort = $wgDBport;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
-
-               $connectionInfo = [];
-
-               if ( $dbName ) {
-                       $connectionInfo['Database'] = $dbName;
-               }
-
-               // Decide which auth scenerio to use
-               // if we are using Windows auth, then don't add credentials to $connectionInfo
-               if ( !$wgDBWindowsAuthentication ) {
-                       $connectionInfo['UID'] = $user;
-                       $connectionInfo['PWD'] = $password;
-               }
-
-               MediaWiki\suppressWarnings();
-               $this->mConn = sqlsrv_connect( $server, $connectionInfo );
-               MediaWiki\restoreWarnings();
-
-               if ( $this->mConn === false ) {
-                       throw new DBConnectionError( $this, $this->lastError() );
-               }
-
-               $this->mOpened = true;
-
-               return $this->mConn;
-       }
-
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
-       protected function closeConnection() {
-               return sqlsrv_close( $this->mConn );
-       }
-
-       /**
-        * @param bool|MssqlResultWrapper|resource $result
-        * @return bool|MssqlResultWrapper
-        */
-       protected function resultObject( $result ) {
-               if ( !$result ) {
-                       return false;
-               } elseif ( $result instanceof MssqlResultWrapper ) {
-                       return $result;
-               } elseif ( $result === true ) {
-                       // Successful write query
-                       return $result;
-               } else {
-                       return new MssqlResultWrapper( $this, $result );
-               }
-       }
-
-       /**
-        * @param string $sql
-        * @return bool|MssqlResult
-        * @throws DBUnexpectedError
-        */
-       protected function doQuery( $sql ) {
-               if ( $this->getFlag( DBO_DEBUG ) ) {
-                       wfDebug( "SQL: [$sql]\n" );
-               }
-               $this->offset = 0;
-
-               // several extensions seem to think that all databases support limits
-               // via LIMIT N after the WHERE clause, but  MSSQL uses SELECT TOP N,
-               // so to catch any of those extensions we'll do a quick check for a
-               // LIMIT clause and pass $sql through $this->LimitToTopN() which parses
-               // the LIMIT clause and passes the result to $this->limitResult();
-               if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
-                       // massage LIMIT -> TopN
-                       $sql = $this->LimitToTopN( $sql );
-               }
-
-               // MSSQL doesn't have EXTRACT(epoch FROM XXX)
-               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
-                       // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
-                       $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
-               }
-
-               // perform query
-
-               // SQLSRV_CURSOR_STATIC is slower than SQLSRV_CURSOR_CLIENT_BUFFERED (one of the two is
-               // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
-               // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
-               // strings make php throw a fatal error "Severe error translating Unicode"
-               if ( $this->mScrollableCursor ) {
-                       $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ];
-               } else {
-                       $scrollArr = [];
-               }
-
-               if ( $this->mPrepareStatements ) {
-                       // we do prepare + execute so we can get its field metadata for later usage if desired
-                       $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr );
-                       $success = sqlsrv_execute( $stmt );
-               } else {
-                       $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr );
-                       $success = (bool)$stmt;
-               }
-
-               // Make a copy to ensure what we add below does not get reflected in future queries
-               $ignoreErrors = $this->mIgnoreErrors;
-
-               if ( $this->mIgnoreDupKeyErrors ) {
-                       // ignore duplicate key errors
-                       // this emulates INSERT IGNORE in MySQL
-                       $ignoreErrors[] = '2601'; // duplicate key error caused by unique index
-                       $ignoreErrors[] = '2627'; // duplicate key error caused by primary key
-                       $ignoreErrors[] = '3621'; // generic "the statement has been terminated" error
-               }
-
-               if ( $success === false ) {
-                       $errors = sqlsrv_errors();
-                       $success = true;
-
-                       foreach ( $errors as $err ) {
-                               if ( !in_array( $err['code'], $ignoreErrors ) ) {
-                                       $success = false;
-                                       break;
-                               }
-                       }
-
-                       if ( $success === false ) {
-                               return false;
-                       }
-               }
-               // remember number of rows affected
-               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
-
-               return $stmt;
-       }
-
-       public function freeResult( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               sqlsrv_free_stmt( $res );
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @return stdClass
-        */
-       public function fetchObject( $res ) {
-               // $res is expected to be an instance of MssqlResultWrapper here
-               return $res->fetchObject();
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @return array
-        */
-       public function fetchRow( $res ) {
-               return $res->fetchRow();
-       }
-
-       /**
-        * @param mixed $res
-        * @return int
-        */
-       public function numRows( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               $ret = sqlsrv_num_rows( $res );
-
-               if ( $ret === false ) {
-                       // we cannot get an amount of rows from this cursor type
-                       // has_rows returns bool true/false if the result has rows
-                       $ret = (int)sqlsrv_has_rows( $res );
-               }
-
-               return $ret;
-       }
-
-       /**
-        * @param mixed $res
-        * @return int
-        */
-       public function numFields( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               return sqlsrv_num_fields( $res );
-       }
-
-       /**
-        * @param mixed $res
-        * @param int $n
-        * @return int
-        */
-       public function fieldName( $res, $n ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-
-               return sqlsrv_field_metadata( $res )[$n]['Name'];
-       }
-
-       /**
-        * This must be called after nextSequenceVal
-        * @return int|null
-        */
-       public function insertId() {
-               return $this->mInsertId;
-       }
-
-       /**
-        * @param MssqlResultWrapper $res
-        * @param int $row
-        * @return bool
-        */
-       public function dataSeek( $res, $row ) {
-               return $res->seek( $row );
-       }
-
-       /**
-        * @return string
-        */
-       public function lastError() {
-               $strRet = '';
-               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $retErrors != null ) {
-                       foreach ( $retErrors as $arrError ) {
-                               $strRet .= $this->formatError( $arrError ) . "\n";
-                       }
-               } else {
-                       $strRet = "No errors found";
-               }
-
-               return $strRet;
-       }
-
-       /**
-        * @param array $err
-        * @return string
-        */
-       private function formatError( $err ) {
-               return '[SQLSTATE ' . $err['SQLSTATE'] . '][Error Code ' . $err['code'] . ']' . $err['message'];
-       }
-
-       /**
-        * @return string|int
-        */
-       public function lastErrno() {
-               $err = sqlsrv_errors( SQLSRV_ERR_ALL );
-               if ( $err !== null && isset( $err[0] ) ) {
-                       return $err[0]['code'];
-               } else {
-                       return 0;
-               }
-       }
-
-       /**
-        * @return int
-        */
-       public function affectedRows() {
-               return $this->mAffectedRows;
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param mixed $table Array or string, table name(s) (prefix auto-added)
-        * @param mixed $vars Array or string, field name(s) to be retrieved
-        * @param mixed $conds Array or string, condition(s) for WHERE
-        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options Associative array of options (e.g.
-        *   [ 'GROUP BY' => 'page_title' ]), see Database::makeSelectOptions
-        *   code for list of supported stuff
-        * @param array $join_conds Associative array of table join conditions
-        *   (optional) (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
-        * @return mixed Database result resource (feed to Database::fetchObject
-        *   or whatever), or false on failure
-        * @throws DBQueryError
-        * @throws DBUnexpectedError
-        * @throws Exception
-        */
-       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-               if ( isset( $options['EXPLAIN'] ) ) {
-                       try {
-                               $this->mScrollableCursor = false;
-                               $this->mPrepareStatements = false;
-                               $this->query( "SET SHOWPLAN_ALL ON" );
-                               $ret = $this->query( $sql, $fname );
-                               $this->query( "SET SHOWPLAN_ALL OFF" );
-                       } catch ( DBQueryError $dqe ) {
-                               if ( isset( $options['FOR COUNT'] ) ) {
-                                       // likely don't have privs for SHOWPLAN, so run a select count instead
-                                       $this->query( "SET SHOWPLAN_ALL OFF" );
-                                       unset( $options['EXPLAIN'] );
-                                       $ret = $this->select(
-                                               $table,
-                                               'COUNT(*) AS EstimateRows',
-                                               $conds,
-                                               $fname,
-                                               $options,
-                                               $join_conds
-                                       );
-                               } else {
-                                       // someone actually wanted the query plan instead of an est row count
-                                       // let them know of the error
-                                       $this->mScrollableCursor = true;
-                                       $this->mPrepareStatements = true;
-                                       throw $dqe;
-                               }
-                       }
-                       $this->mScrollableCursor = true;
-                       $this->mPrepareStatements = true;
-                       return $ret;
-               }
-               return $this->query( $sql, $fname );
-       }
-
-       /**
-        * SELECT wrapper
-        *
-        * @param mixed $table Array or string, table name(s) (prefix auto-added)
-        * @param mixed $vars Array or string, field name(s) to be retrieved
-        * @param mixed $conds Array or string, condition(s) for WHERE
-        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        * @param array $options Associative array of options (e.g. [ 'GROUP BY' => 'page_title' ]),
-        *   see Database::makeSelectOptions code for list of supported stuff
-        * @param array $join_conds Associative array of table join conditions (optional)
-        *    (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
-        * @return string The SQL text
-        */
-       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
-               $options = [], $join_conds = []
-       ) {
-               if ( isset( $options['EXPLAIN'] ) ) {
-                       unset( $options['EXPLAIN'] );
-               }
-
-               $sql = parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-
-               // try to rewrite aggregations of bit columns (currently MAX and MIN)
-               if ( strpos( $sql, 'MAX(' ) !== false || strpos( $sql, 'MIN(' ) !== false ) {
-                       $bitColumns = [];
-                       if ( is_array( $table ) ) {
-                               foreach ( $table as $t ) {
-                                       $bitColumns += $this->getBitColumns( $this->tableName( $t ) );
-                               }
-                       } else {
-                               $bitColumns = $this->getBitColumns( $this->tableName( $table ) );
-                       }
-
-                       foreach ( $bitColumns as $col => $info ) {
-                               $replace = [
-                                       "MAX({$col})" => "MAX(CAST({$col} AS tinyint))",
-                                       "MIN({$col})" => "MIN(CAST({$col} AS tinyint))",
-                               ];
-                               $sql = str_replace( array_keys( $replace ), array_values( $replace ), $sql );
-                       }
-               }
-
-               return $sql;
-       }
-
-       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
-               $fname = __METHOD__
-       ) {
-               $this->mScrollableCursor = false;
-               try {
-                       parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-       }
-
-       public function delete( $table, $conds, $fname = __METHOD__ ) {
-               $this->mScrollableCursor = false;
-               try {
-                       parent::delete( $table, $conds, $fname );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-       }
-
-       /**
-        * Estimate rows in dataset
-        * Returns estimated count, based on SHOWPLAN_ALL output
-        * This is not necessarily an accurate estimate, so use sparingly
-        * Returns -1 if count cannot be found
-        * Takes same arguments as Database::select()
-        * @param string $table
-        * @param string $vars
-        * @param string $conds
-        * @param string $fname
-        * @param array $options
-        * @return int
-        */
-       public function estimateRowCount( $table, $vars = '*', $conds = '',
-               $fname = __METHOD__, $options = []
-       ) {
-               // http://msdn2.microsoft.com/en-us/library/aa259203.aspx
-               $options['EXPLAIN'] = true;
-               $options['FOR COUNT'] = true;
-               $res = $this->select( $table, $vars, $conds, $fname, $options );
-
-               $rows = -1;
-               if ( $res ) {
-                       $row = $this->fetchRow( $res );
-
-                       if ( isset( $row['EstimateRows'] ) ) {
-                               $rows = (int)$row['EstimateRows'];
-                       }
-               }
-
-               return $rows;
-       }
-
-       /**
-        * Returns information about an index
-        * If errors are explicitly ignored, returns NULL on failure
-        * @param string $table
-        * @param string $index
-        * @param string $fname
-        * @return array|bool|null
-        */
-       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
-               # This does not return the same info as MYSQL would, but that's OK
-               # because MediaWiki never uses the returned value except to check for
-               # the existence of indexes.
-               $sql = "sp_helpindex '" . $this->tableName( $table ) . "'";
-               $res = $this->query( $sql, $fname );
-
-               if ( !$res ) {
-                       return null;
-               }
-
-               $result = [];
-               foreach ( $res as $row ) {
-                       if ( $row->index_name == $index ) {
-                               $row->Non_unique = !stristr( $row->index_description, "unique" );
-                               $cols = explode( ", ", $row->index_keys );
-                               foreach ( $cols as $col ) {
-                                       $row->Column_name = trim( $col );
-                                       $result[] = clone $row;
-                               }
-                       } elseif ( $index == 'PRIMARY' && stristr( $row->index_description, 'PRIMARY' ) ) {
-                               $row->Non_unique = 0;
-                               $cols = explode( ", ", $row->index_keys );
-                               foreach ( $cols as $col ) {
-                                       $row->Column_name = trim( $col );
-                                       $result[] = clone $row;
-                               }
-                       }
-               }
-
-               return empty( $result ) ? false : $result;
-       }
-
-       /**
-        * INSERT wrapper, inserts an array into a table
-        *
-        * $arrToInsert may be a single associative array, or an array of these with numeric keys, for
-        * multi-row insert.
-        *
-        * Usually aborts on failure
-        * If errors are explicitly ignored, returns success
-        * @param string $table
-        * @param array $arrToInsert
-        * @param string $fname
-        * @param array $options
-        * @return bool
-        * @throws Exception
-        */
-       public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = [] ) {
-               # No rows to insert, easy just return now
-               if ( !count( $arrToInsert ) ) {
-                       return true;
-               }
-
-               if ( !is_array( $options ) ) {
-                       $options = [ $options ];
-               }
-
-               $table = $this->tableName( $table );
-
-               if ( !( isset( $arrToInsert[0] ) && is_array( $arrToInsert[0] ) ) ) { // Not multi row
-                       $arrToInsert = [ 0 => $arrToInsert ]; // make everything multi row compatible
-               }
-
-               // We know the table we're inserting into, get its identity column
-               $identity = null;
-               // strip matching square brackets and the db/schema from table name
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-               $res = $this->doQuery(
-                       "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS " .
-                               "WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'"
-               );
-               if ( $res && sqlsrv_has_rows( $res ) ) {
-                       // There is an identity for this table.
-                       $identityArr = sqlsrv_fetch_array( $res, SQLSRV_FETCH_ASSOC );
-                       $identity = array_pop( $identityArr );
-               }
-               sqlsrv_free_stmt( $res );
-
-               // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
-               $binaryColumns = $this->getBinaryColumns( $table );
-
-               // INSERT IGNORE is not supported by SQL Server
-               // remove IGNORE from options list and set ignore flag to true
-               if ( in_array( 'IGNORE', $options ) ) {
-                       $options = array_diff( $options, [ 'IGNORE' ] );
-                       $this->mIgnoreDupKeyErrors = true;
-               }
-
-               foreach ( $arrToInsert as $a ) {
-                       // start out with empty identity column, this is so we can return
-                       // it as a result of the INSERT logic
-                       $sqlPre = '';
-                       $sqlPost = '';
-                       $identityClause = '';
-
-                       // if we have an identity column
-                       if ( $identity ) {
-                               // iterate through
-                               foreach ( $a as $k => $v ) {
-                                       if ( $k == $identity ) {
-                                               if ( !is_null( $v ) ) {
-                                                       // there is a value being passed to us,
-                                                       // we need to turn on and off inserted identity
-                                                       $sqlPre = "SET IDENTITY_INSERT $table ON;";
-                                                       $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
-                                               } else {
-                                                       // we can't insert NULL into an identity column,
-                                                       // so remove the column from the insert.
-                                                       unset( $a[$k] );
-                                               }
-                                       }
-                               }
-
-                               // we want to output an identity column as result
-                               $identityClause = "OUTPUT INSERTED.$identity ";
-                       }
-
-                       $keys = array_keys( $a );
-
-                       // Build the actual query
-                       $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
-                               " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
-
-                       $first = true;
-                       foreach ( $a as $key => $value ) {
-                               if ( isset( $binaryColumns[$key] ) ) {
-                                       $value = new MssqlBlob( $value );
-                               }
-                               if ( $first ) {
-                                       $first = false;
-                               } else {
-                                       $sql .= ',';
-                               }
-                               if ( is_null( $value ) ) {
-                                       $sql .= 'null';
-                               } elseif ( is_array( $value ) || is_object( $value ) ) {
-                                       if ( is_object( $value ) && $value instanceof Blob ) {
-                                               $sql .= $this->addQuotes( $value );
-                                       } else {
-                                               $sql .= $this->addQuotes( serialize( $value ) );
-                                       }
-                               } else {
-                                       $sql .= $this->addQuotes( $value );
-                               }
-                       }
-                       $sql .= ')' . $sqlPost;
-
-                       // Run the query
-                       $this->mScrollableCursor = false;
-                       try {
-                               $ret = $this->query( $sql );
-                       } catch ( Exception $e ) {
-                               $this->mScrollableCursor = true;
-                               $this->mIgnoreDupKeyErrors = false;
-                               throw $e;
-                       }
-                       $this->mScrollableCursor = true;
-
-                       if ( !is_null( $identity ) ) {
-                               // then we want to get the identity column value we were assigned and save it off
-                               $row = $ret->fetchObject();
-                               if ( is_object( $row ) ) {
-                                       $this->mInsertId = $row->$identity;
-
-                                       // it seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is used
-                                       // if we got an identity back, we know for sure a row was affected, so adjust that here
-                                       if ( $this->mAffectedRows == -1 ) {
-                                               $this->mAffectedRows = 1;
-                                       }
-                               }
-                       }
-               }
-               $this->mIgnoreDupKeyErrors = false;
-               return $ret;
-       }
-
-       /**
-        * INSERT SELECT wrapper
-        * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
-        * Source items may be literals rather than field names, but strings should
-        * be quoted with Database::addQuotes().
-        * @param string $destTable
-        * @param array|string $srcTable May be an array of tables.
-        * @param array $varMap
-        * @param array $conds May be "*" to copy the whole table.
-        * @param string $fname
-        * @param array $insertOptions
-        * @param array $selectOptions
-        * @return null|ResultWrapper
-        * @throws Exception
-        */
-       public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = []
-       ) {
-               $this->mScrollableCursor = false;
-               try {
-                       $ret = parent::nativeInsertSelect(
-                               $destTable,
-                               $srcTable,
-                               $varMap,
-                               $conds,
-                               $fname,
-                               $insertOptions,
-                               $selectOptions
-                       );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-
-               return $ret;
-       }
-
-       /**
-        * UPDATE wrapper. Takes a condition array and a SET array.
-        *
-        * @param string $table Name of the table to UPDATE. This will be passed through
-        *                Database::tableName().
-        *
-        * @param array $values An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                Database::addQuotes().
-        *
-        * @param array $conds An array of conditions (WHERE). See
-        *                Database::select() for the details of the format of
-        *                condition arrays. Use '*' to update all rows.
-        *
-        * @param string $fname The function name of the caller (from __METHOD__),
-        *                for logging and profiling.
-        *
-        * @param array $options An array of UPDATE options, can be:
-        *                   - IGNORE: Ignore unique key conflicts
-        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
-        * @return bool
-        * @throws DBUnexpectedError
-        * @throws Exception
-        */
-       function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
-               $table = $this->tableName( $table );
-               $binaryColumns = $this->getBinaryColumns( $table );
-
-               $opts = $this->makeUpdateOptions( $options );
-               $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET, $binaryColumns );
-
-               if ( $conds !== [] && $conds !== '*' ) {
-                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
-               }
-
-               $this->mScrollableCursor = false;
-               try {
-                       $this->query( $sql );
-               } catch ( Exception $e ) {
-                       $this->mScrollableCursor = true;
-                       throw $e;
-               }
-               $this->mScrollableCursor = true;
-               return true;
-       }
-
-       /**
-        * Makes an encoded list of strings from an array
-        * @param array $a Containing the data
-        * @param int $mode Constant
-        *      - LIST_COMMA:          comma separated, no field names
-        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
-        *        the documentation for $conds in Database::select().
-        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
-        *      - LIST_SET:            comma separated with field names, like a SET clause
-        *      - LIST_NAMES:          comma separated field names
-        * @param array $binaryColumns Contains a list of column names that are binary types
-        *      This is a custom parameter only present for MS SQL.
-        *
-        * @throws DBUnexpectedError
-        * @return string
-        */
-       public function makeList( $a, $mode = LIST_COMMA, $binaryColumns = [] ) {
-               if ( !is_array( $a ) ) {
-                       throw new DBUnexpectedError( $this, __METHOD__ . ' called with incorrect parameters' );
-               }
-
-               if ( $mode != LIST_NAMES ) {
-                       // In MS SQL, values need to be specially encoded when they are
-                       // inserted into binary fields. Perform this necessary encoding
-                       // for the specified set of columns.
-                       foreach ( array_keys( $a ) as $field ) {
-                               if ( !isset( $binaryColumns[$field] ) ) {
-                                       continue;
-                               }
-
-                               if ( is_array( $a[$field] ) ) {
-                                       foreach ( $a[$field] as &$v ) {
-                                               $v = new MssqlBlob( $v );
-                                       }
-                                       unset( $v );
-                               } else {
-                                       $a[$field] = new MssqlBlob( $a[$field] );
-                               }
-                       }
-               }
-
-               return parent::makeList( $a, $mode );
-       }
-
-       /**
-        * @param string $table
-        * @param string $field
-        * @return int Returns the size of a text field, or -1 for "unlimited"
-        */
-       public function textFieldSize( $table, $field ) {
-               $table = $this->tableName( $table );
-               $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
-               $res = $this->query( $sql );
-               $row = $this->fetchRow( $res );
-               $size = -1;
-               if ( strtolower( $row['DATA_TYPE'] ) != 'text' ) {
-                       $size = $row['CHARACTER_MAXIMUM_LENGTH'];
-               }
-
-               return $size;
-       }
-
-       /**
-        * Construct a LIMIT query with optional offset
-        * This is used for query pages
-        *
-        * @param string $sql SQL query we will append the limit too
-        * @param int $limit The SQL limit
-        * @param bool|int $offset The SQL offset (default false)
-        * @return array|string
-        * @throws DBUnexpectedError
-        */
-       public function limitResult( $sql, $limit, $offset = false ) {
-               if ( $offset === false || $offset == 0 ) {
-                       if ( strpos( $sql, "SELECT" ) === false ) {
-                               return "TOP {$limit} " . $sql;
-                       } else {
-                               return preg_replace( '/\bSELECT(\s+DISTINCT)?\b/Dsi',
-                                       'SELECT$1 TOP ' . $limit, $sql, 1 );
-                       }
-               } else {
-                       // This one is fun, we need to pull out the select list as well as any ORDER BY clause
-                       $select = $orderby = [];
-                       $s1 = preg_match( '#SELECT\s+(.+?)\s+FROM#Dis', $sql, $select );
-                       $s2 = preg_match( '#(ORDER BY\s+.+?)(\s*FOR XML .*)?$#Dis', $sql, $orderby );
-                       $overOrder = $postOrder = '';
-                       $first = $offset + 1;
-                       $last = $offset + $limit;
-                       $sub1 = 'sub_' . $this->mSubqueryId;
-                       $sub2 = 'sub_' . ( $this->mSubqueryId + 1 );
-                       $this->mSubqueryId += 2;
-                       if ( !$s1 ) {
-                               // wat
-                               throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
-                       }
-                       if ( !$s2 ) {
-                               // no ORDER BY
-                               $overOrder = 'ORDER BY (SELECT 1)';
-                       } else {
-                               if ( !isset( $orderby[2] ) || !$orderby[2] ) {
-                                       // don't need to strip it out if we're using a FOR XML clause
-                                       $sql = str_replace( $orderby[1], '', $sql );
-                               }
-                               $overOrder = $orderby[1];
-                               $postOrder = ' ' . $overOrder;
-                       }
-                       $sql = "SELECT {$select[1]}
-                                       FROM (
-                                               SELECT ROW_NUMBER() OVER({$overOrder}) AS rowNumber, *
-                                               FROM ({$sql}) {$sub1}
-                                       ) {$sub2}
-                                       WHERE rowNumber BETWEEN {$first} AND {$last}{$postOrder}";
-
-                       return $sql;
-               }
-       }
-
-       /**
-        * If there is a limit clause, parse it, strip it, and pass the remaining
-        * SQL through limitResult() with the appropriate parameters. Not the
-        * prettiest solution, but better than building a whole new parser. This
-        * exists becase there are still too many extensions that don't use dynamic
-        * sql generation.
-        *
-        * @param string $sql
-        * @return array|mixed|string
-        */
-       public function LimitToTopN( $sql ) {
-               // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
-               $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
-               if ( preg_match( $pattern, $sql, $matches ) ) {
-                       $row_count = $matches[4];
-                       $offset = $matches[3] ?: $matches[6] ?: false;
-
-                       // strip the matching LIMIT clause out
-                       $sql = str_replace( $matches[0], '', $sql );
-
-                       return $this->limitResult( $sql, $row_count, $offset );
-               }
-
-               return $sql;
-       }
-
-       /**
-        * @return string Wikitext of a link to the server software's web site
-        */
-       public function getSoftwareLink() {
-               return "[{{int:version-db-mssql-url}} MS SQL Server]";
-       }
-
-       /**
-        * @return string Version information from the database
-        */
-       public function getServerVersion() {
-               $server_info = sqlsrv_server_info( $this->mConn );
-               $version = 'Error';
-               if ( isset( $server_info['SQLServerVersion'] ) ) {
-                       $version = $server_info['SQLServerVersion'];
-               }
-
-               return $version;
-       }
-
-       /**
-        * @param string $table
-        * @param string $fname
-        * @return bool
-        */
-       public function tableExists( $table, $fname = __METHOD__ ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       wfDebug( "Attempting to call tableExists on a remote table" );
-                       return false;
-               }
-
-               if ( $schema === false ) {
-                       global $wgDBmwschema;
-                       $schema = $wgDBmwschema;
-               }
-
-               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
-                       WHERE TABLE_TYPE = 'BASE TABLE'
-                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
-
-               if ( $res->numRows() ) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Query whether a given column exists in the mediawiki schema
-        * @param string $table
-        * @param string $field
-        * @param string $fname
-        * @return bool
-        */
-       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       wfDebug( "Attempting to call fieldExists on a remote table" );
-                       return false;
-               }
-
-               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
-                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-
-               if ( $res->numRows() ) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       public function fieldInfo( $table, $field ) {
-               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
-
-               if ( $db !== false ) {
-                       // remote database
-                       wfDebug( "Attempting to call fieldInfo on a remote table" );
-                       return false;
-               }
-
-               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
-                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-
-               $meta = $res->fetchRow();
-               if ( $meta ) {
-                       return new MssqlField( $meta );
-               }
-
-               return false;
-       }
-
-       /**
-        * Begin a transaction, committing any previously open transaction
-        * @param string $fname
-        */
-       protected function doBegin( $fname = __METHOD__ ) {
-               sqlsrv_begin_transaction( $this->mConn );
-               $this->mTrxLevel = 1;
-       }
-
-       /**
-        * End a transaction
-        * @param string $fname
-        */
-       protected function doCommit( $fname = __METHOD__ ) {
-               sqlsrv_commit( $this->mConn );
-               $this->mTrxLevel = 0;
-       }
-
-       /**
-        * Rollback a transaction.
-        * No-op on non-transactional databases.
-        * @param string $fname
-        */
-       protected function doRollback( $fname = __METHOD__ ) {
-               sqlsrv_rollback( $this->mConn );
-               $this->mTrxLevel = 0;
-       }
-
-       /**
-        * Escapes a identifier for use inm SQL.
-        * Throws an exception if it is invalid.
-        * Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
-        * @param string $identifier
-        * @throws InvalidArgumentException
-        * @return string
-        */
-       private function escapeIdentifier( $identifier ) {
-               if ( strlen( $identifier ) == 0 ) {
-                       throw new InvalidArgumentException( "An identifier must not be empty" );
-               }
-               if ( strlen( $identifier ) > 128 ) {
-                       throw new InvalidArgumentException( "The identifier '$identifier' is too long (max. 128)" );
-               }
-               if ( ( strpos( $identifier, '[' ) !== false )
-                       || ( strpos( $identifier, ']' ) !== false )
-               ) {
-                       // It may be allowed if you quoted with double quotation marks, but
-                       // that would break if QUOTED_IDENTIFIER is OFF
-                       throw new InvalidArgumentException( "Square brackets are not allowed in '$identifier'" );
-               }
-
-               return "[$identifier]";
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       public function strencode( $s ) {
-               // Should not be called by us
-
-               return str_replace( "'", "''", $s );
-       }
-
-       /**
-        * @param string|int|null|bool|Blob $s
-        * @return string|int
-        */
-       public function addQuotes( $s ) {
-               if ( $s instanceof MssqlBlob ) {
-                       return $s->fetch();
-               } elseif ( $s instanceof Blob ) {
-                       // this shouldn't really ever be called, but it's here if needed
-                       // (and will quite possibly make the SQL error out)
-                       $blob = new MssqlBlob( $s->fetch() );
-                       return $blob->fetch();
-               } else {
-                       if ( is_bool( $s ) ) {
-                               $s = $s ? 1 : 0;
-                       }
-                       return parent::addQuotes( $s );
-               }
-       }
-
-       /**
-        * @param string $s
-        * @return string
-        */
-       public function addIdentifierQuotes( $s ) {
-               // http://msdn.microsoft.com/en-us/library/aa223962.aspx
-               return '[' . $s . ']';
-       }
-
-       /**
-        * @param string $name
-        * @return bool
-        */
-       public function isQuotedIdentifier( $name ) {
-               return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
-       }
-
-       /**
-        * MS SQL supports more pattern operators than other databases (ex: [,],^)
-        *
-        * @param string $s
-        * @return string
-        */
-       protected function escapeLikeInternal( $s ) {
-               return addcslashes( $s, '\%_[]^' );
-       }
-
-       /**
-        * MS SQL requires specifying the escape character used in a LIKE query
-        * or using Square brackets to surround characters that are to be escaped
-        * https://msdn.microsoft.com/en-us/library/ms179859.aspx
-        * Here we take the Specify-Escape-Character approach since it's less
-        * invasive, renders a query that is closer to other DB's and better at
-        * handling square bracket escaping
-        *
-        * @return string Fully built LIKE statement
-        */
-       public function buildLike() {
-               $params = func_get_args();
-               if ( count( $params ) > 0 && is_array( $params[0] ) ) {
-                       $params = $params[0];
-               }
-
-               return parent::buildLike( $params ) . " ESCAPE '\' ";
-       }
-
-       /**
-        * @param string $db
-        * @return bool
-        */
-       public function selectDB( $db ) {
-               try {
-                       $this->mDBname = $db;
-                       $this->query( "USE $db" );
-                       return true;
-               } catch ( Exception $e ) {
-                       return false;
-               }
-       }
-
-       /**
-        * @param array $options An associative array of options to be turned into
-        *   an SQL query, valid keys are listed in the function.
-        * @return array
-        */
-       public function makeSelectOptions( $options ) {
-               $tailOpts = '';
-               $startOpts = '';
-
-               $noKeyOptions = [];
-               foreach ( $options as $key => $option ) {
-                       if ( is_numeric( $key ) ) {
-                               $noKeyOptions[$option] = true;
-                       }
-               }
-
-               $tailOpts .= $this->makeGroupByWithHaving( $options );
-
-               $tailOpts .= $this->makeOrderBy( $options );
-
-               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
-                       $startOpts .= 'DISTINCT';
-               }
-
-               if ( isset( $noKeyOptions['FOR XML'] ) ) {
-                       // used in group concat field emulation
-                       $tailOpts .= " FOR XML PATH('')";
-               }
-
-               // we want this to be compatible with the output of parent::makeSelectOptions()
-               return [ $startOpts, '', $tailOpts, '', '' ];
-       }
-
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        * @return string
-        */
-       public function getType() {
-               return 'mssql';
-       }
-
-       /**
-        * @param array $stringList
-        * @return string
-        */
-       public function buildConcat( $stringList ) {
-               return implode( ' + ', $stringList );
-       }
-
-       /**
-        * Build a GROUP_CONCAT or equivalent statement for a query.
-        * MS SQL doesn't have GROUP_CONCAT so we emulate it with other stuff (and boy is it nasty)
-        *
-        * This is useful for combining a field for several rows into a single string.
-        * NULL values will not appear in the output, duplicated values will appear,
-        * and the resulting delimiter-separated values have no defined sort order.
-        * Code using the results may need to use the PHP unique() or sort() methods.
-        *
-        * @param string $delim Glue to bind the results together
-        * @param string|array $table Table name
-        * @param string $field Field name
-        * @param string|array $conds Conditions
-        * @param string|array $join_conds Join conditions
-        * @return string SQL text
-        * @since 1.23
-        */
-       public function buildGroupConcatField( $delim, $table, $field, $conds = '',
-               $join_conds = []
-       ) {
-               $gcsq = 'gcsq_' . $this->mSubqueryId;
-               $this->mSubqueryId++;
-
-               $delimLen = strlen( $delim );
-               $fld = "{$field} + {$this->addQuotes( $delim )}";
-               $sql = "(SELECT LEFT({$field}, LEN({$field}) - {$delimLen}) FROM ("
-                       . $this->selectSQLText( $table, $fld, $conds, null, [ 'FOR XML' ], $join_conds )
-                       . ") {$gcsq} ({$field}))";
-
-               return $sql;
-       }
-
-       /**
-        * Returns an associative array for fields that are of type varbinary, binary, or image
-        * $table can be either a raw table name or passed through tableName() first
-        * @param string $table
-        * @return array
-        */
-       private function getBinaryColumns( $table ) {
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-
-               if ( $this->mBinaryColumnCache === null ) {
-                       $this->populateColumnCaches();
-               }
-
-               return isset( $this->mBinaryColumnCache[$tableRaw] )
-                       ? $this->mBinaryColumnCache[$tableRaw]
-                       : [];
-       }
-
-       /**
-        * @param string $table
-        * @return array
-        */
-       private function getBitColumns( $table ) {
-               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
-               $tableRaw = array_pop( $tableRawArr );
-
-               if ( $this->mBitColumnCache === null ) {
-                       $this->populateColumnCaches();
-               }
-
-               return isset( $this->mBitColumnCache[$tableRaw] )
-                       ? $this->mBitColumnCache[$tableRaw]
-                       : [];
-       }
-
-       private function populateColumnCaches() {
-               $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
-                       [
-                               'TABLE_CATALOG' => $this->mDBname,
-                               'TABLE_SCHEMA' => $this->mSchema,
-                               'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
-                       ] );
-
-               $this->mBinaryColumnCache = [];
-               $this->mBitColumnCache = [];
-               foreach ( $res as $row ) {
-                       if ( $row->DATA_TYPE == 'bit' ) {
-                               $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
-                       } else {
-                               $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
-                       }
-               }
-       }
-
-       /**
-        * @param string $name
-        * @param string $format
-        * @return string
-        */
-       function tableName( $name, $format = 'quoted' ) {
-               # Replace reserved words with better ones
-               switch ( $name ) {
-                       case 'user':
-                               return $this->realTableName( 'mwuser', $format );
-                       default:
-                               return $this->realTableName( $name, $format );
-               }
-       }
-
-       /**
-        * call this instead of tableName() in the updater when renaming tables
-        * @param string $name
-        * @param string $format One of quoted, raw, or split
-        * @return string
-        */
-       function realTableName( $name, $format = 'quoted' ) {
-               $table = parent::tableName( $name, $format );
-               if ( $format == 'split' ) {
-                       // Used internally, we want the schema split off from the table name and returned
-                       // as a list with 3 elements (database, schema, table)
-                       $table = explode( '.', $table );
-                       while ( count( $table ) < 3 ) {
-                               array_unshift( $table, false );
-                       }
-               }
-               return $table;
-       }
-
-       /**
-        * Delete a table
-        * @param string $tableName
-        * @param string $fName
-        * @return bool|ResultWrapper
-        * @since 1.18
-        */
-       public function dropTable( $tableName, $fName = __METHOD__ ) {
-               if ( !$this->tableExists( $tableName, $fName ) ) {
-                       return false;
-               }
-
-               // parent function incorrectly appends CASCADE, which we don't want
-               $sql = "DROP TABLE " . $this->tableName( $tableName );
-
-               return $this->query( $sql, $fName );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param bool|null $value
-        * @return bool|null
-        */
-       public function prepareStatements( $value = null ) {
-               return wfSetVar( $this->mPrepareStatements, $value );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param bool|null $value
-        * @return bool|null
-        */
-       public function scrollableCursor( $value = null ) {
-               return wfSetVar( $this->mScrollableCursor, $value );
-       }
-
-       /**
-        * Called in the installer and updater.
-        * Probably doesn't need to be called anywhere else in the codebase.
-        * @param array|null $value
-        * @return array|null
-        */
-       public function ignoreErrors( array $value = null ) {
-               return wfSetVar( $this->mIgnoreErrors, $value );
-       }
-} // end DatabaseMssql class
index c3502f6..ef5a8fe 100644 (file)
  * @file
  * @ingroup Database
  */
-
-/**
- * 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
- * Oracle-specific bits, like converting column names back to lowercase.
- * @ingroup Database
- */
-class ORAResult {
-       private $rows;
-       private $cursor;
-       private $nrows;
-
-       private $columns = [];
-
-       private function array_unique_md( $array_in ) {
-               $array_out = [];
-               $array_hashes = [];
-
-               foreach ( $array_in as $item ) {
-                       $hash = md5( serialize( $item ) );
-                       if ( !isset( $array_hashes[$hash] ) ) {
-                               $array_hashes[$hash] = $hash;
-                               $array_out[] = $item;
-                       }
-               }
-
-               return $array_out;
-       }
-
-       /**
-        * @param IDatabase $db
-        * @param resource $stmt A valid OCI statement identifier
-        * @param bool $unique
-        */
-       function __construct( &$db, $stmt, $unique = false ) {
-               $this->db =& $db;
-
-               $this->nrows = oci_fetch_all( $stmt, $this->rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW | OCI_NUM );
-               if ( $this->nrows === false ) {
-                       $e = oci_error( $stmt );
-                       $db->reportQueryError( $e['message'], $e['code'], '', __METHOD__ );
-                       $this->free();
-
-                       return;
-               }
-
-               if ( $unique ) {
-                       $this->rows = $this->array_unique_md( $this->rows );
-                       $this->nrows = count( $this->rows );
-               }
-
-               if ( $this->nrows > 0 ) {
-                       foreach ( $this->rows[0] as $k => $v ) {
-                               $this->columns[$k] = strtolower( oci_field_name( $stmt, $k + 1 ) );
-                       }
-               }
-
-               $this->cursor = 0;
-               oci_free_statement( $stmt );
-       }
-
-       public function free() {
-               unset( $this->db );
-       }
-
-       public function seek( $row ) {
-               $this->cursor = min( $row, $this->nrows );
-       }
-
-       public function numRows() {
-               return $this->nrows;
-       }
-
-       public function numFields() {
-               return count( $this->columns );
-       }
-
-       public function fetchObject() {
-               if ( $this->cursor >= $this->nrows ) {
-                       return false;
-               }
-               $row = $this->rows[$this->cursor++];
-               $ret = new stdClass();
-               foreach ( $row as $k => $v ) {
-                       $lc = $this->columns[$k];
-                       $ret->$lc = $v;
-               }
-
-               return $ret;
-       }
-
-       public function fetchRow() {
-               if ( $this->cursor >= $this->nrows ) {
-                       return false;
-               }
-
-               $row = $this->rows[$this->cursor++];
-               $ret = [];
-               foreach ( $row as $k => $v ) {
-                       $lc = $this->columns[$k];
-                       $ret[$lc] = $v;
-                       $ret[$k] = $v;
-               }
-
-               return $ret;
-       }
-}
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
@@ -668,7 +563,7 @@ class DatabaseOracle extends Database {
                list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
                        $this->makeSelectOptions( $selectOptions );
                if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ &$this, 'tableName' ], $srcTable ) );
+                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
                }
@@ -998,7 +893,7 @@ class DatabaseOracle extends Database {
        private function fieldInfoMulti( $table, $field ) {
                $field = strtoupper( $field );
                if ( is_array( $table ) ) {
-                       $table = array_map( [ &$this, 'tableNameInternal' ], $table );
+                       $table = array_map( [ $this, 'tableNameInternal' ], $table );
                        $tableWhere = 'IN (';
                        foreach ( $table as &$singleTable ) {
                                $singleTable = $this->removeIdentifierQuotes( $singleTable );
@@ -1085,24 +980,18 @@ class DatabaseOracle extends Database {
                }
        }
 
-       /**
-        * defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
-        *
-        * @param resource $fp
-        * @param bool|string $lineCallback
-        * @param bool|callable $resultCallback
-        * @param string $fname
-        * @param bool|callable $inputCallback
-        * @return bool|string
-        */
-       function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
-               $fname = __METHOD__, $inputCallback = false ) {
+       function sourceStream(
+               $fp,
+               callable $lineCallback = null,
+               callable $resultCallback = null,
+               $fname = __METHOD__, callable $inputCallback = null
+       ) {
                $cmd = '';
                $done = false;
                $dollarquote = false;
 
                $replacements = [];
-
+               // Defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
                while ( !feof( $fp ) ) {
                        if ( $lineCallback ) {
                                call_user_func( $lineCallback );
index 40418fd..fe063f2 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DatabaseDomain;
 
 /**
  * MediaWiki-specific class for generating database load balancers
@@ -58,6 +59,9 @@ abstract class MWLBFactory {
                        'readOnlyReason' => wfConfiguredReadOnlyReason(),
                ];
 
+               // When making changes here, remember to also specify MediaWiki-specific options
+               // for Database classes in the relevant Installer subclass.
+               // Such as MysqlInstaller::openConnection and PostgresInstaller::openConnectionWithParams.
                if ( $lbConf['class'] === 'LBFactorySimple' ) {
                        if ( isset( $lbConf['servers'] ) ) {
                                // Server array is already explicitly configured; leave alone
@@ -71,7 +75,13 @@ abstract class MWLBFactory {
                                                        // Work around the reserved word usage in MediaWiki schema
                                                        'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ]
                                                ];
+                                       } elseif ( $server['type'] === 'mssql' ) {
+                                               $server += [
+                                                       'port' => $mainConfig->get( 'DBport' ),
+                                                       'useWindowsAuth' => $mainConfig->get( 'DBWindowsAuthentication' )
+                                               ];
                                        }
+
                                        if ( in_array( $server['type'], $typesWithSchema, true ) ) {
                                                $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ];
                                        }
@@ -111,6 +121,9 @@ abstract class MWLBFactory {
                                        $server['port'] = $mainConfig->get( 'DBport' );
                                        // Work around the reserved word usage in MediaWiki schema
                                        $server['keywordTableMap'] = [ 'user' => 'mwuser', 'text' => 'pagecontent' ];
+                               } elseif ( $server['type'] === 'mssql' ) {
+                                       $server['port'] = $mainConfig->get( 'DBport' );
+                                       $server['useWindowsAuth'] = $mainConfig->get( 'DBWindowsAuthentication' );
                                }
                                $lbConf['servers'] = [ $server ];
                        }
@@ -171,6 +184,17 @@ abstract class MWLBFactory {
                        );
                }
 
+               // For configuration backward compatibility after moving classes to namespaces (1.29)
+               $compat = [
+                       'LBFactorySingle' => Wikimedia\Rdbms\LBFactorySingle::class,
+                       'LBFactorySimple' => Wikimedia\Rdbms\LBFactorySimple::class,
+                       'LBFactoryMulti' => Wikimedia\Rdbms\LBFactoryMulti::class
+               ];
+
+               if ( isset( $compat[$class] ) ) {
+                       $class = $compat[$class];
+               }
+
                return $class;
        }
 }
diff --git a/includes/db/ORAField.php b/includes/db/ORAField.php
new file mode 100644 (file)
index 0000000..df31000
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+use Wikimedia\Rdbms\Field;
+
+class ORAField implements Field {
+       private $name, $tablename, $default, $max_length, $nullable,
+               $is_pk, $is_unique, $is_multiple, $is_key, $type;
+
+       function __construct( $info ) {
+               $this->name = $info['column_name'];
+               $this->tablename = $info['table_name'];
+               $this->default = $info['data_default'];
+               $this->max_length = $info['data_length'];
+               $this->nullable = $info['not_null'];
+               $this->is_pk = isset( $info['prim'] ) && $info['prim'] == 1 ? 1 : 0;
+               $this->is_unique = isset( $info['uniq'] ) && $info['uniq'] == 1 ? 1 : 0;
+               $this->is_multiple = isset( $info['nonuniq'] ) && $info['nonuniq'] == 1 ? 1 : 0;
+               $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
+               $this->type = $info['data_type'];
+       }
+
+       function name() {
+               return $this->name;
+       }
+
+       function tableName() {
+               return $this->tablename;
+       }
+
+       function defaultValue() {
+               return $this->default;
+       }
+
+       function maxLength() {
+               return $this->max_length;
+       }
+
+       function isNullable() {
+               return $this->nullable;
+       }
+
+       function isKey() {
+               return $this->is_key;
+       }
+
+       function isMultipleKey() {
+               return $this->is_multiple;
+       }
+
+       function type() {
+               return $this->type;
+       }
+}
diff --git a/includes/db/ORAResult.php b/includes/db/ORAResult.php
new file mode 100644 (file)
index 0000000..07c6fc7
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * 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
+ * Oracle-specific bits, like converting column names back to lowercase.
+ * @ingroup Database
+ */
+class ORAResult {
+       private $rows;
+       private $cursor;
+       private $nrows;
+
+       private $columns = [];
+
+       private function array_unique_md( $array_in ) {
+               $array_out = [];
+               $array_hashes = [];
+
+               foreach ( $array_in as $item ) {
+                       $hash = md5( serialize( $item ) );
+                       if ( !isset( $array_hashes[$hash] ) ) {
+                               $array_hashes[$hash] = $hash;
+                               $array_out[] = $item;
+                       }
+               }
+
+               return $array_out;
+       }
+
+       /**
+        * @param IDatabase $db
+        * @param resource $stmt A valid OCI statement identifier
+        * @param bool $unique
+        */
+       function __construct( &$db, $stmt, $unique = false ) {
+               $this->db =& $db;
+
+               $this->nrows = oci_fetch_all( $stmt, $this->rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW | OCI_NUM );
+               if ( $this->nrows === false ) {
+                       $e = oci_error( $stmt );
+                       $db->reportQueryError( $e['message'], $e['code'], '', __METHOD__ );
+                       $this->free();
+
+                       return;
+               }
+
+               if ( $unique ) {
+                       $this->rows = $this->array_unique_md( $this->rows );
+                       $this->nrows = count( $this->rows );
+               }
+
+               if ( $this->nrows > 0 ) {
+                       foreach ( $this->rows[0] as $k => $v ) {
+                               $this->columns[$k] = strtolower( oci_field_name( $stmt, $k + 1 ) );
+                       }
+               }
+
+               $this->cursor = 0;
+               oci_free_statement( $stmt );
+       }
+
+       public function free() {
+               unset( $this->db );
+       }
+
+       public function seek( $row ) {
+               $this->cursor = min( $row, $this->nrows );
+       }
+
+       public function numRows() {
+               return $this->nrows;
+       }
+
+       public function numFields() {
+               return count( $this->columns );
+       }
+
+       public function fetchObject() {
+               if ( $this->cursor >= $this->nrows ) {
+                       return false;
+               }
+               $row = $this->rows[$this->cursor++];
+               $ret = new stdClass();
+               foreach ( $row as $k => $v ) {
+                       $lc = $this->columns[$k];
+                       $ret->$lc = $v;
+               }
+
+               return $ret;
+       }
+
+       public function fetchRow() {
+               if ( $this->cursor >= $this->nrows ) {
+                       return false;
+               }
+
+               $row = $this->rows[$this->cursor++];
+               $ret = [];
+               foreach ( $row as $k => $v ) {
+                       $lc = $this->columns[$k];
+                       $ret[$lc] = $v;
+                       $ret[$k] = $v;
+               }
+
+               return $ret;
+       }
+}
index 87656f2..e67a0b3 100644 (file)
@@ -370,7 +370,7 @@ class MWDebug {
                                | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start
                                | (?<=[\x0-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle
                                | (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]
-                                  |[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
+                                       | [\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
                                | (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence
                                | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence
                                | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2)
index ce0cda1..2700daa 100644 (file)
@@ -138,9 +138,7 @@ class AvroFormatter implements FormatterInterface {
                                $this->schemas[$channel]['schema'] = AvroSchema::parse( $schema );
                        } else {
                                $this->schemas[$channel]['schema'] = AvroSchema::real_parse(
-                                       $schema,
-                                       null,
-                                       new AvroNamedSchemata()
+                                       $schema
                                );
                        }
                }
index 432a9e1..6670fe9 100644 (file)
@@ -33,12 +33,12 @@ use Psr\Log\LoggerInterface;
  *
  * Constructor options array arguments:
  * * alias: map from monolog channel to kafka topic name. When no
- *       alias exists the topic "monolog_$channel" will be used.
+ *   alias exists the topic "monolog_$channel" will be used.
  * * swallowExceptions: Swallow exceptions that occur while talking to
- *    kafka. Defaults to false.
+ *   kafka. Defaults to false.
  * * logExceptions: Log exceptions talking to kafka here. Either null,
- *    the name of a channel to log to, or an object implementing
- *    FormatterInterface. Defaults to null.
+ *   the name of a channel to log to, or an object implementing
+ *   FormatterInterface. Defaults to null.
  *
  * Requires the nmred/kafka-php library, version >= 1.3.0
  *
index 553cbf6..09ed755 100644 (file)
@@ -6,6 +6,7 @@ namespace MediaWiki\Logger\Monolog;
  * LogstashFormatter squashes the base message array and the context and extras subarrays into one.
  * This can result in unfortunately named context fields overwriting other data (T145133).
  * This class modifies the standard LogstashFormatter to rename such fields and flag the message.
+ * Also changes exception JSON-ification which is done poorly by the standard class.
  *
  * Compatible with Monolog 1.x only.
  *
@@ -80,4 +81,31 @@ class LogstashFormatter extends \Monolog\Formatter\LogstashFormatter {
                }
                return $fields;
        }
+
+       /**
+        * Use a more user-friendly trace format than NormalizerFormatter
+        * @param \Exception|\Throwable $e
+        * @return array
+        */
+       protected function normalizeException( $e ) {
+               if ( !$e instanceof \Exception && !$e instanceof \Throwable ) {
+                       throw new \InvalidArgumentException( 'Exception/Throwable expected, got '
+                               . gettype( $e ) . ' / ' . get_class( $e ) );
+               }
+
+               $data = [
+                       'class' => get_class( $e ),
+                       'message' => $e->getMessage(),
+                       'code' => $e->getCode(),
+                       'file' => $e->getFile() . ':' . $e->getLine(),
+                       'trace' => \MWExceptionHandler::getRedactedTraceAsString( $e ),
+               ];
+
+               $previous = $e->getPrevious();
+               if ( $previous ) {
+                       $data['previous'] = $this->normalizeException( $previous );
+               }
+
+               return $data;
+       }
 }
index 1ba6c1f..0a9755d 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class for managing the deferred updates
@@ -334,6 +336,21 @@ class DeferredUpdates {
                return count( self::$preSendUpdates ) + count( self::$postSendUpdates );
        }
 
+       /**
+        * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL)
+        * @since 1.29
+        */
+       public static function getPendingUpdates( $stage = self::ALL ) {
+               $updates = [];
+               if ( $stage === self::ALL || $stage === self::PRESEND ) {
+                       $updates = array_merge( $updates, self::$preSendUpdates );
+               }
+               if ( $stage === self::ALL || $stage === self::POSTSEND ) {
+                       $updates = array_merge( $updates, self::$postSendUpdates );
+               }
+               return $updates;
+       }
+
        /**
         * Clear all pending updates without performing them. Generally, you don't
         * want or need to call this. Unit tests need it though.
index 229a9a2..0133f19 100644 (file)
@@ -145,7 +145,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                        # If the sortkey is longer then 255 bytes,
                        # it truncated by DB, and then doesn't get
                        # matched when comparing existing vs current
-                       # categories, causing bug 25254.
+                       # categories, causing T27254.
                        # Also. substr behaves weird when given "".
                        if ( $sortkey !== '' ) {
                                $sortkey = substr( $sortkey, 0, 255 );
@@ -154,7 +154,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                $this->mRecursive = $recursive;
 
-               Hooks::run( 'LinksUpdateConstructed', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $linksUpdate = $this;
+               Hooks::run( 'LinksUpdateConstructed', [ &$linksUpdate ] );
        }
 
        /**
@@ -169,7 +171,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                        $scopedLock = self::acquirePageLock( $this->getDB(), $this->mId );
                }
 
-               Hooks::run( 'LinksUpdate', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $linksUpdate = $this;
+               Hooks::run( 'LinksUpdate', [ &$linksUpdate ] );
                $this->doIncrementalUpdate();
 
                // Commit and release the lock (if set)
@@ -177,7 +181,9 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                // Run post-commit hooks without DBO_TRX
                $this->getDB()->onTransactionIdle(
                        function () {
-                               Hooks::run( 'LinksUpdateComplete', [ &$this, $this->ticket ] );
+                               // Avoid PHP 7.1 warning from passing $this by reference
+                               $linksUpdate = $this;
+                               Hooks::run( 'LinksUpdateComplete', [ &$linksUpdate, $this->ticket ] );
                        },
                        __METHOD__
                );
index 559a5ec..148e50c 100644 (file)
@@ -82,7 +82,7 @@ class DifferenceEngine extends ContextSource {
        /**
         * Set this to true to add debug info to the HTML output.
         * Warning: this may cause RSS readers to spuriously mark articles as "new"
-        * (bug 20601)
+        * (T22601)
         */
        public $enableDebugComment = false;
 
@@ -762,8 +762,11 @@ class DifferenceEngine extends ContextSource {
 
                $difftext = $this->generateContentDiffBody( $this->mOldContent, $this->mNewContent );
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $diffEngine = $this;
+
                // Save to cache for 7 days
-               if ( !Hooks::run( 'AbortDiffCache', [ &$this ] ) ) {
+               if ( !Hooks::run( 'AbortDiffCache', [ &$diffEngine ] ) ) {
                        wfIncrStats( 'diff_cache.uncacheable' );
                } elseif ( $key !== false && $difftext !== false ) {
                        wfIncrStats( 'diff_cache.miss' );
@@ -982,7 +985,7 @@ class DifferenceEngine extends ContextSource {
        public function localiseLineNumbers( $text ) {
                return preg_replace_callback(
                        '/<!--LINE (\d+)-->/',
-                       [ &$this, 'localiseLineNumbersCb' ],
+                       [ $this, 'localiseLineNumbersCb' ],
                        $text
                );
        }
index a26775f..ad80275 100644 (file)
@@ -46,11 +46,9 @@ class WordAccumulator {
        private function flushGroup( $new_tag ) {
                if ( $this->group !== '' ) {
                        if ( $this->tag == 'ins' ) {
-                               $this->line .= "<ins{$this->insClass}>" .
-                                                          htmlspecialchars( $this->group ) . '</ins>';
+                               $this->line .= "<ins{$this->insClass}>" . htmlspecialchars( $this->group ) . '</ins>';
                        } elseif ( $this->tag == 'del' ) {
-                               $this->line .= "<del{$this->delClass}>" .
-                                                          htmlspecialchars( $this->group ) . '</del>';
+                               $this->line .= "<del{$this->delClass}>" . htmlspecialchars( $this->group ) . '</del>';
                        } else {
                                $this->line .= htmlspecialchars( $this->group );
                        }
index 9b5a268..2bed87a 100644 (file)
@@ -39,7 +39,7 @@ class ErrorPageError extends MWException implements ILocalizedException {
                $this->msg = $msg;
                $this->params = $params;
 
-               // Bug 44111: Messages in the log files should be in English and not
+               // T46111: Messages in the log files should be in English and not
                // customized by the local wiki. So get the default English version for
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
index bef379e..749be3c 100644 (file)
@@ -20,6 +20,7 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Psr\Log\LogLevel;
 
 /**
  * Handler class for MWExceptions
@@ -174,31 +175,37 @@ class MWExceptionHandler {
                switch ( $level ) {
                        case E_RECOVERABLE_ERROR:
                                $levelName = 'Error';
+                               $severity = LogLevel::ERROR;
                                break;
                        case E_WARNING:
                        case E_CORE_WARNING:
                        case E_COMPILE_WARNING:
                        case E_USER_WARNING:
                                $levelName = 'Warning';
+                               $severity = LogLevel::WARNING;
                                break;
                        case E_NOTICE:
                        case E_USER_NOTICE:
                                $levelName = 'Notice';
+                               $severity = LogLevel::INFO;
                                break;
                        case E_STRICT:
                                $levelName = 'Strict Standards';
+                               $severity = LogLevel::DEBUG;
                                break;
                        case E_DEPRECATED:
                        case E_USER_DEPRECATED:
                                $levelName = 'Deprecated';
+                               $severity = LogLevel::INFO;
                                break;
                        default:
                                $levelName = 'Unknown error';
+                               $severity = LogLevel::ERROR;
                                break;
                }
 
                $e = new ErrorException( "PHP $levelName: $message", 0, $level, $file, $line );
-               self::logError( $e, 'error' );
+               self::logError( $e, 'error', $severity );
 
                // This handler is for logging only. Return false will instruct PHP
                // to continue regular handling.
@@ -335,7 +342,7 @@ TXT;
                                $text .= "{$pad}#{$level} {$frame['file']}({$frame['line']}): ";
                        } else {
                                // 'file' and 'line' are unset for calls via call_user_func
-                               // (bug 55634) This matches behaviour of
+                               // (T57634) This matches behaviour of
                                // Exception::getTraceAsString to instead display "[internal
                                // function]".
                                $text .= "{$pad}#{$level} [internal function]: ";
@@ -621,8 +628,11 @@ TXT;
         * @since 1.25
         * @param ErrorException $e
         * @param string $channel
+        * @param string $level
        */
-       protected static function logError( ErrorException $e, $channel ) {
+       protected static function logError(
+               ErrorException $e, $channel, $level = LogLevel::ERROR
+       ) {
                $catcher = self::CAUGHT_BY_HANDLER;
                // The set_error_handler callback is independent from error_reporting.
                // Filter out unwanted errors manually (e.g. when
@@ -630,7 +640,8 @@ TXT;
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
                        $logger = LoggerFactory::getInstance( $channel );
-                       $logger->error(
+                       $logger->log(
+                               $level,
                                self::getLogMessage( $e ),
                                self::getLogContext( $e, $catcher )
                        );
@@ -640,7 +651,7 @@ TXT;
                $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK, $catcher );
                if ( $json !== false ) {
                        $logger = LoggerFactory::getInstance( "{$channel}-json" );
-                       $logger->error( $json, [ 'private' => true ] );
+                       $logger->log( $level, $json, [ 'private' => true ] );
                }
 
                Hooks::run( 'LogException', [ $e, $suppressed ] );
index 43c5b09..6086d55 100644 (file)
@@ -32,7 +32,7 @@
  * @par Example:
  * @code
  * if( $user->isAnon() ) {
- *     throw new UserNotLoggedIn();
+ *   throw new UserNotLoggedIn();
  * }
  * @endcode
  *
  * @par Example:
  * @code
  * if( $user->isAnon() ) {
- *     throw new UserNotLoggedIn( 'action-require-loggedin' );
+ *   throw new UserNotLoggedIn( 'action-require-loggedin' );
  * }
  * @endcode
  *
- * @see bug 37627
+ * @see T39627
  * @since 1.20
  * @ingroup Exception
  */
index c1f2d59..e41ab54 100644 (file)
@@ -27,6 +27,8 @@
  * @defgroup Dump Dump
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * @ingroup SpecialPage Dump
  */
@@ -343,7 +345,7 @@ class WikiExporter {
                                # query optimization for history stub dumps
                                if ( $this->text == WikiExporter::STUB && $orderRevs ) {
                                        $tables = [ 'revision', 'page' ];
-                                       $opts[] = 'STRAIGHT_JOIN';
+                                       $opts[] = 'STRAIGHT_JOIN';
                                        $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
                                        $opts['USE INDEX']['revision'] = 'rev_page_id';
                                        $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
index 5be166b..52bf0f0 100644 (file)
@@ -269,7 +269,9 @@ class XmlDumpWriter {
                        $out .= "      <sha1/>\n";
                }
 
-               Hooks::run( 'XmlDumpWriterWriteRevision', [ &$this, &$out, $row, $text ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $writer = $this;
+               Hooks::run( 'XmlDumpWriterWriteRevision', [ &$writer, &$out, $row, $text ] );
 
                $out .= "    </revision>\n";
 
index 52c1a4c..d907c30 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * DB accessable external objects.
  *
@@ -106,9 +108,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return LoadBalancer
         */
        private function getLoadBalancer( $cluster ) {
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
-
-               return wfGetLBFactory()->getExternalLB( $cluster, $wiki );
+               return wfGetLBFactory()->getExternalLB( $cluster );
        }
 
        /**
index 2e06c40..62e635d 100644 (file)
@@ -22,6 +22,8 @@
  * @author Aaron Schulz
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Version of FileJournal that logs to a DB table
  * @since 1.20
@@ -180,7 +182,7 @@ class DBFileJournal extends FileJournal {
        protected function getMasterDB() {
                if ( !$this->dbw ) {
                        // Get a separate connection in autocommit mode
-                       $lb = wfGetLBFactory()->newMainLB();
+                       $lb =  MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB();
                        $this->dbw = $lb->getConnection( DB_MASTER, [], $this->wiki );
                        $this->dbw->clearFlag( DBO_TRX );
                }
index 0e4b2f0..8edf81f 100644 (file)
@@ -1448,7 +1448,7 @@ class FileRepo {
                                'dst' => $archivePath,
                                // We may have 2+ identical files being deleted,
                                // all of which will map to the same destination file
-                               'overwriteSame' => true // also see bug 31792
+                               'overwriteSame' => true // also see T33792
                        ];
                }
 
index d49ae7b..d5e29ab 100644 (file)
@@ -22,6 +22,8 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A repository that stores files in the local filesystem and registers them
  * in the wiki's own database. This is the most commonly used repository class.
index be78462..3b873ea 100644 (file)
@@ -919,7 +919,7 @@ abstract class File implements IDBAccessObject {
                        return $this->iconThumb();
                }
                $hp['width'] = $width;
-               // be sure to ignore any height specification as well (bug 62258)
+               // be sure to ignore any height specification as well (T64258)
                unset( $hp['height'] );
 
                return $this->transform( $hp );
@@ -1039,7 +1039,7 @@ abstract class File implements IDBAccessObject {
                                break; // not a bitmap or renderable image, don't try
                        }
 
-                       // Get the descriptionUrl to embed it as comment into the thumbnail. Bug 19791.
+                       // Get the descriptionUrl to embed it as comment into the thumbnail. T21791.
                        $descriptionUrl = $this->getDescriptionUrl();
                        if ( $descriptionUrl ) {
                                $params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
index c6c49b4..f6f44e6 100644 (file)
@@ -120,10 +120,10 @@ class ForeignDBFile extends LocalFile {
        }
 
        /**
-        * @param bool|Language $lang Optional language to fetch description in.
+        * @param Language|null $lang Optional language to fetch description in.
         * @return string|false
         */
-       function getDescriptionText( $lang = false ) {
+       function getDescriptionText( $lang = null ) {
                global $wgLang;
 
                if ( !$this->repo->fetchDescription ) {
index be0751f..a1cb0a2 100644 (file)
@@ -891,7 +891,7 @@ class LocalFile extends File {
                                $files[] = $file;
                        }
                } catch ( FileBackendError $e ) {
-               } // suppress (bug 54674)
+               } // suppress (T56674)
 
                return $files;
        }
@@ -1070,7 +1070,9 @@ class LocalFile extends File {
                $opts['ORDER BY'] = "oi_timestamp $order";
                $opts['USE INDEX'] = [ 'oldimage' => 'oi_name_timestamp' ];
 
-               Hooks::run( 'LocalFile::getHistory', [ &$this, &$tables, &$fields,
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $localFile = $this;
+               Hooks::run( 'LocalFile::getHistory', [ &$localFile, &$tables, &$fields,
                        &$conds, &$opts, &$join_conds ] );
 
                $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $opts, $join_conds );
@@ -1351,7 +1353,7 @@ class LocalFile extends File {
                                }
                        }
 
-                       # (bug 34993) Note: $oldver can be empty here, if the previous
+                       # (T36993) Note: $oldver can be empty here, if the previous
                        # version of the file was broken. Allow registration of the new
                        # version to continue anyway, because that's better than having
                        # an image that's not fixable by user operations.
@@ -2005,7 +2007,7 @@ class LocalFile extends File {
                        $dbw = $this->repo->getMasterDB();
                        $makesTransaction = !$dbw->trxLevel();
                        $dbw->startAtomic( self::ATOMIC_SECTION_LOCK );
-                       // Bug 54736: use simple lock to handle when the file does not exist.
+                       // T56736: use simple lock to handle when the file does not exist.
                        // SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
                        // Also, that would cause contention on INSERT of similarly named rows.
                        $status = $this->acquireFileLock(); // represents all versions of the file
@@ -3033,7 +3035,7 @@ class LocalFileMoveBatch {
                        $status->failCount++;
                }
                $status->successCount += $oldRowCount;
-               // Bug 34934: oldCount is based on files that actually exist.
+               // T36934: oldCount is based on files that actually exist.
                // There may be more DB rows than such files, in which case $affected
                // can be greater than $total. We use max() to avoid negatives here.
                $status->failCount += max( 0, $this->oldCount - $oldRowCount );
index e627cfd..399147b 100644 (file)
@@ -165,6 +165,7 @@ class HTMLForm extends ContextSource {
                'url' => 'HTMLTextField',
                'title' => 'HTMLTitleTextField',
                'user' => 'HTMLUserTextField',
+               'usersmultiselect' => 'HTMLUsersMultiselectField',
        ];
 
        public $mFieldData;
@@ -1258,7 +1259,7 @@ class HTMLForm extends ContextSource {
         *
         * @param string|array|Status $elements The set of errors/warnings to process.
         * @param string $elementsType Should warnings or errors be returned.  This is meant
-        *      for Status objects, all other valid types are always considered as errors.
+        *     for Status objects, all other valid types are always considered as errors.
         * @return string
         */
        public function getErrorsOrWarnings( $elements, $elementsType ) {
diff --git a/includes/htmlform/fields/HTMLUsersMultiselectField.php b/includes/htmlform/fields/HTMLUsersMultiselectField.php
new file mode 100644 (file)
index 0000000..8c1241d
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+use MediaWiki\Widget\UsersMultiselectWidget;
+
+/**
+ * Implements a capsule multiselect input field for user names.
+ *
+ * Besides the parameters recognized by HTMLUserTextField, additional recognized
+ * parameters are:
+ *  default - (optional) Array of usernames to use as preset data
+ *  placeholder - (optional) Custom placeholder message for input
+ *
+ * The result is the array of usernames
+ *
+ * @note This widget is not likely to remain functional in non-OOUI forms.
+ */
+class HTMLUsersMultiselectField extends HTMLUserTextField {
+
+       public function loadDataFromRequest( $request ) {
+               if ( !$request->getCheck( $this->mName ) ) {
+                       return $this->getDefault();
+               }
+
+               $usersArray = explode( "\n", $request->getText( $this->mName ) );
+               // Remove empty lines
+               $usersArray = array_values( array_filter( $usersArray, function( $username ) {
+                       return trim( $username ) !== '';
+               } ) );
+               return $usersArray;
+       }
+
+       public function validate( $value, $alldata ) {
+               if ( !$this->mParams['exists'] ) {
+                       return true;
+               }
+
+               if ( is_null( $value ) ) {
+                       return false;
+               }
+
+               foreach ( $value as $username ) {
+                       $result = parent::validate( $username, $alldata );
+                       if ( $result !== true ) {
+                               return $result;
+                       }
+               }
+
+               return true;
+       }
+
+       public function getInputHTML( $values ) {
+               $this->mParent->getOutput()->enableOOUI();
+               return $this->getInputOOUI( $values );
+       }
+
+       public function getInputOOUI( $values ) {
+               $params = [ 'name' => $this->mName ];
+
+               if ( isset( $this->mParams['default'] ) ) {
+                       $params['default'] = $this->mParams['default'];
+               }
+
+               if ( isset( $this->mParams['placeholder'] ) ) {
+                       $params['placeholder'] = $this->mParams['placeholder'];
+               } else {
+                       $params['placeholder'] = $this->msg( 'mw-widgets-usersmultiselect-placeholder' )
+                                                       ->inContentLanguage()
+                                                       ->plain();
+               }
+
+               if ( !is_null( $values ) ) {
+                       $params['default'] = $values;
+               }
+
+               return new UsersMultiselectWidget( $params );
+       }
+
+       protected function shouldInfuseOOUI() {
+               return true;
+       }
+
+       protected function getOOUIModules() {
+               return [ 'mediawiki.widgets.UsersMultiselectWidget' ];
+       }
+
+}
index 779d606..fa2d5a3 100644 (file)
@@ -46,8 +46,8 @@ class Http {
         *    - caInfo              Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
         *    - followRedirects     Whether to follow redirects (defaults to false).
-        *                                  Note: this should only be used when the target URL is trusted,
-        *                                  to avoid attacks on intranet services accessible by HTTP.
+        *                          Note: this should only be used when the target URL is trusted,
+        *                          to avoid attacks on intranet services accessible by HTTP.
         *    - userAgent           A user agent, if you want to override the default
         *                          MediaWiki/$wgVersion
         *    - logger              A \Psr\Logger\LoggerInterface instance for debug logging
index fac052f..e04402f 100644 (file)
@@ -132,7 +132,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                foreach ( $members as $o ) {
                        if ( isset( $options[$o] ) ) {
                                // ensure that MWHttpRequest::method is always
-                               // uppercased. Bug 36137
+                               // uppercased. T38137
                                if ( $o == 'method' ) {
                                        $options[$o] = strtoupper( $options[$o] );
                                }
@@ -580,7 +580,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         *
         * Note that the multiple Location: headers are an artifact of
         * CURL -- they shouldn't actually get returned this way. Rewrite
-        * this when bug 29232 is taken care of (high-level redirect
+        * this when T31232 is taken care of (high-level redirect
         * handling rewrite).
         *
         * @return string
index 1769924..06b579a 100644 (file)
@@ -546,7 +546,7 @@ class WikiImporter {
        public function doImport() {
                // Calls to reader->read need to be wrapped in calls to
                // libxml_disable_entity_loader() to avoid local file
-               // inclusion attacks (bug 46932).
+               // inclusion attacks (T48932).
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->read();
 
index 50d73de..0305535 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\LBFactorySingle;
 
 /**
  * Base class for DBMS-specific installation helper classes.
index 6a8a99f..f8ab1f2 100644 (file)
@@ -59,6 +59,11 @@ abstract class DatabaseUpdater {
         */
        protected $db;
 
+       /**
+        * @var Maintenance
+        */
+       protected $maintenance;
+
        protected $shared = false;
 
        /**
@@ -485,7 +490,7 @@ abstract class DatabaseUpdater {
        public function updateRowExists( $key ) {
                $row = $this->db->selectRow(
                        'updatelog',
-                       # Bug 65813
+                       # T67813
                        '1 AS X',
                        [ 'ul_key' => $key ],
                        __METHOD__
index 9c87cf0..f03fe6a 100644 (file)
@@ -216,7 +216,7 @@ abstract class Installer {
                '_UpgradeKeySupplied' => false,
                '_ExistingDBSettings' => false,
 
-               // $wgLogo is probably wrong (bug 48084); set something that will work.
+               // $wgLogo is probably wrong (T50084); set something that will work.
                // Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
                'wgLogo' => '$wgResourceBasePath/resources/assets/wiki.png',
                'wgAuthenticationTokenVersion' => 1,
@@ -1431,7 +1431,7 @@ abstract class Installer {
                        );
                }
                // Unset everyone else's hooks. Lord knows what someone might be doing
-               // in ParserFirstCallInit (see bug 27171)
+               // in ParserFirstCallInit (see T29171)
                $GLOBALS['wgHooks'] = [ 'LoadExtensionSchemaUpdates' => $hooksWeWant ];
 
                return Status::newGood();
index 5e8ed3f..d6efeb2 100644 (file)
@@ -214,6 +214,7 @@ class MssqlInstaller extends DatabaseInstaller {
                try {
                        $db = Database::factory( 'mssql', [
                                'host' => $this->getVar( 'wgDBserver' ),
+                               'port' => $this->getVar( 'wgDBport' ),
                                'user' => $user,
                                'password' => $password,
                                'dbname' => false,
index 7a27f5f..3131c3c 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\Field;
+use Wikimedia\Rdbms\MySQLField;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Mysql update list and mysql-specific update functions.
@@ -294,6 +297,7 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'dropIndex', 'user_groups', 'ug_user_group', 'patch-user_groups-primary-key.sql' ],
                        [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
                ];
        }
@@ -820,7 +824,7 @@ class MysqlUpdater extends DatabaseUpdater {
        /**
         * Set page_random field to a random value where it is equals to 0.
         *
-        * @see bug 3946
+        * @see T5946
         */
        protected function doPageRandomUpdate() {
                $page = $this->db->tableName( 'page' );
@@ -852,7 +856,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        foreach ( $res as $row ) {
                                $count = ( $count + 1 ) % 100;
                                if ( $count == 0 ) {
-                                       wfGetLBFactory()->waitForReplication( [ 'wiki' => wfWikiID() ] );
+                                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                                       $lbFactory->waitForReplication( [ 'wiki' => wfWikiID() ] );
                                }
                                $this->db->insert( 'templatelinks',
                                        [
index 6dfa28b..906768f 100644 (file)
@@ -156,10 +156,13 @@ class PostgresInstaller extends DatabaseInstaller {
                try {
                        $db = Database::factory( 'postgres', [
                                'host' => $this->getVar( 'wgDBserver' ),
+                               'port' => $this->getVar( 'wgDBport' ),
                                'user' => $user,
                                'password' => $password,
                                'dbname' => $dbName,
-                               'schema' => $schema ] );
+                               'schema' => $schema,
+                               'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ],
+                       ] );
                        $status->value = $db;
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
index e041fdd..1a7b208 100644 (file)
@@ -496,8 +496,8 @@ class PostgresUpdater extends DatabaseUpdater {
                $q = <<<END
 SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
        WHERE pg_class.relnamespace = pg_namespace.oid
-         AND attrelid=pg_class.oid AND attnum > 0
-         AND relname=%s AND nspname=%s
+               AND attrelid=pg_class.oid AND attnum > 0
+               AND relname=%s AND nspname=%s
 END;
                $res = $this->db->query( sprintf( $q,
                        $this->db->addQuotes( $table ),
@@ -523,9 +523,9 @@ END;
                $q = <<<END
 SELECT indkey, indrelid FROM pg_namespace, pg_class, pg_index
        WHERE nspname=%s
-         AND pg_class.relnamespace = pg_namespace.oid
-         AND relname=%s
-         AND indexrelid=pg_class.oid
+               AND pg_class.relnamespace = pg_namespace.oid
+               AND relname=%s
+               AND indexrelid=pg_class.oid
 END;
                $res = $this->db->query(
                        sprintf(
@@ -551,8 +551,8 @@ END;
                        $query = <<<END
 SELECT attname FROM pg_class, pg_attribute
        WHERE attrelid=$relid
-         AND attnum=%d
-         AND attrelid=pg_class.oid
+               AND attnum=%d
+               AND attrelid=pg_class.oid
 END;
                        $r2 = $this->db->query( sprintf( $query, $rid ) );
                        if ( !$r2 ) {
@@ -572,8 +572,8 @@ END;
                $q = <<<END
 SELECT confdeltype FROM pg_constraint, pg_namespace
        WHERE connamespace=pg_namespace.oid
-         AND nspname=%s
-         AND conname=%s;
+               AND nspname=%s
+               AND conname=%s;
 END;
                $r = $this->db->query(
                        sprintf(
@@ -594,8 +594,8 @@ END;
                $q = <<<END
 SELECT definition FROM pg_rules
        WHERE schemaname = %s
-         AND tablename = %s
-         AND rulename = %s
+               AND tablename = %s
+               AND rulename = %s
 END;
                $r = $this->db->query(
                        sprintf(
@@ -981,10 +981,10 @@ END;
 
        protected function rebuildTextSearch() {
                if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
-                       $this->output( "...bug 66650 already fixed or not applicable.\n" );
+                       $this->output( "...T68650 already fixed or not applicable.\n" );
                        return;
                };
                $this->applyPatch( 'patch-textsearch_bug66650.sql', false,
-                       'Rebuilding text search for bug 66650' );
+                       'Rebuilding text search for T68650' );
        }
 }
index c5c4a7c..0fe7068 100644 (file)
@@ -244,9 +244,9 @@ class SqliteInstaller extends DatabaseInstaller {
                        $sql =
 <<<EOT
        CREATE TABLE IF NOT EXISTS objectcache (
-         keyname BLOB NOT NULL default '' PRIMARY KEY,
-         value BLOB,
-         exptime TEXT
+               keyname BLOB NOT NULL default '' PRIMARY KEY,
+               value BLOB,
+               exptime TEXT
        )
 EOT;
                        $conn->query( $sql );
index c08212e..c94f0bf 100644 (file)
@@ -1083,7 +1083,7 @@ class WebInstaller extends Installer {
 
                foreach ( $varNames as $name ) {
                        $value = $this->request->getVal( $prefix . $name );
-                       // bug 30524, do not trim passwords
+                       // T32524, do not trim passwords
                        if ( stripos( $name, 'password' ) === false ) {
                                $value = trim( $value );
                        }
index e6deed5..81a107d 100644 (file)
@@ -251,7 +251,7 @@ class WebInstallerName extends WebInstallerPage {
                        $retVal = false;
                }
                // If they asked to subscribe to mediawiki-announce but didn't give
-               // an e-mail, show an error. Bug 29332
+               // an e-mail, show an error. T31332
                if ( !$email && $this->getVar( '_Subscribe' ) ) {
                        $this->parent->showError( 'config-subscribe-noemail' );
                        $retVal = false;
index 62fe785..e4eb255 100644 (file)
@@ -299,9 +299,9 @@ class WebInstallerOutput {
 
 <div id="mw-panel">
        <div class="portal" id="p-logo">
-         <a style="background-image: url(images/installer-logo.png);"
-               href="https://www.mediawiki.org/"
-               title="Main Page"></a>
+               <a style="background-image: url(images/installer-logo.png);"
+                       href="https://www.mediawiki.org/"
+                       title="Main Page"></a>
        </div>
 <?php
        $message = wfMessage( 'config-sidebar' )->plain();
index 2ab0554..7a41ceb 100644 (file)
@@ -92,7 +92,7 @@ abstract class WebInstallerPage {
                }
 
                if ( $continue ) {
-                       // Fake submit button for enter keypress (bug 26267)
+                       // Fake submit button for enter keypress (T28267)
                        // Messages: config-continue, config-restart, config-regenerate
                        $s .= Xml::submitButton(
                                wfMessage( "config-$continue" )->text(),
index 72973e7..bf732a4 100644 (file)
@@ -67,7 +67,7 @@ class WebInstallerUpgrade extends WebInstallerPage {
 
                        if ( $result ) {
                                // If they're going to possibly regenerate LocalSettings, we
-                               // need to create the upgrade/secret keys. Bug 26481
+                               // need to create the upgrade/secret keys. T28481
                                if ( !$this->getVar( '_ExistingDBSettings' ) ) {
                                        $this->parent->generateKeys();
                                }
index 4a1ed65..b950420 100644 (file)
@@ -65,6 +65,7 @@
        "config-apc": "[http://www.php.net/apc APC] е инсталиран",
        "config-apcu": "[http://www.php.net/apc APC] е инсталиран",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран",
+       "config-no-cache-apcu": "<strong>Внимание:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] и [http://www.iis.net/download/WinCacheForPhp WinCache] не могат да бъдат открити.\nКеширането на обекти не е активирано.",
        "config-mod-security": "<strong>Предупреждение:</strong> [http://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [http://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
        "config-diff3-bad": "GNU diff3 не беше намерен.",
        "config-git": "Налична е системата за контрол на версиите Git: <code>$1</code>.",
@@ -84,6 +85,7 @@
        "config-db-host": "Хост на базата от данни:",
        "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
        "config-db-host-oracle": "TNS на базата данни:",
+       "config-db-host-oracle-help": "Въведете валидно [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файлът tnsnames.ora трябва да бъде видим за инсталацията.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Идентифициране на това уики",
        "config-db-name": "Име на базата от данни:",
        "config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Предупреждение''': Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.",
+       "config-mysql-only-myisam-dep": "<strong>Внимание:</strong> MyISAM e единственият наличен на тази машина тип на таблиците за MySQL и не е препоръчителен за употреба при МедияУики защото:\n* има слаба поддръжка на конкурентност на заявките, поради закючването на таблиците\n* е много по-податлив на грешки в базите от данни от другите типове таблици\n* кодът на МедияУики не винаги работи с MyISAM както трябва\n\nВашият MySQL не поддържа InnoDB, така че може би е дошло време за актуализиране.",
        "config-mysql-engine-help": "'''InnoDB''' почти винаги е най-добрата възможност заради навременната си поддръжка.\n\n'''MyISAM''' може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.",
        "config-mysql-charset": "Набор от символи в базата от данни:",
        "config-mysql-binary": "Бинарен",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "В '''бинарен режим''' МедияУики съхранява текстовете в UTF-8 в бинарни полета в базата от данни.\nТова е по-ефективно от UTF-8 режима на MySQL и позволява използването на пълния набор от символи в Уникод.\n\nВ '''UTF-8 режим''' MySQL ще знае в кой набор от символи са данните от уикито и ще може да ги показва и променя по подходящ начин, но няма да позволява складиране на символи извън [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основния многоезичен набор].",
        "config-mssql-auth": "Тип на удостоверяването:",
+       "config-mssql-install-auth": "Изберете начин за удостоверяване, който ще бъде използван за връзка с базата от данни по време на инсталацията.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
+       "config-mssql-web-auth": "Изберете начина за удостоверяване, който ще се използва от уеб сървъра за връзка със сървъра за бази от данни по време на нормалните операции на уикито.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
        "config-mssql-sqlauth": "Удостоверяване чрез SQL Server",
        "config-mssql-windowsauth": "Удостоверяване чрез Windows",
        "config-site-name": "Име на уикито:",
        "config-install-subscribe-fail": "Невъзможно беше абонирането за mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "не е инсталиран cURL и <code>allow_url_fopen</code> не е налична.",
        "config-install-mainpage": "Създаване на Началната страница със съдържание по подразбиране",
+       "config-install-mainpage-exists": "Главната страница вече съществува, преминаване напред",
        "config-install-extension-tables": "Създаване на таблици за включените разширения",
        "config-install-mainpage-failed": "Вмъкването на Началната страница беше невъзможно: $1",
        "config-install-done": "<strong>Поздравления!</strong>\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл <code>LocalSettings.php</code>.\nТой съдържа всичката необходима основна конфигурация на уикито.\n\nНеобходимо е той да бъде изтеглен и поставен в основната директория на уикито (директорията, в която е и index.php). Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\n<strong>Забележка:</strong> Ако това не бъде извършено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, <strong>[$2 уикито ще е достъпно на този адрес]</strong>.",
index b5a146d..34efde4 100644 (file)
        "config-install-user-alreadyexists": "ব্যবহারকারী \"$1\" ইতিমধ্যে বিদ্যমান আছে",
        "config-install-tables": "টেবিল তৈরি",
        "config-install-keys": "গোপন কি তৈরি",
-       "config-install-mainpage-exists": "মà§\81à¦\96à§\8dয à¦ªà§\83ষà§\8dঠা à¦\87তিমধà§\8dযà§\87à¦\87 à¦¬à¦¿à¦¦à§\8dযমান, skipping",
+       "config-install-mainpage-exists": "পà§\8dরধান à¦ªà¦¾à¦¤à¦¾ à¦\87তিমধà§\8dযà§\87à¦\87 à¦¬à¦¿à¦¦à§\8dযমান, à¦\8fডিয়à§\87 à¦¯à¦¾à¦\93য়া à¦¹à¦\9aà§\8dà¦\9bà§\87",
        "config-help": "সাহায্য",
        "config-help-tooltip": "প্রসারিত করতে ক্লিক করুন",
        "mainpagetext": "<strong>মিডিয়াউইকি ইনস্টল করা হয়েছে।</strong>",
index 1211929..779ad6d 100644 (file)
        "config-admin-error-user": "Fazi diabarzh en ur grouiñ ur merer gant an anv \"<nowiki>$1</nowiki>\".",
        "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 da [https://lists.wikimedia.org/mailman/listinfo/mediawiki-listenn kemennadoù evit ar stummoù nevez].",
+       "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].",
        "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-email-user": "Gweredekaat ar posteloù a implijer da implijer",
        "config-email-user-help": "Aotren a ra an holl implijerien da gas posteloù an eil d'egile mard eo bet gweredekaet an arc'hwel ganto en ho penndibaboù.",
        "config-email-usertalk": "Gweredekaat kemennadur pajennoù kaozeal an implijerien",
-       "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennadennoù ma vez kemmet o fajennoù kaozeal, ma vez gweredekaet en o fenndibaboù.",
+       "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennoù ma vez kemmet o fajennoù kaozeal, gant ma vo gweredekaet en o fenndibaboù.",
        "config-email-watchlist": "Gweredekaat ar c'hemenn listenn evezhiañ",
-       "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennadennoù diwar-benn ar pajennoù evezhiet ganto, ma vez gweredekaet en o fenndibaboù.",
+       "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennoù diwar-benn ar pajennoù evezhiet ganto, gant ma vo gweredekaet en o fenndibaboù.",
        "config-email-auth": "Gweredekaat an dilesadur dre bostel",
        "config-email-sender": "Chomlec'h postel respont :",
        "config-email-sender-help": "Merkit ar chomlec'h postel da vezañ implijet da chomlec'h distreiñ ar posteloù a ya er-maez.\nDi e vo kaset ar posteloù distaolet.\nNiverus eo ar servijerioù postel a c'houlenn da nebeutañ un [http://fr.wikipedia.org/wiki/Nom_de_domaine anv domani] reizh.",
        "config-install-user-missing": "N'eus ket eus an implijer \"$1\"",
        "config-install-user-missing-create": "N'eus ket eus an implijer \"$1\".\nMa fell deoc'h krouiñ anezhañ, klikit war ar voest \"krouiñ ur gont\" amañ dindan.",
        "config-install-tables": "Krouiñ taolennoù",
-       "config-install-tables-exist": "<strong>Kemenn :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'eo ket bet graet ar grouidigezh.",
+       "config-install-tables-exist": "<strong>Diwallit :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'int ket bet adkrouet.",
        "config-install-tables-failed": "'''Fazi :''' c'hwitet eo krouidigezh an daolenn gant ar fazi-mañ : $1",
        "config-install-interwiki": "O leuniañ dre ziouer an daolenn etrewiki",
        "config-install-interwiki-list": "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
        "config-install-subscribe-fail": "N'haller ket koumanantiñ da mediawiki-announce : $1",
        "config-install-subscribe-notpossible": "cURL n'eo ket staliet ha ne c'haller ket ober gant <code>allow_url_fopen</code>.",
        "config-install-mainpage": "O krouiñ ar bajenn bennañ gant un endalc'had dre ziouer",
+       "config-install-mainpage-exists": "Bez' ez eus eus ar bajenn bennañ c'hoazh, lezel a-gostez",
        "config-install-extension-tables": "O krouiñ taolennoù evit an astennoù gweredekaet",
        "config-install-mainpage-failed": "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
        "config-download-localsettings": "Pellgargañ <code>LocalSettings.php</code>",
index 583b80c..3bfa8a6 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Asoxor",
                        "Calak",
-                       "Muhammed taha"
+                       "Muhammed taha",
+                       "Lost Whispers"
                ]
        },
        "config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
@@ -44,6 +45,8 @@
        "config-admin-password": "تێپەڕوشە:",
        "config-admin-password-confirm": "دووبارە تێپەڕوشە:",
        "config-admin-email": "ناونیشانی ئیمەیل:",
+       "config-admin-email-help": "ناونیشانی ئیمەیڵەکەت لێرەدا دابنێ بۆئەوەی بتوانیت ئیمەیڵت لە بەکارھێنەرانی ترەوە پێ بگات، تێپەڕ وشە ڕێک بخەیتەوە و ئاگادار بکرێیتەوە لەو گۆڕانکاریانەی کە لەو پەڕانەدا دەکرێن کە چاودێرییان دەکەیت. دەتوانیت ئەم بۆشاییە بە بەتاڵی جێبھێڵیت.",
+       "config-admin-error-bademail": "تۆ ناونیشانی ئیمەیڵێکی ھەڵەت داخڵ کردووە.",
        "config-profile-wiki": "ویکیی کراوە",
        "config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
        "config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
index 5275548..411b2d0 100644 (file)
        "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
        "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و <code>allow_url_fopen</code> در دسترس نیست.",
        "config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیش‌فرض",
+       "config-install-mainpage-exists": "صفحهٔ اصلی موجود است، رها شد",
        "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
        "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
        "config-extension-link": "آیا می‌دانستید که ویکی شما [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''مدیاویکی با موفقیت نصب شد.'''",
-       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]"
+       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربری]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]"
 }
index 5939291..6c99a42 100644 (file)
@@ -20,7 +20,8 @@
                        "Jaakkoh",
                        "Mikahama",
                        "Olimar",
-                       "01miki10"
+                       "01miki10",
+                       "Pyscowicz"
                ]
        },
        "config-desc": "MediaWiki-asennin",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki tukee seuraavia tietokantajärjestelmiä:\n\n$1\n\nJos et näe tietokantajärjestelmää, jota yrität käyttää, listattuna alhaalla, seuraa yläpuolella olevia ohjeita tuen aktivoimiseksi.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] on MediaWikin ensisijainen kohde ja se on myös parhaiten tuettu. MediaWiki voi myös käyttää [{{int:version-db-mariadb-url}} MariaDB]- sekä [{{int:version-db-percona-url}} Percona Server]-järjestelmiä, jotka ovat MySQL-yhteensopivia. ([http://www.php.net/manual/en/mysqli.installation.php Miten käännetään PHP MySQL-tuella])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] on suosittu avoimen lähdekoodin tietokantajärjestelmä vaihtoehtona MySQL:lle. Tuessa saattaa olla pieniä puutteita, eikä sitä suositella käytettäväksi tuotantoympäristössä. ([http://www.php.net/manual/en/pgsql.installation.php Kuinka käännetään PHP PostgreSQL-tuella])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] on suosittu avoimen lähdekoodin tietokantajärjestelmä vaihtoehtona MySQL:lle. ([http://www.php.net/manual/en/pgsql.installation.php Kuinka käännetään PHP PostgreSQL-tuella])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] on kevyt tietokantajärjestelmä, jota tuetaan hyvin. ([http://www.php.net/manual/en/pdo.installation.php Miten käännetään PHP SQLite-tuella], käyttää PDO:ta)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] on kaupallinen yritystietokanta. ([http://www.php.net/manual/en/oci8.installation.php Kuinka käännetään PHP OCI8-tuella])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] on kaupallinen yritystietokanta Windowsille. ([http://www.php.net/manual/en/sqlsrv.installation.php Miten käännetään PHP SQLSRV-tuella])",
        "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.",
        "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.",
        "config-sqlite-dir-unwritable": "Hakemistoon ”$1” kirjoittaminen epäonnistui.\nMuuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja yritä uudelleen.",
+       "config-sqlite-connection-error": "$1.\n\nTarkista tietohakemiston ja tietokannan nimi alla ja yritä uudelleen.",
        "config-sqlite-readonly": "Tiedostoon <code>$1</code> ei voi kirjoittaa.",
        "config-sqlite-cant-create-db": "Tietokantatiedostoa <code>$1</code> ei voitu luoda.",
        "config-sqlite-fts3-downgrade": "PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.",
        "config-mssql-auth": "Varmennuksen tyyppi:",
        "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
        "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
+       "config-mssql-sqlauth": "SQL Server varmennus",
        "config-mssql-windowsauth": "Windows-varmennus",
        "config-site-name": "Wikin nimi",
        "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.",
        "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1",
        "config-install-subscribe-notpossible": "cURL-ohjelmaa ei ole asennettu eikä <code>allow_url_fopen</code> ole saatavilla.",
        "config-install-mainpage": "Luodaan etusivu oletussisällöllä",
+       "config-install-mainpage-exists": "Etusivu on jo olemassa, ohitetaan",
        "config-install-extension-tables": "Luodaan tauluja käyttöönotetuille laajuennuksille",
        "config-install-mainpage-failed": "Etusivun lisääminen ei onnistunut: $1",
        "config-install-done": "<strong>Onnittelut!</strong>\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut <code>LocalSettings.php</code> -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se MediaWikin asennushakemistoon (sama kuin missä on index.php). Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\n<strong>Huom:</strong> Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit <strong>[$2 mennä wikiisi]</strong>.",
        "config-nofile": "Tiedostoa \"$1\" ei löytynyt. Onko se poistettu?",
        "config-extension-link": "Tiesitkö että wiki tukee [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions laajennuksia]?\n\nLaajennuksia voi hakea myös [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category luokittain].",
        "mainpagetext": "<strong>MediaWiki on onnistuneesti asennettu.</strong>",
-       "mainpagedocfooter": "Lisätietoja wiki-ohjelmiston käytöstä on [https://meta.wikimedia.org/wiki/Help:Contents käyttöoppaassa].\n\n=== Aloittaminen ===\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Käännä MediaWikiä kielellesi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Katso, kuinka torjua spämmiä wikissäsi]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
+       "mainpagedocfooter": "Lisätietoja wiki-ohjelmiston käytöstä on [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents käyttöoppaassa].\n\n=== Aloittaminen ===\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Käännä MediaWikiä kielellesi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Katso, kuinka torjua spämmiä wikissäsi]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
 }
index e98988c..161c5db 100644 (file)
@@ -9,7 +9,8 @@
                        "Yona b",
                        "Rotemliss",
                        "Macofe",
-                       "Guycn2"
+                       "Guycn2",
+                       "שמזן"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינך רואה את מסד הנתונים שלך ברשימה, יש לעקוב אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר. מדיה־ויקי עובדת גם עם [{{int:version-db-mariadb-url}} MariaDB] ועם [{{int:version-db-percona-url}} Percona Server], שתואמים ל־MySQL. (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-cache-options": "הגדרות למטמון עצמים (object caching):",
        "config-cache-help": "מטמון עצמים משמש לשיפור המהירות של מדיה־ויקי על־ידי שמירה של נתונים שהשימוש בהם נפוץ במטמון.\nלאתרים בינוניים וגדולים כדאי מאוד להפעיל את זה, וגם אתרים קטנים ייהנו מזה.",
        "config-cache-none": "ללא מטמון (שום יכולת אינה מוּסרת, אבל הביצועים באתרים גדולים ייפגעו)",
-       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC&rlm;, XCache או WinCache)",
+       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC,&rlm; APCu,&rlm; XCache או WinCache)",
        "config-cache-memcached": "להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)",
        "config-memcached-servers": "שרתי Memcached:",
        "config-memcached-help": "רשימת כתובות IP ש־Memcached ישתמש בהן.\nיש לרשום כתובת אחת בכל שורה ולציין את הפִּתְחָה (port), למשל:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
        "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
+       "config-install-mainpage-exists": "העמוד הראשי כבר קיים, לדלג",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "<strong>תוכנת מדיה־ויקי הותקנה בהצלחה.</strong>",
-       "mainpagedocfooter": "היעזרו ב[https://meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
+       "mainpagedocfooter": "היעזרו ב[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index e05b700..98af267 100644 (file)
@@ -5,7 +5,8 @@
                        "Vivek Rai",
                        "Phoenix303",
                        "संजीव कुमार",
-                       "Sahilrathod"
+                       "Sahilrathod",
+                       "Shyamal"
                ]
        },
        "config-desc": "साँचा लिए इंस्टॉलर",
@@ -16,7 +17,9 @@
        "config-localsettings-key": "नवीनीकरण कुंजी",
        "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।",
        "config-your-language": "आपकी भाषा:",
+       "config-your-language-help": "स्थापन के लिए भाषा चुनें",
        "config-wiki-language": "विकी भाषा:",
+       "config-wiki-language-help": "भाषा चुनें जिस  में अधिकतर लेख लिखा जाएगा",
        "config-back": "← वापस",
        "config-continue": "आगे बढ़ें →",
        "config-page-language": "भाषा",
index 1d52273..13e7a6b 100644 (file)
        "config-install-subscribe-fail": "Impossibile subscriber a mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non es installate e <code>allow_url_fopen</code> non es disponibile.",
        "config-install-mainpage": "Crea pagina principal con contento predefinite",
+       "config-install-mainpage-exists": "Le pagina principal jam existe, es omittite",
        "config-install-extension-tables": "Creation de tabellas pro le extensiones activate",
        "config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1",
        "config-install-done": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
index f029d0a..f292ab3 100644 (file)
        "config-nofile": "\"$1\" 파일을 찾을 수 없습니다. 이미 삭제되었나요?",
        "config-extension-link": "당신의 위키가 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?\n\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 분류별 확장 기능]을 찾아보실 수 있습니다.",
        "mainpagetext": "<strong>미디어위키가 설치되었습니다.</strong>",
-       "mainpagedocfooter": "[https://meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.\n\n== 시작하기 ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 설정하기 목록]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 릴리스 메일링 리스트]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 내 언어로 미디어위키 지역화]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 당신의 위키에서 스팸에 대처하는 법을 배우세요]"
+       "mainpagedocfooter": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.\n\n== 시작하기 ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 설정하기 목록]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 릴리스 메일링 리스트]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 내 언어로 미디어위키 지역화]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 당신의 위키에서 스팸에 대처하는 법을 배우세요]"
 }
index 15ccd01..2a270fc 100644 (file)
@@ -11,6 +11,7 @@
        "config-localsettings-upgrade": "Hita ny <code>LocalSettings.php</code>.\nMba hanavao ity fametrahana ity, atsofohy ny sandan'i <code>$wgUpgradeKey</code> amin'ny saha eo ambany.\nHo hitanao eo amin'i <code>LocalSettings.php</code> ilay izy.",
        "config-localsettings-key": "Lakile fanavaozana:",
        "config-localsettings-badkey": "Diso ilay lakile fanavaozana natsofokao.",
+       "config-localsettings-connection-error": "Nisy hadisoana nitranga teo am-pametrahana ny fifandraisana amin'ny banky angona miaraka amin'ny parametatra voalaza ao amin'i <code>LocalSettings.php</code>. Vahao ny olan'ireo parametatra ireo dia avereno fanindroany.\n\n$1",
        "config-session-error": "Hadisoana teo am-panombohana ny fidirana : $1",
        "config-your-language": "Ny fiteninao :",
        "config-your-language-help": "Hifidy ny teny ilaina amin'ny piraosesy fametrahana.",
        "config-env-hhvm": "Misy ato HHVM $1.",
        "config-unicode-using-intl": "Mampiasa ny [http://pecl.php.net/intl itatra PECL intl] ho an'ny fampifenerana Unicode.",
        "config-unicode-pure-php-warning": "<strong>Fampitandremana: </strong>  Ny [http://pecl.php.net/intl itatra PECL intl] dia tsy misy mba hahazakana ny fampifenerana Unicode, ka mitontona amin'ny implementasiona PHP ranoray noho ny tsifisiany.\nRaha hametraka tranonkala be mpamangy ianao dia tokony mamaky ny [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (amin'ny teny anglisy)",
+       "config-db-type": "Karazana banky angona:",
+       "config-db-host": "Anaran'ny lohamilin'ny banky angona:",
+       "config-db-host-help": "Raha lohamila hafa ny lohamilin'ny banky angona, dia atsofohy eto ny anaran'ilay lohamilina na ny adiresy IP-ny.\n\nRaha mampiasa fampiantranoana iombonana ianao dia tokony hanome anao ny anaran-dohamilina izy ao amin'ny toromariny.\n\nRaha mametraka amin'ny lohamilina Windows ianao sady mampiasa MySQL, dia mety tsy mandeha ny anaran-dohamilina \"localhost\". Raha tsy mandeha ilay izy dia \"127.0.0.1\" no atao adiresy IP an-toerana.\n\nRaha mampiasa PostgreSQL ianao, dia avelaho ho fotsy ity saha ity ahafahana mifandray amin'ny alalan'ny socket Unix.",
+       "config-db-host-oracle": "TNS an'ny banky angona:",
        "config-db-username": "Anaram-pikamban'ny banky angona :",
        "config-db-password": "Tenimiafin'ny banky angona :",
        "config-db-prefix": "Tovom-banky angona:",
index f34849b..89f8e55 100644 (file)
        "config-profile-help": "Викијата функционираат најдобро кога имаат што повеќе уредници.\nВо МедијаВики лесно се проверуваат скорешните промени, и лесно се исправа (технички: „враќа“) штетата направена од неупатени или злонамерни корисници.\n\nМногумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е лесно да убедите некого во предностите на вики-концептот.\nЗначи имате избор.\n\n'''{{int:config-profile-wiki}}''' — модел според кој секој може да уредува, дури и без најавување.\nАко имате вики со '''задолжително отворање на сметка''', тогаш добивате повеќе контрола, но ова може даги одврати спонтаните учесници.\n\n'''{{int:config-profile-fishbowl}}''' — може да уредуваат само уредници што имаат добиено дозвола за тоа, но јавноста може да ги гледа страниците, вклучувајќи ја нивната историја.\n'''{{int:config-profile-private}}''' — страниците се видливи и уредливи само за овластени корисници.\n\nПо воспоставката имате на избор и посложени кориснички права и поставки. Погледајте во [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights прирачникот].",
        "config-license": "Авторски права и лиценца:",
        "config-license-none": "Без подножје за лиценца",
-       "config-license-cc-by-sa": "Криејтив комонс НаведиИзвор СподелиПодИстиУслови",
-       "config-license-cc-by": "Криејтив комонс НаведиИзвор",
-       "config-license-cc-by-nc-sa": "Криејтив комонс НаведиИзвор-Некомерцијално-СподелиПодИстиУслови",
+       "config-license-cc-by-sa": "Криејтив комонс Наведи извор-Сподели под исти услови",
+       "config-license-cc-by": "Криејтив комонс Наведи извор",
+       "config-license-cc-by-nc-sa": "Криејтив комонс Наведи извор-Сподели под исти услови",
        "config-license-cc-0": "Криејтив комонс Нула (јавна сопственост)",
        "config-license-gfdl": "ГНУ-ова лиценца за слободна документација 1.3 или понова",
        "config-license-pd": "Јавна сопственост",
        "config-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничникот.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
        "config-instantcommons": "Овозможи Instant Commons",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [https://commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
-       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
+       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде лиценца.\nВнесете го името на лиценцата рачно.",
        "config-cc-again": "Одберете повторно...",
        "config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „proceed“.",
        "config-advanced-settings": "Напредни нагодувања",
index f6b1d23..a499553 100644 (file)
        "config-profile-no-anon": "Account aanmaken verplicht",
        "config-profile-fishbowl": "Alleen voor geautoriseerde bewerkers",
        "config-profile-private": "Privéwiki",
-       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
+       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}''' biedt extra verantwoordelijkheid, maar kan toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerken, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
        "config-license": "Auteursrechten en licentie:",
        "config-license-none": "Geen licentie in de voettekst",
        "config-license-cc-by-sa": "Creative Commons Naamsvermelding-Gelijk delen",
index d0004c4..d712afe 100644 (file)
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozszerzenia]?\n\nMożesz przejrzeć [https://www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix], aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "<strong>Instalacja MediaWiki powiodła się.</strong>",
-       "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents informacjami o działaniu oprogramowania wiki].\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
+       "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznikiem użytkownika] zawierającym informacje o tym jak korzystać z oprogramowania wiki.\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index fd8a263..13944ee 100644 (file)
@@ -20,7 +20,8 @@
                        "Walesson",
                        "Almondega",
                        "Luk3",
-                       "Eduardo Addad de Oliveira"
+                       "Eduardo Addad de Oliveira",
+                       "Warley Felipe C."
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-install-pg-commit": "Enviando alterações",
        "config-install-user": "Criando usuário de banco de dados",
        "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
+       "config-install-user-create-failed": "Criando usuário \"$1\" falhou: $2",
        "config-install-user-missing": "O usuário especificado, \"$1\", não existe.",
        "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
        "config-install-tables": "Criando tabelas",
        "config-install-subscribe-fail": "Não foi possível subscrever o mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalada e <code>allow_url_fopen</code> não está disponível.",
        "config-install-mainpage": "Criando página principal com o conteúdo padrão",
+       "config-install-mainpage-exists": "A página principal já existe, pulando",
        "config-install-extension-tables": "Criando tabelas para extensões habilitadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "<strong>Parabéns!</strong>\nVocê instalou do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
index cc8f993..779a32f 100644 (file)
        "config-env-php": "O PHP $1 está instalado.",
        "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-intl": "A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
-       "config-unicode-pure-php-warning": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
-       "config-unicode-update-warning": "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do 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. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt 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 [http://site.icu-project.org/ projeto ICU].\nDevia [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base 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 precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
-       "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
-       "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
+       "config-outdated-sqlite": "<strong>Aviso:</strong> Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
+       "config-no-fts3": "<strong>Aviso:</strong> O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
-       "config-memory-bad": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
+       "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
-       "config-apcu": "[http://www.php.net/apcu APCu] está instalado",
+       "config-apcu": "[http://www.php.net/apcu APCu] instalado",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
        "config-no-cache-apcu": "<strong>Aviso:</strong> Não foram encontrados o [http://www.php.net/apcu APCu], o [http://xcache.lighttpd.net/ XCache] ou o [http://www.iis.net/download/WinCacheForPhp WinCache].\nA cache de objetos não está ativa.",
-       "config-mod-security": "'''Aviso''': O seu servidor de internet tem o [http://modsecurity.org/ mod_security] ativado. Se este estiver mal configurado, pode causar problemas ao MediaWiki ou a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nConsulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
+       "config-mod-security": "<strong>Aviso:</strong> O seu servidor de Internet tem o [http://modsecurity.org/ mod_security]/mod_security2 ativado. Muitas das suas configurações normais podem causar problemas ao MediaWiki e a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nSe possível, isto deve ser desativado. Se não, consulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
        "config-diff3-bad": "O GNU diff3 não foi encontrado.",
        "config-git": "Foi encontrado o software de controlo de versões Git: <code>$1</code>.",
        "config-git-bad": "Não foi encontrado o software de controlo de versões Git.",
        "config-gd": "Foi encontrada a biblioteca gráfica GD.\nSe possibilitar uploads, a miniaturização de imagens será ativada.",
        "config-no-scaling": "Não foi encontrada a biblioteca gráfica GD nem o ImageMagick.\nA miniaturização de imagens será desativada.",
        "config-no-uri": "<strong>Erro:</strong> Não foi possível determinar o URI atual.\nA instalação foi abortada.",
-       "config-no-cli-uri": "'''Aviso''':  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
+       "config-no-cli-uri": "<strong>Aviso:</strong>  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
        "config-using-server": "Será usado o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Será usado o URL do servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para carregamentos <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
-       "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
+       "config-uploads-not-safe": "<strong>Aviso:</strong> O diretório por omissão para carregamentos, <code>$1</code>, está vulnerável à execução arbitrária de listas de comandos (scripts).\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
+       "config-no-cli-uploads-check": "<strong>Aviso:</strong> O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de listas arbitrárias de comandos durante a instalação por CLI (\"Command-line Interface\").",
+       "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da Internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
        "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
        "config-db-type": "Tipo da base de dados:",
        "config-db-host": "Servidor da base de dados:",
        "config-db-port": "Porta da base de dados:",
        "config-db-schema": "Esquema ''(schema)'' do MediaWiki",
        "config-db-schema-help": "Normalmente, este esquema estará correto.\nAltere-o só se souber que precisa de o fazer.",
-       "config-pg-test-error": "Não foi possível criar uma ligação à base de dados '''$1''': $2",
+       "config-pg-test-error": "Não foi possível criar uma ligação à base de dados <strong>$1</strong>: $2",
        "config-sqlite-dir": "Diretório de dados do SQLite:",
-       "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de Internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório '''não''' deve poder ser acedido diretamente da Internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-passe encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
+       "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de Internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório <strong>não</strong> deve poder ser acedido diretamente da Internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-passe encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
        "config-oracle-def-ts": "Tablespace padrão:",
        "config-oracle-temp-ts": "Tablespace temporário:",
        "config-type-mysql": "MySQL (ou compatível)",
        "config-skins-missing": "Não foi encontrado nenhum tema; o MediaWiki usará um tema de recurso até instalar temas adequados.",
        "config-skins-must-enable-some": "Deve escolher pelo menos um tema para ativar.",
        "config-skins-must-enable-default": "O tema escolhido como padrão deve ser ativado.",
-       "config-install-alreadydone": "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.\nPasse para a próxima página, por favor.",
+       "config-install-alreadydone": "<strong>Aviso:</strong> Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.\nPasse para a próxima página, por favor.",
        "config-install-begin": "Ao clicar \"{{int:config-continue}}\", vai iniciar a instalação do MediaWiki.\nSe quiser fazer mais alterações, clique \"{{int:config-back}}\".",
        "config-install-step-done": "terminado",
        "config-install-step-failed": "falhou",
        "config-install-user-missing": "O utilizador especificado, \"$1\", não existe.",
        "config-install-user-missing-create": "O utilizador especificado, \"$1\", não existe.\nMarque a caixa de seleção \"criar conta\" abaixo se pretende criá-la, por favor.",
        "config-install-tables": "A criar as tabelas",
-       "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
-       "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de interwikis",
-       "config-install-interwiki-list": "Não foi possível encontrar o ficheiro <code>interwiki.list</code>.",
-       "config-install-interwiki-exists": "'''Aviso''': A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
+       "config-install-tables-exist": "<strong>Aviso:</strong> As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
+       "config-install-tables-failed": "<strong>Erro:</strong> A criação das tabelas falhou com o seguinte erro: $1",
+       "config-install-interwiki": "A preencher a tabela padrão de links interwikis",
+       "config-install-interwiki-list": "Não foi possível ler o ficheiro <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>Aviso:</strong> A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-install-keys": "A gerar as chaves secretas",
-       "config-insecure-keys": "'''Aviso:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
+       "config-insecure-keys": "<strong>Aviso:</strong> {{PLURAL:$2|Uma chave segura|Chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
        "config-install-updates": "Evitar executar atualizações desnecessárias",
        "config-install-updates-failed": "<strong>Erro:</strong> A inserção de chaves de atualização nas tabelas falhou com o seguinte erro: $1",
        "config-install-sysop": "A criar a conta de administrador",
        "config-install-subscribe-fail": "Não foi possível subscrever a lista mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalado e <code>allow_url_fopen</code> não está disponível.",
-       "config-install-mainpage": "A criar a página principal com o conteúdo padrão.",
+       "config-install-mainpage": "A criar a página principal com o conteúdo padrão",
+       "config-install-mainpage-exists": "A página principal já existe; a saltar este passo",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não o descarregar agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
index 41884c6..02f6335 100644 (file)
@@ -87,5 +87,5 @@
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да проширите",
        "mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
-       "mainpagedocfooter": "Погледајте [https://meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
+       "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
 }
index 7644f41..7873035 100644 (file)
        "config-install-subscribe-fail": "Не можливо підписатись на mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL не встановлено і опція <code>allow_url_fopen</code> не доступна.",
        "config-install-mainpage": "Створення головної сторінки із вмістом за замовчуванням",
+       "config-install-mainpage-exists": "Головна сторінка вже існує, пропускаємо",
        "config-install-extension-tables": "Створення таблиць для увімкнених розширень",
        "config-install-mainpage-failed": "Не вдається вставити головну сторінку: $1",
        "config-install-done": "<strong>Вітаємо!</strong>\nВи успішно встановили MediaWiki.\n\nІнсталятор згенерував файл <code>LocalSettings.php</code>, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\n<strong>Примітка</strong>: Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете <strong>[$2 увійти у свою вікі]</strong>.",
index 0820ff5..0a7f8cd 100644 (file)
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki hỗ trợ các hệ thống cơ sở dữ liệu sau đây:\n\n$1\n\nNếu bạn không thấy hệ thống cơ sở dữ liệu mà bạn đang muốn sử dụng được liệt kê dưới đây, thì hãy theo chỉ dẫn được liên kết ở trên để kích hoạt tính năng hỗ trợ.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] là mục tiêu chính cho MediaWiki và được hỗ trợ tốt nhất. MediaWiki cũng làm việc với [{{int:version-db-mariadb-url}} MariaDB] và [{{int:version-db-percona-url}} Percona Server], là những cơ sở dữ liệu tương thích với MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] là một hệ thống cơ sở dữ liệu mã nguồn mở phổ biến như là một thay thế cho MySQL. Có thể có một số lỗi nhỏ lâu đời, và nó không được khuyến cáo sử dụng trong môi trường sản xuất. ([http://www.php.net/manual/en/pgsql.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] là một hệ thống cơ sở dữ liệu mã nguồn mở phổ biến như là một thay thế cho MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] là một hệ thống cơ sở dữ liệu dung lượng nhẹ được hỗ trợ rất tốt. ([http://www.php.net/manual/en/pdo.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của SQLite], sử dụng PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] là một cơ sở dữ liệu doanh nghiệp thương mại. ([http://www.php.net/manual/en/oci8.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] là một cơ sở dữ liệu doanh nghiệp thương mại cho Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Làm thế nào để biên dịch PHP với sự hỗ trợ của SQLSRV])",
        "config-install-subscribe-fail": "Không thể theo dõi mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL không được cài đặt và <code>allow_url_fopen</code> không có sẵn.",
        "config-install-mainpage": "Đang tạo trang đầu với nội dung mặc định",
+       "config-install-mainpage-exists": "Bỏ qua trang chính đã tồn tại",
        "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
        "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
        "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
        "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions mở rộng]?\n\nBạn có thể truy cập [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại] hoặc [https://www.mediawiki.org/wiki/Extension_Matrix Ma trận Mở rộng] để xem danh sách đầy đủ các phần mở rộng.",
        "mainpagetext": "'''MediaWiki đã được cài đặt.'''",
-       "mainpagedocfooter": "Xin đọc [https://meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]"
+       "mainpagedocfooter": "Xin đọc [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]"
 }
index 167d6cc..faf5194 100644 (file)
@@ -17,7 +17,8 @@
                        "Macofe",
                        "Reke",
                        "Suchichi02",
-                       "Winstonyin"
+                       "Winstonyin",
+                       "Wehwei"
                ]
        },
        "config-desc": "MediaWiki 安裝程式",
        "config-install-subscribe-fail": "無法訂閱 mediawiki-announce:$1",
        "config-install-subscribe-notpossible": "未安裝 cURL,因此無法使用 <code>allow_url_fopen</code> 設定項目。",
        "config-install-mainpage": "正在使用預設的內容建立首頁",
+       "config-install-mainpage-exists": "首頁已存在,略過中",
        "config-install-extension-tables": "正在建立已啟動的擴充套件的資料表",
        "config-install-mainpage-failed": "無法插入首頁: $1",
        "config-install-done": "<strong>恭喜!</strong>\n您已經成功安裝MediaWiki。\n\n安裝程式已自動產生<code>LocalSettings.php</code>檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的Wiki的根目錄(index.php所在的目錄)中,下載應已自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>如果您現在不下載此檔案,稍後結束安裝程式之後將無法再下載設定檔。\n\n當您完成本步驟後,您可以<strong>[$2 進入您的Wiki]</strong>。",
index 0a8ae7f..2f58947 100644 (file)
@@ -346,7 +346,7 @@ class JobQueueDB extends JobQueue {
                                        continue; // try the other direction
                                }
                        } else { // table *may* have >= MAX_OFFSET rows
-                               // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
+                               // T44614: "ORDER BY job_random" with a job_random inequality causes high CPU
                                // in MySQL if there are many rows for some reason. This uses a small OFFSET
                                // instead of job_random for reducing excess claim retries.
                                $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
index 25a271c..c2c9d66 100644 (file)
@@ -793,9 +793,9 @@ LUA;
        private function getGlobalKey( $name ) {
                $parts = [ 'global', 'jobqueue', $name ];
                foreach ( $parts as $part ) {
-                   if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
-                       throw new InvalidArgumentException( "Key part characters are out of range." );
-                   }
+                       if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
+                               throw new InvalidArgumentException( "Key part characters are out of range." );
+                       }
                }
 
                return implode( ':', $parts );
index cacccbe..baff288 100644 (file)
@@ -27,6 +27,7 @@ use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * Job queue runner utility methods
index a52ff06..3a0063c 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * Job to add recent change entries mentioning category membership changes
index 3cd3448..74c446f 100644 (file)
@@ -137,7 +137,7 @@ class DoubleRedirectJob extends Job {
                        wfDebug( __METHOD__ . " : skipping, already good\n" );
                }
 
-               // Preserve fragment (bug 14904)
+               // Preserve fragment (T16904)
                $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
                        $currentDest->getFragment(), $newTitle->getInterwiki() );
 
@@ -199,7 +199,7 @@ class DoubleRedirectJob extends Job {
                        $seenTitles[$titleText] = true;
 
                        if ( $title->isExternal() ) {
-                               // If the target is interwiki, we have to break early (bug 40352).
+                               // If the target is interwiki, we have to break early (T42352).
                                // Otherwise it will look up a row in the local page table
                                // with the namespace/page of the interwiki target which can cause
                                // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
index f09ba57..2d816f9 100644 (file)
@@ -22,6 +22,8 @@
  * @ingroup Cache
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Job to purge the cache for all pages that link to or use another page or file
  *
@@ -113,7 +115,7 @@ class HTMLCacheUpdateJob extends Job {
                $touchTimestamp = wfTimestampNow();
 
                $dbw = wfGetDB( DB_MASTER );
-               $factory = wfGetLBFactory();
+               $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
                // Update page_touched (skipping pages already touched since the root job).
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
index 37e80c2..e89812b 100644 (file)
@@ -128,7 +128,7 @@ class PublishStashedFileJob extends Job {
                        );
                        $this->setLastError( get_class( $e ) . ": " . $e->getMessage() );
                        // To prevent potential database referential integrity issues.
-                       // See bug 32551.
+                       // See T34551.
                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
                        return false;
index 0e90674..5c73308 100644 (file)
@@ -128,8 +128,10 @@ class RecentChangesUpdateJob extends Job {
                                $dbw->setSessionOptions( [ 'connTimeout' => 900 ] );
 
                                $lockKey = wfWikiID() . '-activeusers';
-                               if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
-                                       return; // exclusive update (avoids duplicate entries)
+                               if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) || !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+                                       // Exclusive update (avoids duplicate entries)… it's usually fine to just drop out here,
+                                       // if the Job is already running.
+                                       return;
                                }
 
                                $nowUnix = time();
@@ -168,15 +170,6 @@ class RecentChangesUpdateJob extends Job {
                                        $names[$row->rc_user_text] = $row->lastedittime;
                                }
 
-                               // Rotate out users that have not edited in too long (according to old data set)
-                               $dbw->delete( 'querycachetwo',
-                                       [
-                                               'qcc_type' => 'activeusers',
-                                               'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
-                                       ],
-                                       __METHOD__
-                               );
-
                                // Find which of the recently active users are already accounted for
                                if ( count( $names ) ) {
                                        $res = $dbw->select( 'querycachetwo',
@@ -184,9 +177,13 @@ class RecentChangesUpdateJob extends Job {
                                                [
                                                        'qcc_type' => 'activeusers',
                                                        'qcc_namespace' => NS_USER,
-                                                       'qcc_title' => array_keys( $names ) ],
+                                                       'qcc_title' => array_keys( $names ),
+                                                       'qcc_value >= ' . $dbw->addQuotes( $nowUnix - $days * 86400 ), // TS_UNIX
+                                                ],
                                                __METHOD__
                                        );
+                                       // Note: In order for this to be actually consistent, we would need
+                                       // to update these rows with the new lastedittime.
                                        foreach ( $res as $row ) {
                                                unset( $names[$row->user_name] );
                                        }
@@ -224,6 +221,16 @@ class RecentChangesUpdateJob extends Job {
                                );
 
                                $dbw->unlock( $lockKey, __METHOD__ );
+
+                               // Rotate out users that have not edited in too long (according to old data set)
+                               $dbw->delete( 'querycachetwo',
+                                       [
+                                               'qcc_type' => 'activeusers',
+                                               'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
+                                       ],
+                                       __METHOD__
+                               );
+
                        },
                        __METHOD__
                );
index 651a332..f9284a5 100644 (file)
@@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices;
  *   - a) Recursive jobs to update links for backlink pages for a given title.
  *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to update links for a set of pages (the job title is ignored).
- *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *        These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *   - c) Jobs to update links for a single page (the job title)
  *        These jobs need no extra fields set.
  *
index 7f50055..1c12a1c 100644 (file)
@@ -33,7 +33,7 @@
  * For example, if templates A and B are edited (at the same time) the queue will have:
  *     (A base, B base)
  * When these jobs run, the queue will have per-title and remnant partition jobs:
- *        (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ *     (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
  *
  * This works best when the queue is FIFO, for several reasons:
  *   - a) Since the remnant jobs are enqueued after the leaf jobs, the slower leaf jobs have to
@@ -133,7 +133,7 @@ class BacklinkJobUtils {
                                        'table'         => $params['table'],
                                        'range'         => [
                                                'start'     => $ranges[1][0],
-                                               'end'       => $ranges[count( $ranges ) - 1][1],
+                                               'end'       => $ranges[count( $ranges ) - 1][1],
                                                'batchSize' => $realBSize,
                                                'subranges' => array_slice( $ranges, 1 )
                                        ],
index bc99672..b1cece8 100644 (file)
@@ -8,7 +8,7 @@
  * not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *             http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software distributed
  * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
@@ -237,7 +237,7 @@ class CSSMin {
                //       * Otherwise remap the URL to work in generated stylesheets
 
                // Guard against trailing slashes, because "some/remote/../foo.png"
-               // resolves to "some/remote/foo.png" on (some?) clients (bug 27052).
+               // resolves to "some/remote/foo.png" on (some?) clients (T29052).
                if ( substr( $remote, -1 ) == '/' ) {
                        $remote = substr( $remote, 0, -1 );
                }
index 4c86757..6b3e4a7 100644 (file)
@@ -197,11 +197,11 @@ class CryptHKDF {
         * From http://eprint.iacr.org/2010/264.pdf:
         *
         * The scheme HKDF is specifed as:
-        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        *   HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
         * where the values K(i) are defined as follows:
-        *      PRK = HMAC(XTS, SKM)
-        *      K(1) = HMAC(PRK, CTXinfo || 0);
-        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        *   PRK = HMAC(XTS, SKM)
+        *   K(1) = HMAC(PRK, CTXinfo || 0);
+        *   K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
         * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
         * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
         * Note that the length of the HMAC output is the same as its key length and therefore
index 72fc333..27f8728 100644 (file)
@@ -101,6 +101,7 @@ class HttpStatus {
                        return false;
                }
 
+               MediaWiki\HeaderCallback::warnIfHeadersSent();
                if ( $version === null ) {
                        $version = isset( $_SERVER['SERVER_PROTOCOL'] ) &&
                                $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ?
index 21203a4..a6aa0a3 100644 (file)
@@ -675,7 +675,7 @@ class IP {
         * @return string|null Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
-               // remove zone info (bug 35738)
+               // remove zone info (T37738)
                $addr = preg_replace( '/\%.*/', '', $addr );
 
                if ( self::isValid( $addr ) ) {
index db085da..e860ec4 100644 (file)
@@ -85,7 +85,7 @@ class StatusValue {
         * defined as:
         * [
         *     0 => object(StatusValue) # the StatusValue with error messages, only
-        *         1 => object(StatusValue) # The StatusValue with warning messages, only
+        *     1 => object(StatusValue) # The StatusValue with warning messages, only
         * ]
         *
         * @return StatusValue[]
@@ -154,7 +154,7 @@ class StatusValue {
        }
 
        /**
-        * Change operation resuklt
+        * Change operation result
         *
         * @param bool $ok Whether the operation completed
         * @param mixed $value
index 8afdce4..4f0805b 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Class for a file system (FS) based file backend.
index a7ceab2..5179477 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Base class for all backends using particular storage medium.
index 800fdfa..a7d064b 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Functions related to the output of file content
index d40e896..c50dfd7 100644 (file)
@@ -1089,7 +1089,7 @@ class SwiftFileBackend extends FileBackendStore {
                        // good
                } elseif ( $rcode === 404 ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
-                       // Per bug 41113, nasty things can happen if bad cache entries get
+                       // Per T43113, nasty things can happen if bad cache entries get
                        // stuck in cache. It's also possible that this error can come up
                        // with simple race conditions. Clear out the stat cache to be safe.
                        $this->clearCache( [ $params['src'] ] );
index 5edd889..2468f38 100644 (file)
@@ -95,9 +95,9 @@ application/vnd.ms-powerpoint [OFFICE]
 application/x-director         [OFFICE]
 text/rtf                       [OFFICE]
 
-application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
+application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
 application/vnd.openxmlformats-officedocument.wordprocessingml.template                [OFFICE]
-application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
+application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
 application/vnd.ms-word.template.macroEnabled.12                               [OFFICE]
 application/vnd.openxmlformats-officedocument.presentationml.template          [OFFICE]
 application/vnd.openxmlformats-officedocument.presentationml.slideshow         [OFFICE]
index ae91be5..730eed1 100644 (file)
@@ -63,9 +63,9 @@ class RESTBagOStuff extends BagOStuff {
        protected function doGet( $key, $flags = 0 ) {
                $req = [
                        'method' => 'GET',
-                   'url' => $this->url . rawurlencode( $key ),
-
+                       'url' => $this->url . rawurlencode( $key ),
                ];
+
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
                if ( $rcode === 200 ) {
                        if ( is_string( $rbody ) ) {
index d852f82..583ec37 100644 (file)
@@ -321,7 +321,7 @@ class RedisBagOStuff extends BagOStuff {
         */
        protected function serialize( $data ) {
                // Serialize anything but integers so INCR/DECR work
-               // Do not store integer-like strings as integers to avoid type confusion (bug 60563)
+               // Do not store integer-like strings as integers to avoid type confusion (T62563)
                return is_int( $data ) ? $data : serialize( $data );
        }
 
index 75c79a9..f0a439a 100644 (file)
@@ -44,15 +44,20 @@ use Psr\Log\NullLogger;
  *
  * The simplest purge method is delete().
  *
- * There are two supported ways to handle broadcasted operations:
+ * There are three supported ways to handle broadcasted operations:
  *   - a) Configure the 'purge' EventRelayer to point to a valid PubSub endpoint
- *        that has subscribed listeners on the cache servers applying the cache updates.
+ *         that has subscribed listeners on the cache servers applying the cache updates.
  *   - b) Ignore the 'purge' EventRelayer configuration (default is NullEventRelayer)
- *        and set up mcrouter as the underlying cache backend, using one of the memcached
- *        BagOStuff classes as 'cache'. Use OperationSelectorRoute in the mcrouter settings
- *        to configure 'set' and 'delete' operations to go to all DCs via AllAsyncRoute and
- *        configure other operations to go to the local DC via PoolRoute (for reference,
- *        see https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles).
+ *         and set up mcrouter as the underlying cache backend, using one of the memcached
+ *         BagOStuff classes as 'cache'. Use OperationSelectorRoute in the mcrouter settings
+ *         to configure 'set' and 'delete' operations to go to all DCs via AllAsyncRoute and
+ *         configure other operations to go to the local DC via PoolRoute (for reference,
+ *         see https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles).
+ *   - c) Ignore the 'purge' EventRelayer configuration (default is NullEventRelayer)
+ *         and set up dynomite as cache middleware between the web servers and either
+ *         memcached or redis. This will also broadcast all key setting operations, not just purges,
+ *         which can be useful for cache warming. Writes are eventually consistent via the
+ *         Dynamo replication model (see https://github.com/Netflix/dynomite).
  *
  * Broadcasted operations like delete() and touchCheckKey() are done asynchronously
  * in all datacenters this way, though the local one should likely be near immediate.
index 62e4536..956a3a9 100644 (file)
@@ -23,6 +23,7 @@
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
+use Wikimedia\ScopedCallback;
 
 /**
  * Class for scanning through chronological, log-structured data or change logs
index d84c959..98f44d1 100644 (file)
@@ -41,7 +41,7 @@ class WinCacheBagOStuff extends BagOStuff {
                $result = wincache_ucache_set( $key, serialize( $value ), $expire );
 
                /* wincache_ucache_set returns an empty array on success if $value
-                  was an array, bool otherwise */
+                * was an array, bool otherwise */
                return ( is_array( $result ) && $result === [] ) || $result;
        }
 
index 88af1db..8b1aabe 100644 (file)
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
 use Wikimedia\WaitConditionLoop;
+use BagOStuff;
 
 /**
  * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
@@ -70,9 +75,9 @@ class ChronologyProtector implements LoggerAwareInterface {
        public function __construct( BagOStuff $store, array $client, $posTime = null ) {
                $this->store = $store;
                $this->clientId = md5( $client['ip'] . "\n" . $client['agent'] );
-               $this->key = $store->makeGlobalKey( __CLASS__, $this->clientId );
+               $this->key = $store->makeGlobalKey( __CLASS__, $this->clientId, 'v1' );
                $this->waitForPosTime = $posTime;
-               $this->logger = new \Psr\Log\NullLogger();
+               $this->logger = new NullLogger();
        }
 
        public function setLogger( LoggerInterface $logger ) {
@@ -114,7 +119,10 @@ class ChronologyProtector implements LoggerAwareInterface {
                $this->initPositions();
 
                $masterName = $lb->getServerName( $lb->getWriterIndex() );
-               if ( !empty( $this->startupPositions[$masterName] ) ) {
+               if (
+                       isset( $this->startupPositions[$masterName] ) &&
+                       $this->startupPositions[$masterName] instanceof DBMasterPos
+               ) {
                        $pos = $this->startupPositions[$masterName];
                        $this->logger->info( __METHOD__ . ": LB for '$masterName' set to pos $pos\n" );
                        $lb->waitFor( $pos );
@@ -293,8 +301,9 @@ class ChronologyProtector implements LoggerAwareInterface {
 
                $min = null;
                foreach ( $data['positions'] as $pos ) {
-                       /** @var DBMasterPos $pos */
-                       $min = $min ? min( $pos->asOfTime(), $min ) : $pos->asOfTime();
+                       if ( $pos instanceof DBMasterPos ) {
+                               $min = $min ? min( $pos->asOfTime(), $min ) : $pos->asOfTime();
+                       }
                }
 
                return $min;
@@ -313,8 +322,10 @@ class ChronologyProtector implements LoggerAwareInterface {
                        $curPositions = $curValue['positions'];
                        // Use the newest positions for each DB master
                        foreach ( $shutdownPositions as $db => $pos ) {
-                               if ( !isset( $curPositions[$db] )
-                                       || $pos->asOfTime() > $curPositions[$db]->asOfTime()
+                               if (
+                                       !isset( $curPositions[$db] ) ||
+                                       !( $curPositions[$db] instanceof DBMasterPos ) ||
+                                       $pos->asOfTime() > $curPositions[$db]->asOfTime()
                                ) {
                                        $curPositions[$db] = $pos;
                                }
index bf5e299..5d3534f 100644 (file)
  * @author Aaron Schulz
  */
 
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\NullLogger;
+use RuntimeException;
 
 /**
  * Helper class that detects high-contention DB queries via profiling calls
index 4f72f77..fc00965 100644 (file)
@@ -6,7 +6,6 @@ use Database;
 use DBConnRef;
 use IDatabase;
 use InvalidArgumentException;
-use LoadBalancer;
 
 /**
  * Database connection manager.
index b268b9f..fc3ebe0 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\ILoadBalancer;
+use Wikimedia\Rdbms\DBMasterPos;
+
 /**
  * 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
index 69cf1ac..c5afe1e 100644 (file)
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\LikeMatch;
+use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Relational database abstraction object
@@ -841,7 +848,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                // Add trace comment to the begin of the sql string, right after the operator.
-               // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
+               // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (T44598)
                $commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 );
 
                # Start implicit transactions that wrap the request if DBO_TRX is enabled
@@ -1020,8 +1027,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        private function handleSessionLoss() {
                $this->mTrxLevel = 0;
-               $this->mTrxIdleCallbacks = []; // bug 65263
-               $this->mTrxPreCommitCallbacks = []; // bug 65263
+               $this->mTrxIdleCallbacks = []; // T67263
+               $this->mTrxPreCommitCallbacks = []; // T67263
                $this->mSessionTempTables = [];
                $this->mNamedLocksHeld = [];
                try {
@@ -1136,12 +1143,6 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               // if (isset($options['LIMIT'])) {
-               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
-               //              isset($options['OFFSET']) ? $options['OFFSET']
-               //              : false);
-               // }
-
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
@@ -2313,7 +2314,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $selectOptions );
 
                if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ &$this, 'tableName' ], $srcTable ) );
+                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
                }
@@ -3462,4 +3463,4 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 }
 
-class_alias( 'Database', 'DatabaseBase' );
+class_alias( Database::class, 'DatabaseBase' );
index a3ae6f1..ef6600b 100644 (file)
@@ -18,6 +18,9 @@
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
 
 /**
  * Class to handle database/prefix specification for IDatabase domains
diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php
new file mode 100644 (file)
index 0000000..75ddc9d
--- /dev/null
@@ -0,0 +1,1362 @@
+<?php
+/**
+ * This is the MS SQL Server Native database abstraction layer.
+ *
+ * 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 Database
+ * @author Joel Penner <a-joelpe at microsoft dot com>
+ * @author Chris Pucci <a-cpucci at microsoft dot com>
+ * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
+ * @author Ryan Schmidt <skizzerz at gmail dot com>
+ */
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\MssqlBlob;
+use Wikimedia\Rdbms\MssqlField;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\MssqlResultWrapper;
+
+/**
+ * @ingroup Database
+ */
+class DatabaseMssql extends Database {
+       protected $mPort;
+       protected $mUseWindowsAuth = false;
+
+       protected $mInsertId = null;
+       protected $mLastResult = null;
+       protected $mAffectedRows = null;
+       protected $mSubqueryId = 0;
+       protected $mScrollableCursor = true;
+       protected $mPrepareStatements = true;
+       protected $mBinaryColumnCache = null;
+       protected $mBitColumnCache = null;
+       protected $mIgnoreDupKeyErrors = false;
+       protected $mIgnoreErrors = [];
+
+       public function implicitGroupby() {
+               return false;
+       }
+
+       public function implicitOrderby() {
+               return false;
+       }
+
+       public function unionSupportsOrderAndLimit() {
+               return false;
+       }
+
+       public function __construct( array $params ) {
+               $this->mPort = $params['port'];
+               $this->mUseWindowsAuth = $params['UseWindowsAuth'];
+
+               parent::__construct( $params );
+       }
+
+       /**
+        * Usually aborts on failure
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
+        * @throws DBConnectionError
+        * @return bool|resource|null
+        */
+       public function open( $server, $user, $password, $dbName ) {
+               # Test for driver support, to avoid suppressed fatal error
+               if ( !function_exists( 'sqlsrv_connect' ) ) {
+                       throw new DBConnectionError(
+                               $this,
+                               "Microsoft SQL Server Native (sqlsrv) functions missing.
+                               You can download the driver from: http://go.microsoft.com/fwlink/?LinkId=123470\n"
+                       );
+               }
+
+               # e.g. the class is being loaded
+               if ( !strlen( $user ) ) {
+                       return null;
+               }
+
+               $this->close();
+               $this->mServer = $server;
+               $this->mUser = $user;
+               $this->mPassword = $password;
+               $this->mDBname = $dbName;
+
+               $connectionInfo = [];
+
+               if ( $dbName ) {
+                       $connectionInfo['Database'] = $dbName;
+               }
+
+               // Decide which auth scenerio to use
+               // if we are using Windows auth, then don't add credentials to $connectionInfo
+               if ( !$this->mUseWindowsAuth ) {
+                       $connectionInfo['UID'] = $user;
+                       $connectionInfo['PWD'] = $password;
+               }
+
+               MediaWiki\suppressWarnings();
+               $this->mConn = sqlsrv_connect( $server, $connectionInfo );
+               MediaWiki\restoreWarnings();
+
+               if ( $this->mConn === false ) {
+                       throw new DBConnectionError( $this, $this->lastError() );
+               }
+
+               $this->mOpened = true;
+
+               return $this->mConn;
+       }
+
+       /**
+        * Closes a database connection, if it is open
+        * Returns success, true if already closed
+        * @return bool
+        */
+       protected function closeConnection() {
+               return sqlsrv_close( $this->mConn );
+       }
+
+       /**
+        * @param bool|MssqlResultWrapper|resource $result
+        * @return bool|MssqlResultWrapper
+        */
+       protected function resultObject( $result ) {
+               if ( !$result ) {
+                       return false;
+               } elseif ( $result instanceof MssqlResultWrapper ) {
+                       return $result;
+               } elseif ( $result === true ) {
+                       // Successful write query
+                       return $result;
+               } else {
+                       return new MssqlResultWrapper( $this, $result );
+               }
+       }
+
+       /**
+        * @param string $sql
+        * @return bool|MssqlResultWrapper|resource
+        * @throws DBUnexpectedError
+        */
+       protected function doQuery( $sql ) {
+               // several extensions seem to think that all databases support limits
+               // via LIMIT N after the WHERE clause, but  MSSQL uses SELECT TOP N,
+               // so to catch any of those extensions we'll do a quick check for a
+               // LIMIT clause and pass $sql through $this->LimitToTopN() which parses
+               // the LIMIT clause and passes the result to $this->limitResult();
+               if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
+                       // massage LIMIT -> TopN
+                       $sql = $this->LimitToTopN( $sql );
+               }
+
+               // MSSQL doesn't have EXTRACT(epoch FROM XXX)
+               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+                       // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
+                       $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
+               }
+
+               // perform query
+
+               // SQLSRV_CURSOR_STATIC is slower than SQLSRV_CURSOR_CLIENT_BUFFERED (one of the two is
+               // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED
+               // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty
+               // strings make php throw a fatal error "Severe error translating Unicode"
+               if ( $this->mScrollableCursor ) {
+                       $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ];
+               } else {
+                       $scrollArr = [];
+               }
+
+               if ( $this->mPrepareStatements ) {
+                       // we do prepare + execute so we can get its field metadata for later usage if desired
+                       $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr );
+                       $success = sqlsrv_execute( $stmt );
+               } else {
+                       $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr );
+                       $success = (bool)$stmt;
+               }
+
+               // Make a copy to ensure what we add below does not get reflected in future queries
+               $ignoreErrors = $this->mIgnoreErrors;
+
+               if ( $this->mIgnoreDupKeyErrors ) {
+                       // ignore duplicate key errors
+                       // this emulates INSERT IGNORE in MySQL
+                       $ignoreErrors[] = '2601'; // duplicate key error caused by unique index
+                       $ignoreErrors[] = '2627'; // duplicate key error caused by primary key
+                       $ignoreErrors[] = '3621'; // generic "the statement has been terminated" error
+               }
+
+               if ( $success === false ) {
+                       $errors = sqlsrv_errors();
+                       $success = true;
+
+                       foreach ( $errors as $err ) {
+                               if ( !in_array( $err['code'], $ignoreErrors ) ) {
+                                       $success = false;
+                                       break;
+                               }
+                       }
+
+                       if ( $success === false ) {
+                               return false;
+                       }
+               }
+               // remember number of rows affected
+               $this->mAffectedRows = sqlsrv_rows_affected( $stmt );
+
+               return $stmt;
+       }
+
+       public function freeResult( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               sqlsrv_free_stmt( $res );
+       }
+
+       /**
+        * @param MssqlResultWrapper $res
+        * @return stdClass
+        */
+       public function fetchObject( $res ) {
+               // $res is expected to be an instance of MssqlResultWrapper here
+               return $res->fetchObject();
+       }
+
+       /**
+        * @param MssqlResultWrapper $res
+        * @return array
+        */
+       public function fetchRow( $res ) {
+               return $res->fetchRow();
+       }
+
+       /**
+        * @param mixed $res
+        * @return int
+        */
+       public function numRows( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               $ret = sqlsrv_num_rows( $res );
+
+               if ( $ret === false ) {
+                       // we cannot get an amount of rows from this cursor type
+                       // has_rows returns bool true/false if the result has rows
+                       $ret = (int)sqlsrv_has_rows( $res );
+               }
+
+               return $ret;
+       }
+
+       /**
+        * @param mixed $res
+        * @return int
+        */
+       public function numFields( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               return sqlsrv_num_fields( $res );
+       }
+
+       /**
+        * @param mixed $res
+        * @param int $n
+        * @return int
+        */
+       public function fieldName( $res, $n ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+
+               return sqlsrv_field_metadata( $res )[$n]['Name'];
+       }
+
+       /**
+        * This must be called after nextSequenceVal
+        * @return int|null
+        */
+       public function insertId() {
+               return $this->mInsertId;
+       }
+
+       /**
+        * @param MssqlResultWrapper $res
+        * @param int $row
+        * @return bool
+        */
+       public function dataSeek( $res, $row ) {
+               return $res->seek( $row );
+       }
+
+       /**
+        * @return string
+        */
+       public function lastError() {
+               $strRet = '';
+               $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
+               if ( $retErrors != null ) {
+                       foreach ( $retErrors as $arrError ) {
+                               $strRet .= $this->formatError( $arrError ) . "\n";
+                       }
+               } else {
+                       $strRet = "No errors found";
+               }
+
+               return $strRet;
+       }
+
+       /**
+        * @param array $err
+        * @return string
+        */
+       private function formatError( $err ) {
+               return '[SQLSTATE ' .
+                       $err['SQLSTATE'] . '][Error Code ' . $err['code'] . ']' . $err['message'];
+       }
+
+       /**
+        * @return string|int
+        */
+       public function lastErrno() {
+               $err = sqlsrv_errors( SQLSRV_ERR_ALL );
+               if ( $err !== null && isset( $err[0] ) ) {
+                       return $err[0]['code'];
+               } else {
+                       return 0;
+               }
+       }
+
+       /**
+        * @return int
+        */
+       public function affectedRows() {
+               return $this->mAffectedRows;
+       }
+
+       /**
+        * SELECT wrapper
+        *
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Associative array of options (e.g.
+        *   [ 'GROUP BY' => 'page_title' ]), see Database::makeSelectOptions
+        *   code for list of supported stuff
+        * @param array $join_conds Associative array of table join conditions
+        *   (optional) (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
+        * @return mixed Database result resource (feed to Database::fetchObject
+        *   or whatever), or false on failure
+        * @throws DBQueryError
+        * @throws DBUnexpectedError
+        * @throws Exception
+        */
+       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = [], $join_conds = []
+       ) {
+               $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+               if ( isset( $options['EXPLAIN'] ) ) {
+                       try {
+                               $this->mScrollableCursor = false;
+                               $this->mPrepareStatements = false;
+                               $this->query( "SET SHOWPLAN_ALL ON" );
+                               $ret = $this->query( $sql, $fname );
+                               $this->query( "SET SHOWPLAN_ALL OFF" );
+                       } catch ( DBQueryError $dqe ) {
+                               if ( isset( $options['FOR COUNT'] ) ) {
+                                       // likely don't have privs for SHOWPLAN, so run a select count instead
+                                       $this->query( "SET SHOWPLAN_ALL OFF" );
+                                       unset( $options['EXPLAIN'] );
+                                       $ret = $this->select(
+                                               $table,
+                                               'COUNT(*) AS EstimateRows',
+                                               $conds,
+                                               $fname,
+                                               $options,
+                                               $join_conds
+                                       );
+                               } else {
+                                       // someone actually wanted the query plan instead of an est row count
+                                       // let them know of the error
+                                       $this->mScrollableCursor = true;
+                                       $this->mPrepareStatements = true;
+                                       throw $dqe;
+                               }
+                       }
+                       $this->mScrollableCursor = true;
+                       $this->mPrepareStatements = true;
+                       return $ret;
+               }
+               return $this->query( $sql, $fname );
+       }
+
+       /**
+        * SELECT wrapper
+        *
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Associative array of options (e.g. [ 'GROUP BY' => 'page_title' ]),
+        *   see Database::makeSelectOptions code for list of supported stuff
+        * @param array $join_conds Associative array of table join conditions (optional)
+        *    (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
+        * @return string The SQL text
+        */
+       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
+               $options = [], $join_conds = []
+       ) {
+               if ( isset( $options['EXPLAIN'] ) ) {
+                       unset( $options['EXPLAIN'] );
+               }
+
+               $sql = parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+
+               // try to rewrite aggregations of bit columns (currently MAX and MIN)
+               if ( strpos( $sql, 'MAX(' ) !== false || strpos( $sql, 'MIN(' ) !== false ) {
+                       $bitColumns = [];
+                       if ( is_array( $table ) ) {
+                               foreach ( $table as $t ) {
+                                       $bitColumns += $this->getBitColumns( $this->tableName( $t ) );
+                               }
+                       } else {
+                               $bitColumns = $this->getBitColumns( $this->tableName( $table ) );
+                       }
+
+                       foreach ( $bitColumns as $col => $info ) {
+                               $replace = [
+                                       "MAX({$col})" => "MAX(CAST({$col} AS tinyint))",
+                                       "MIN({$col})" => "MIN(CAST({$col} AS tinyint))",
+                               ];
+                               $sql = str_replace( array_keys( $replace ), array_values( $replace ), $sql );
+                       }
+               }
+
+               return $sql;
+       }
+
+       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
+               $fname = __METHOD__
+       ) {
+               $this->mScrollableCursor = false;
+               try {
+                       parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+       }
+
+       public function delete( $table, $conds, $fname = __METHOD__ ) {
+               $this->mScrollableCursor = false;
+               try {
+                       parent::delete( $table, $conds, $fname );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+       }
+
+       /**
+        * Estimate rows in dataset
+        * Returns estimated count, based on SHOWPLAN_ALL output
+        * This is not necessarily an accurate estimate, so use sparingly
+        * Returns -1 if count cannot be found
+        * Takes same arguments as Database::select()
+        * @param string $table
+        * @param string $vars
+        * @param string $conds
+        * @param string $fname
+        * @param array $options
+        * @return int
+        */
+       public function estimateRowCount( $table, $vars = '*', $conds = '',
+               $fname = __METHOD__, $options = []
+       ) {
+               // http://msdn2.microsoft.com/en-us/library/aa259203.aspx
+               $options['EXPLAIN'] = true;
+               $options['FOR COUNT'] = true;
+               $res = $this->select( $table, $vars, $conds, $fname, $options );
+
+               $rows = -1;
+               if ( $res ) {
+                       $row = $this->fetchRow( $res );
+
+                       if ( isset( $row['EstimateRows'] ) ) {
+                               $rows = (int)$row['EstimateRows'];
+                       }
+               }
+
+               return $rows;
+       }
+
+       /**
+        * Returns information about an index
+        * If errors are explicitly ignored, returns NULL on failure
+        * @param string $table
+        * @param string $index
+        * @param string $fname
+        * @return array|bool|null
+        */
+       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
+               # This does not return the same info as MYSQL would, but that's OK
+               # because MediaWiki never uses the returned value except to check for
+               # the existence of indexes.
+               $sql = "sp_helpindex '" . $this->tableName( $table ) . "'";
+               $res = $this->query( $sql, $fname );
+
+               if ( !$res ) {
+                       return null;
+               }
+
+               $result = [];
+               foreach ( $res as $row ) {
+                       if ( $row->index_name == $index ) {
+                               $row->Non_unique = !stristr( $row->index_description, "unique" );
+                               $cols = explode( ", ", $row->index_keys );
+                               foreach ( $cols as $col ) {
+                                       $row->Column_name = trim( $col );
+                                       $result[] = clone $row;
+                               }
+                       } elseif ( $index == 'PRIMARY' && stristr( $row->index_description, 'PRIMARY' ) ) {
+                               $row->Non_unique = 0;
+                               $cols = explode( ", ", $row->index_keys );
+                               foreach ( $cols as $col ) {
+                                       $row->Column_name = trim( $col );
+                                       $result[] = clone $row;
+                               }
+                       }
+               }
+
+               return empty( $result ) ? false : $result;
+       }
+
+       /**
+        * INSERT wrapper, inserts an array into a table
+        *
+        * $arrToInsert may be a single associative array, or an array of these with numeric keys, for
+        * multi-row insert.
+        *
+        * Usually aborts on failure
+        * If errors are explicitly ignored, returns success
+        * @param string $table
+        * @param array $arrToInsert
+        * @param string $fname
+        * @param array $options
+        * @return bool
+        * @throws Exception
+        */
+       public function insert( $table, $arrToInsert, $fname = __METHOD__, $options = [] ) {
+               # No rows to insert, easy just return now
+               if ( !count( $arrToInsert ) ) {
+                       return true;
+               }
+
+               if ( !is_array( $options ) ) {
+                       $options = [ $options ];
+               }
+
+               $table = $this->tableName( $table );
+
+               if ( !( isset( $arrToInsert[0] ) && is_array( $arrToInsert[0] ) ) ) { // Not multi row
+                       $arrToInsert = [ 0 => $arrToInsert ]; // make everything multi row compatible
+               }
+
+               // We know the table we're inserting into, get its identity column
+               $identity = null;
+               // strip matching square brackets and the db/schema from table name
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+               $res = $this->doQuery(
+                       "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS " .
+                               "WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'"
+               );
+               if ( $res && sqlsrv_has_rows( $res ) ) {
+                       // There is an identity for this table.
+                       $identityArr = sqlsrv_fetch_array( $res, SQLSRV_FETCH_ASSOC );
+                       $identity = array_pop( $identityArr );
+               }
+               sqlsrv_free_stmt( $res );
+
+               // Determine binary/varbinary fields so we can encode data as a hex string like 0xABCDEF
+               $binaryColumns = $this->getBinaryColumns( $table );
+
+               // INSERT IGNORE is not supported by SQL Server
+               // remove IGNORE from options list and set ignore flag to true
+               if ( in_array( 'IGNORE', $options ) ) {
+                       $options = array_diff( $options, [ 'IGNORE' ] );
+                       $this->mIgnoreDupKeyErrors = true;
+               }
+
+               $ret = null;
+               foreach ( $arrToInsert as $a ) {
+                       // start out with empty identity column, this is so we can return
+                       // it as a result of the INSERT logic
+                       $sqlPre = '';
+                       $sqlPost = '';
+                       $identityClause = '';
+
+                       // if we have an identity column
+                       if ( $identity ) {
+                               // iterate through
+                               foreach ( $a as $k => $v ) {
+                                       if ( $k == $identity ) {
+                                               if ( !is_null( $v ) ) {
+                                                       // there is a value being passed to us,
+                                                       // we need to turn on and off inserted identity
+                                                       $sqlPre = "SET IDENTITY_INSERT $table ON;";
+                                                       $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
+                                               } else {
+                                                       // we can't insert NULL into an identity column,
+                                                       // so remove the column from the insert.
+                                                       unset( $a[$k] );
+                                               }
+                                       }
+                               }
+
+                               // we want to output an identity column as result
+                               $identityClause = "OUTPUT INSERTED.$identity ";
+                       }
+
+                       $keys = array_keys( $a );
+
+                       // Build the actual query
+                       $sql = $sqlPre . 'INSERT ' . implode( ' ', $options ) .
+                               " INTO $table (" . implode( ',', $keys ) . ") $identityClause VALUES (";
+
+                       $first = true;
+                       foreach ( $a as $key => $value ) {
+                               if ( isset( $binaryColumns[$key] ) ) {
+                                       $value = new MssqlBlob( $value );
+                               }
+                               if ( $first ) {
+                                       $first = false;
+                               } else {
+                                       $sql .= ',';
+                               }
+                               if ( is_null( $value ) ) {
+                                       $sql .= 'null';
+                               } elseif ( is_array( $value ) || is_object( $value ) ) {
+                                       if ( is_object( $value ) && $value instanceof Blob ) {
+                                               $sql .= $this->addQuotes( $value );
+                                       } else {
+                                               $sql .= $this->addQuotes( serialize( $value ) );
+                                       }
+                               } else {
+                                       $sql .= $this->addQuotes( $value );
+                               }
+                       }
+                       $sql .= ')' . $sqlPost;
+
+                       // Run the query
+                       $this->mScrollableCursor = false;
+                       try {
+                               $ret = $this->query( $sql );
+                       } catch ( Exception $e ) {
+                               $this->mScrollableCursor = true;
+                               $this->mIgnoreDupKeyErrors = false;
+                               throw $e;
+                       }
+                       $this->mScrollableCursor = true;
+
+                       if ( $ret instanceof ResultWrapper && !is_null( $identity ) ) {
+                               // Then we want to get the identity column value we were assigned and save it off
+                               $row = $ret->fetchObject();
+                               if ( is_object( $row ) ) {
+                                       $this->mInsertId = $row->$identity;
+                                       // It seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is
+                                       // used if we got an identity back, we know for sure a row was affected, so
+                                       // adjust that here
+                                       if ( $this->mAffectedRows == -1 ) {
+                                               $this->mAffectedRows = 1;
+                                       }
+                               }
+                       }
+               }
+
+               $this->mIgnoreDupKeyErrors = false;
+
+               return $ret;
+       }
+
+       /**
+        * INSERT SELECT wrapper
+        * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
+        * Source items may be literals rather than field names, but strings should
+        * be quoted with Database::addQuotes().
+        * @param string $destTable
+        * @param array|string $srcTable May be an array of tables.
+        * @param array $varMap
+        * @param array $conds May be "*" to copy the whole table.
+        * @param string $fname
+        * @param array $insertOptions
+        * @param array $selectOptions
+        * @return null|ResultWrapper
+        * @throws Exception
+        */
+       public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
+               $insertOptions = [], $selectOptions = []
+       ) {
+               $this->mScrollableCursor = false;
+               try {
+                       $ret = parent::nativeInsertSelect(
+                               $destTable,
+                               $srcTable,
+                               $varMap,
+                               $conds,
+                               $fname,
+                               $insertOptions,
+                               $selectOptions
+                       );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+
+               return $ret;
+       }
+
+       /**
+        * UPDATE wrapper. Takes a condition array and a SET array.
+        *
+        * @param string $table Name of the table to UPDATE. This will be passed through
+        *                Database::tableName().
+        *
+        * @param array $values An array of values to SET. For each array element,
+        *                the key gives the field name, and the value gives the data
+        *                to set that field to. The data will be quoted by
+        *                Database::addQuotes().
+        *
+        * @param array $conds An array of conditions (WHERE). See
+        *                Database::select() for the details of the format of
+        *                condition arrays. Use '*' to update all rows.
+        *
+        * @param string $fname The function name of the caller (from __METHOD__),
+        *                for logging and profiling.
+        *
+        * @param array $options An array of UPDATE options, can be:
+        *                   - IGNORE: Ignore unique key conflicts
+        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
+        * @return bool
+        * @throws DBUnexpectedError
+        * @throws Exception
+        */
+       function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {
+               $table = $this->tableName( $table );
+               $binaryColumns = $this->getBinaryColumns( $table );
+
+               $opts = $this->makeUpdateOptions( $options );
+               $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET, $binaryColumns );
+
+               if ( $conds !== [] && $conds !== '*' ) {
+                       $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns );
+               }
+
+               $this->mScrollableCursor = false;
+               try {
+                       $this->query( $sql );
+               } catch ( Exception $e ) {
+                       $this->mScrollableCursor = true;
+                       throw $e;
+               }
+               $this->mScrollableCursor = true;
+               return true;
+       }
+
+       /**
+        * Makes an encoded list of strings from an array
+        * @param array $a Containing the data
+        * @param int $mode Constant
+        *      - LIST_COMMA:          comma separated, no field names
+        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
+        *        the documentation for $conds in Database::select().
+        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
+        *      - LIST_SET:            comma separated with field names, like a SET clause
+        *      - LIST_NAMES:          comma separated field names
+        * @param array $binaryColumns Contains a list of column names that are binary types
+        *      This is a custom parameter only present for MS SQL.
+        *
+        * @throws DBUnexpectedError
+        * @return string
+        */
+       public function makeList( $a, $mode = LIST_COMMA, $binaryColumns = [] ) {
+               if ( !is_array( $a ) ) {
+                       throw new DBUnexpectedError( $this, __METHOD__ . ' called with incorrect parameters' );
+               }
+
+               if ( $mode != LIST_NAMES ) {
+                       // In MS SQL, values need to be specially encoded when they are
+                       // inserted into binary fields. Perform this necessary encoding
+                       // for the specified set of columns.
+                       foreach ( array_keys( $a ) as $field ) {
+                               if ( !isset( $binaryColumns[$field] ) ) {
+                                       continue;
+                               }
+
+                               if ( is_array( $a[$field] ) ) {
+                                       foreach ( $a[$field] as &$v ) {
+                                               $v = new MssqlBlob( $v );
+                                       }
+                                       unset( $v );
+                               } else {
+                                       $a[$field] = new MssqlBlob( $a[$field] );
+                               }
+                       }
+               }
+
+               return parent::makeList( $a, $mode );
+       }
+
+       /**
+        * @param string $table
+        * @param string $field
+        * @return int Returns the size of a text field, or -1 for "unlimited"
+        */
+       public function textFieldSize( $table, $field ) {
+               $table = $this->tableName( $table );
+               $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
+                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'";
+               $res = $this->query( $sql );
+               $row = $this->fetchRow( $res );
+               $size = -1;
+               if ( strtolower( $row['DATA_TYPE'] ) != 'text' ) {
+                       $size = $row['CHARACTER_MAXIMUM_LENGTH'];
+               }
+
+               return $size;
+       }
+
+       /**
+        * Construct a LIMIT query with optional offset
+        * This is used for query pages
+        *
+        * @param string $sql SQL query we will append the limit too
+        * @param int $limit The SQL limit
+        * @param bool|int $offset The SQL offset (default false)
+        * @return array|string
+        * @throws DBUnexpectedError
+        */
+       public function limitResult( $sql, $limit, $offset = false ) {
+               if ( $offset === false || $offset == 0 ) {
+                       if ( strpos( $sql, "SELECT" ) === false ) {
+                               return "TOP {$limit} " . $sql;
+                       } else {
+                               return preg_replace( '/\bSELECT(\s+DISTINCT)?\b/Dsi',
+                                       'SELECT$1 TOP ' . $limit, $sql, 1 );
+                       }
+               } else {
+                       // This one is fun, we need to pull out the select list as well as any ORDER BY clause
+                       $select = $orderby = [];
+                       $s1 = preg_match( '#SELECT\s+(.+?)\s+FROM#Dis', $sql, $select );
+                       $s2 = preg_match( '#(ORDER BY\s+.+?)(\s*FOR XML .*)?$#Dis', $sql, $orderby );
+                       $postOrder = '';
+                       $first = $offset + 1;
+                       $last = $offset + $limit;
+                       $sub1 = 'sub_' . $this->mSubqueryId;
+                       $sub2 = 'sub_' . ( $this->mSubqueryId + 1 );
+                       $this->mSubqueryId += 2;
+                       if ( !$s1 ) {
+                               // wat
+                               throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" );
+                       }
+                       if ( !$s2 ) {
+                               // no ORDER BY
+                               $overOrder = 'ORDER BY (SELECT 1)';
+                       } else {
+                               if ( !isset( $orderby[2] ) || !$orderby[2] ) {
+                                       // don't need to strip it out if we're using a FOR XML clause
+                                       $sql = str_replace( $orderby[1], '', $sql );
+                               }
+                               $overOrder = $orderby[1];
+                               $postOrder = ' ' . $overOrder;
+                       }
+                       $sql = "SELECT {$select[1]}
+                                       FROM (
+                                               SELECT ROW_NUMBER() OVER({$overOrder}) AS rowNumber, *
+                                               FROM ({$sql}) {$sub1}
+                                       ) {$sub2}
+                                       WHERE rowNumber BETWEEN {$first} AND {$last}{$postOrder}";
+
+                       return $sql;
+               }
+       }
+
+       /**
+        * If there is a limit clause, parse it, strip it, and pass the remaining
+        * SQL through limitResult() with the appropriate parameters. Not the
+        * prettiest solution, but better than building a whole new parser. This
+        * exists becase there are still too many extensions that don't use dynamic
+        * sql generation.
+        *
+        * @param string $sql
+        * @return array|mixed|string
+        */
+       public function LimitToTopN( $sql ) {
+               // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
+               $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
+               if ( preg_match( $pattern, $sql, $matches ) ) {
+                       $row_count = $matches[4];
+                       $offset = $matches[3] ?: $matches[6] ?: false;
+
+                       // strip the matching LIMIT clause out
+                       $sql = str_replace( $matches[0], '', $sql );
+
+                       return $this->limitResult( $sql, $row_count, $offset );
+               }
+
+               return $sql;
+       }
+
+       /**
+        * @return string Wikitext of a link to the server software's web site
+        */
+       public function getSoftwareLink() {
+               return "[{{int:version-db-mssql-url}} MS SQL Server]";
+       }
+
+       /**
+        * @return string Version information from the database
+        */
+       public function getServerVersion() {
+               $server_info = sqlsrv_server_info( $this->mConn );
+               $version = 'Error';
+               if ( isset( $server_info['SQLServerVersion'] ) ) {
+                       $version = $server_info['SQLServerVersion'];
+               }
+
+               return $version;
+       }
+
+       /**
+        * @param string $table
+        * @param string $fname
+        * @return bool
+        */
+       public function tableExists( $table, $fname = __METHOD__ ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
+
+               if ( $db !== false ) {
+                       // remote database
+                       $this->queryLogger->error( "Attempting to call tableExists on a remote table" );
+                       return false;
+               }
+
+               if ( $schema === false ) {
+                       $schema = $this->mSchema;
+               }
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
+                       WHERE TABLE_TYPE = 'BASE TABLE'
+                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
+
+               if ( $res->numRows() ) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Query whether a given column exists in the mediawiki schema
+        * @param string $table
+        * @param string $field
+        * @param string $fname
+        * @return bool
+        */
+       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
+
+               if ( $db !== false ) {
+                       // remote database
+                       $this->queryLogger->error( "Attempting to call fieldExists on a remote table" );
+                       return false;
+               }
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               if ( $res->numRows() ) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       public function fieldInfo( $table, $field ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
+
+               if ( $db !== false ) {
+                       // remote database
+                       $this->queryLogger->error( "Attempting to call fieldInfo on a remote table" );
+                       return false;
+               }
+
+               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               $meta = $res->fetchRow();
+               if ( $meta ) {
+                       return new MssqlField( $meta );
+               }
+
+               return false;
+       }
+
+       /**
+        * Begin a transaction, committing any previously open transaction
+        * @param string $fname
+        */
+       protected function doBegin( $fname = __METHOD__ ) {
+               sqlsrv_begin_transaction( $this->mConn );
+               $this->mTrxLevel = 1;
+       }
+
+       /**
+        * End a transaction
+        * @param string $fname
+        */
+       protected function doCommit( $fname = __METHOD__ ) {
+               sqlsrv_commit( $this->mConn );
+               $this->mTrxLevel = 0;
+       }
+
+       /**
+        * Rollback a transaction.
+        * No-op on non-transactional databases.
+        * @param string $fname
+        */
+       protected function doRollback( $fname = __METHOD__ ) {
+               sqlsrv_rollback( $this->mConn );
+               $this->mTrxLevel = 0;
+       }
+
+       /**
+        * @param string $s
+        * @return string
+        */
+       public function strencode( $s ) {
+               // Should not be called by us
+
+               return str_replace( "'", "''", $s );
+       }
+
+       /**
+        * @param string|int|null|bool|Blob $s
+        * @return string|int
+        */
+       public function addQuotes( $s ) {
+               if ( $s instanceof MssqlBlob ) {
+                       return $s->fetch();
+               } elseif ( $s instanceof Blob ) {
+                       // this shouldn't really ever be called, but it's here if needed
+                       // (and will quite possibly make the SQL error out)
+                       $blob = new MssqlBlob( $s->fetch() );
+                       return $blob->fetch();
+               } else {
+                       if ( is_bool( $s ) ) {
+                               $s = $s ? 1 : 0;
+                       }
+                       return parent::addQuotes( $s );
+               }
+       }
+
+       /**
+        * @param string $s
+        * @return string
+        */
+       public function addIdentifierQuotes( $s ) {
+               // http://msdn.microsoft.com/en-us/library/aa223962.aspx
+               return '[' . $s . ']';
+       }
+
+       /**
+        * @param string $name
+        * @return bool
+        */
+       public function isQuotedIdentifier( $name ) {
+               return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
+       }
+
+       /**
+        * MS SQL supports more pattern operators than other databases (ex: [,],^)
+        *
+        * @param string $s
+        * @return string
+        */
+       protected function escapeLikeInternal( $s ) {
+               return addcslashes( $s, '\%_[]^' );
+       }
+
+       /**
+        * MS SQL requires specifying the escape character used in a LIKE query
+        * or using Square brackets to surround characters that are to be escaped
+        * https://msdn.microsoft.com/en-us/library/ms179859.aspx
+        * Here we take the Specify-Escape-Character approach since it's less
+        * invasive, renders a query that is closer to other DB's and better at
+        * handling square bracket escaping
+        *
+        * @return string Fully built LIKE statement
+        */
+       public function buildLike() {
+               $params = func_get_args();
+               if ( count( $params ) > 0 && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+
+               return parent::buildLike( $params ) . " ESCAPE '\' ";
+       }
+
+       /**
+        * @param string $db
+        * @return bool
+        */
+       public function selectDB( $db ) {
+               try {
+                       $this->mDBname = $db;
+                       $this->query( "USE $db" );
+                       return true;
+               } catch ( Exception $e ) {
+                       return false;
+               }
+       }
+
+       /**
+        * @param array $options An associative array of options to be turned into
+        *   an SQL query, valid keys are listed in the function.
+        * @return array
+        */
+       public function makeSelectOptions( $options ) {
+               $tailOpts = '';
+               $startOpts = '';
+
+               $noKeyOptions = [];
+               foreach ( $options as $key => $option ) {
+                       if ( is_numeric( $key ) ) {
+                               $noKeyOptions[$option] = true;
+                       }
+               }
+
+               $tailOpts .= $this->makeGroupByWithHaving( $options );
+
+               $tailOpts .= $this->makeOrderBy( $options );
+
+               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
+                       $startOpts .= 'DISTINCT';
+               }
+
+               if ( isset( $noKeyOptions['FOR XML'] ) ) {
+                       // used in group concat field emulation
+                       $tailOpts .= " FOR XML PATH('')";
+               }
+
+               // we want this to be compatible with the output of parent::makeSelectOptions()
+               return [ $startOpts, '', $tailOpts, '', '' ];
+       }
+
+       public function getType() {
+               return 'mssql';
+       }
+
+       /**
+        * @param array $stringList
+        * @return string
+        */
+       public function buildConcat( $stringList ) {
+               return implode( ' + ', $stringList );
+       }
+
+       /**
+        * Build a GROUP_CONCAT or equivalent statement for a query.
+        * MS SQL doesn't have GROUP_CONCAT so we emulate it with other stuff (and boy is it nasty)
+        *
+        * This is useful for combining a field for several rows into a single string.
+        * NULL values will not appear in the output, duplicated values will appear,
+        * and the resulting delimiter-separated values have no defined sort order.
+        * Code using the results may need to use the PHP unique() or sort() methods.
+        *
+        * @param string $delim Glue to bind the results together
+        * @param string|array $table Table name
+        * @param string $field Field name
+        * @param string|array $conds Conditions
+        * @param string|array $join_conds Join conditions
+        * @return string SQL text
+        * @since 1.23
+        */
+       public function buildGroupConcatField( $delim, $table, $field, $conds = '',
+               $join_conds = []
+       ) {
+               $gcsq = 'gcsq_' . $this->mSubqueryId;
+               $this->mSubqueryId++;
+
+               $delimLen = strlen( $delim );
+               $fld = "{$field} + {$this->addQuotes( $delim )}";
+               $sql = "(SELECT LEFT({$field}, LEN({$field}) - {$delimLen}) FROM ("
+                       . $this->selectSQLText( $table, $fld, $conds, null, [ 'FOR XML' ], $join_conds )
+                       . ") {$gcsq} ({$field}))";
+
+               return $sql;
+       }
+
+       /**
+        * Returns an associative array for fields that are of type varbinary, binary, or image
+        * $table can be either a raw table name or passed through tableName() first
+        * @param string $table
+        * @return array
+        */
+       private function getBinaryColumns( $table ) {
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+
+               if ( $this->mBinaryColumnCache === null ) {
+                       $this->populateColumnCaches();
+               }
+
+               return isset( $this->mBinaryColumnCache[$tableRaw] )
+                       ? $this->mBinaryColumnCache[$tableRaw]
+                       : [];
+       }
+
+       /**
+        * @param string $table
+        * @return array
+        */
+       private function getBitColumns( $table ) {
+               $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) );
+               $tableRaw = array_pop( $tableRawArr );
+
+               if ( $this->mBitColumnCache === null ) {
+                       $this->populateColumnCaches();
+               }
+
+               return isset( $this->mBitColumnCache[$tableRaw] )
+                       ? $this->mBitColumnCache[$tableRaw]
+                       : [];
+       }
+
+       private function populateColumnCaches() {
+               $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*',
+                       [
+                               'TABLE_CATALOG' => $this->mDBname,
+                               'TABLE_SCHEMA' => $this->mSchema,
+                               'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ]
+                       ] );
+
+               $this->mBinaryColumnCache = [];
+               $this->mBitColumnCache = [];
+               foreach ( $res as $row ) {
+                       if ( $row->DATA_TYPE == 'bit' ) {
+                               $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                       } else {
+                               $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row;
+                       }
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param string $format
+        * @return string
+        */
+       function tableName( $name, $format = 'quoted' ) {
+               # Replace reserved words with better ones
+               switch ( $name ) {
+                       case 'user':
+                               return $this->realTableName( 'mwuser', $format );
+                       default:
+                               return $this->realTableName( $name, $format );
+               }
+       }
+
+       /**
+        * call this instead of tableName() in the updater when renaming tables
+        * @param string $name
+        * @param string $format One of quoted, raw, or split
+        * @return string
+        */
+       function realTableName( $name, $format = 'quoted' ) {
+               $table = parent::tableName( $name, $format );
+               if ( $format == 'split' ) {
+                       // Used internally, we want the schema split off from the table name and returned
+                       // as a list with 3 elements (database, schema, table)
+                       $table = explode( '.', $table );
+                       while ( count( $table ) < 3 ) {
+                               array_unshift( $table, false );
+                       }
+               }
+               return $table;
+       }
+
+       /**
+        * Delete a table
+        * @param string $tableName
+        * @param string $fName
+        * @return bool|ResultWrapper
+        * @since 1.18
+        */
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               if ( !$this->tableExists( $tableName, $fName ) ) {
+                       return false;
+               }
+
+               // parent function incorrectly appends CASCADE, which we don't want
+               $sql = "DROP TABLE " . $this->tableName( $tableName );
+
+               return $this->query( $sql, $fName );
+       }
+
+       /**
+        * Called in the installer and updater.
+        * Probably doesn't need to be called anywhere else in the codebase.
+        * @param bool|null $value
+        * @return bool|null
+        */
+       public function prepareStatements( $value = null ) {
+               $old = $this->mPrepareStatements;
+               if ( $value !== null ) {
+                       $this->mPrepareStatements = $value;
+               }
+
+               return $old;
+       }
+
+       /**
+        * Called in the installer and updater.
+        * Probably doesn't need to be called anywhere else in the codebase.
+        * @param bool|null $value
+        * @return bool|null
+        */
+       public function scrollableCursor( $value = null ) {
+               $old = $this->mScrollableCursor;
+               if ( $value !== null ) {
+                       $this->mScrollableCursor = $value;
+               }
+
+               return $old;
+       }
+}
index ceed7da..9270589 100644 (file)
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\MySQLMasterPos;
+use Wikimedia\Rdbms\MySQLField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Database abstraction object for MySQL.
index 2f27ff9..7a2200a 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Database
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Database abstraction object for PHP extension mysqli.
  *
index 42113b0..af9716d 100644 (file)
  * @file
  * @ingroup Database
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\PostgresBlob;
+use Wikimedia\Rdbms\PostgresField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
@@ -698,7 +703,7 @@ __INDEXATTR__;
                list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) =
                        $this->makeSelectOptions( $selectOptions );
                if ( is_array( $srcTable ) ) {
-                       $srcTable = implode( ',', array_map( [ &$this, 'tableName' ], $srcTable ) );
+                       $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
                }
@@ -982,7 +987,7 @@ __INDEXATTR__;
                                /**
                                 * Prepend our schema (e.g. 'mediawiki') in front
                                 * of the search path
-                                * Fixes bug 15816
+                                * Fixes T17816
                                 */
                                $search_path = $this->getSearchPath();
                                array_unshift( $search_path,
@@ -1023,7 +1028,7 @@ __INDEXATTR__;
                                // Normal client
                                $this->numericVersion = $versionInfo['server'];
                        } else {
-                               // Bug 16937: broken pgsql extension from PHP<5.3
+                               // T18937: broken pgsql extension from PHP<5.3
                                $this->numericVersion = pg_parameter_status( $conn, 'server_version' );
                        }
                }
@@ -1076,8 +1081,8 @@ __INDEXATTR__;
                $q = <<<SQL
        SELECT 1 FROM pg_class, pg_namespace, pg_trigger
                WHERE relnamespace=pg_namespace.oid AND relkind='r'
-                         AND tgrelid=pg_class.oid
-                         AND nspname=%s AND relname=%s AND tgname=%s
+                       AND tgrelid=pg_class.oid
+                       AND nspname=%s AND relname=%s AND tgname=%s
 SQL;
                $res = $this->query(
                        sprintf(
@@ -1249,15 +1254,9 @@ SQL;
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               // if ( isset( $options['LIMIT'] ) ) {
-               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
-               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
-               //              : false );
-               // }
-
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' .
-                               implode( ', ', array_map( [ &$this, 'tableName' ], $options['FOR UPDATE'] ) );
+                               implode( ', ', array_map( [ $this, 'tableName' ], $options['FOR UPDATE'] ) );
                } elseif ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
index a4b2df0..090ce8e 100644 (file)
@@ -21,6 +21,9 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\SQLiteField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
index c6055db..6bc870b 100644 (file)
  * @ingroup Database
  */
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\LikeMatch;
+use Wikimedia\Rdbms\DBMasterPos;
+use Wikimedia\Rdbms\Field;
+use Wikimedia\Rdbms\IResultWrapper;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -359,7 +364,7 @@ interface IDatabase {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
         * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -370,7 +375,7 @@ interface IDatabase {
         * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper $res Result object as returned from IDatabase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -513,7 +518,7 @@ interface IDatabase {
         * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
         * @throws DBError
-        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
+        * @return bool|IResultWrapper True for a successful write query, IResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false );
@@ -727,7 +732,7 @@ interface IDatabase {
         *
         *    [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ]
         *
-        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
+        * @return IResultWrapper|bool If the query returned no rows, a IResultWrapper
         *   with no rows in it will be returned. If there was a query error, a
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
@@ -905,6 +910,8 @@ interface IDatabase {
         * @param array $values An array of values to SET. For each array element,
         *   the key gives the field name, and the value gives the data to set
         *   that field to. The data will be quoted by IDatabase::addQuotes().
+        *   Values with integer keys form unquoted SET statements, which can be used for
+        *   things like "field = field + 1" or similar computed values.
         * @param array $conds An array of conditions (WHERE). See
         *   IDatabase::select() for the details of the format of condition
         *   arrays. Use '*' to update all rows.
@@ -1148,6 +1155,8 @@ interface IDatabase {
         * @param array $set An array of values to SET. For each array element, the
         *   key gives the field name, and the value gives the data to set that
         *   field to. The data will be quoted by IDatabase::addQuotes().
+        *   Values with integer keys form unquoted SET statements, which can be used for
+        *   things like "field = field + 1" or similar computed values.
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws Exception
         * @return bool
@@ -1188,7 +1197,7 @@ interface IDatabase {
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
-        * @return bool|ResultWrapper
+        * @return bool|IResultWrapper
         */
        public function delete( $table, $conds, $fname = __METHOD__ );
 
@@ -1216,7 +1225,7 @@ interface IDatabase {
         * @param array $selectOptions Options for the SELECT part of the query, see
         *    IDatabase::select() for details.
         *
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
index eda0ff3..2f79ea9 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * An object representing a master or replica DB position in a replicated setup.
  *
index 7b49ce9..06776fe 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+
 /**
  * DBMasterPos class for MySQL/MariaDB
  *
index 1a046cf..fd7af11 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 /**
  * Overloads the relevant methods of the real ResultsWrapper so it
  * doesn't go anywhere near an actual database.
@@ -56,3 +61,6 @@ class FakeResultWrapper extends ResultWrapper {
                return $this->fetchObject();
        }
 }
+
+class_alias( FakeResultWrapper::class, 'FakeResultWrapper' );
+
diff --git a/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php b/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php
new file mode 100644 (file)
index 0000000..dc89a2d
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+use Iterator;
+use DBUnexpectedError;
+use stdClass;
+
+/**
+ * Result wrapper for grabbing data queried from an IDatabase object
+ *
+ * Note that using the Iterator methods in combination with the non-Iterator
+ * DB result iteration functions may cause rows to be skipped or repeated.
+ *
+ * By default, this will use the iteration methods of the IDatabase handle if provided.
+ * Subclasses can override methods to make it solely work on the result resource instead.
+ * If no database is provided, and the subclass does not override the DB iteration methods,
+ * then a RuntimeException will be thrown when iteration is attempted.
+ *
+ * The result resource field should not be accessed from non-Database related classes.
+ * It is database class specific and is stored here to associate iterators with queries.
+ *
+ * @ingroup Database
+ */
+interface IResultWrapper extends Iterator {
+       /**
+        * Get the number of rows in a result object
+        *
+        * @return int
+        */
+       public function numRows();
+
+       /**
+        * Fetch the next row from the given result object, in object form. Fields can be retrieved with
+        * $row->fieldname, with fields acting like member variables. If no more rows are available,
+        * false is returned.
+        *
+        * @return stdClass|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       public function fetchObject();
+
+       /**
+        * Fetch the next row from the given result object, in associative array form. Fields are
+        * retrieved with $row['fieldname']. If no more rows are available, false is returned.
+        *
+        * @return array|bool
+        * @throws DBUnexpectedError Thrown if the database returns an error
+        */
+       public function fetchRow();
+
+       /**
+        * Change the position of the cursor in a result object.
+        * See mysql_data_seek()
+        *
+        * @param int $row
+        */
+       public function seek( $row );
+
+       /**
+        * Free a result object
+        *
+        * This either saves memory in PHP (buffered queries) or on the server (unbuffered queries).
+        * In general, queries are not large enough in result sets for this to be worth calling.
+        */
+       public function free();
+
+       /**
+        * @return stdClass|array|bool
+        */
+       public function current();
+
+       /**
+        * @return int
+        */
+       public function key();
+
+       /**
+        * @return stdClass
+        */
+       function next();
+}
index b591f4f..4e28397 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 class MssqlResultWrapper extends ResultWrapper {
        /** @var integer|null */
        private $mSeekTo = null;
index 53109c8..a76d66a 100644 (file)
@@ -1,4 +1,11 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use stdClass;
+use RuntimeException;
+
 /**
  * Result wrapper for grabbing data queried from an IDatabase object
  *
@@ -15,7 +22,7 @@
  *
  * @ingroup Database
  */
-class ResultWrapper implements Iterator {
+class ResultWrapper implements IResultWrapper {
        /** @var resource|array|null Optional underlying result handle for subclass usage */
        public $result;
 
@@ -45,54 +52,22 @@ class ResultWrapper implements Iterator {
                }
        }
 
-       /**
-        * Get the number of rows in a result object
-        *
-        * @return int
-        */
        public function numRows() {
                return $this->getDB()->numRows( $this );
        }
 
-       /**
-        * Fetch the next row from the given result object, in object form. Fields can be retrieved with
-        * $row->fieldname, with fields acting like member variables. If no more rows are available,
-        * false is returned.
-        *
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
        public function fetchObject() {
                return $this->getDB()->fetchObject( $this );
        }
 
-       /**
-        * Fetch the next row from the given result object, in associative array form. Fields are
-        * retrieved with $row['fieldname']. If no more rows are available, false is returned.
-        *
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
        public function fetchRow() {
                return $this->getDB()->fetchRow( $this );
        }
 
-       /**
-        * Change the position of the cursor in a result object.
-        * See mysql_data_seek()
-        *
-        * @param int $row
-        */
        public function seek( $row ) {
                $this->getDB()->dataSeek( $this, $row );
        }
 
-       /**
-        * Free a result object
-        *
-        * This either saves memory in PHP (buffered queries) or on the server (unbuffered queries).
-        * In general, queries are not large enough in result sets for this to be worth calling.
-        */
        public function free() {
                if ( $this->db ) {
                        $this->db->freeResult( $this );
@@ -121,9 +96,6 @@ class ResultWrapper implements Iterator {
                $this->currentRow = null;
        }
 
-       /**
-        * @return stdClass|array|bool
-        */
        function current() {
                if ( is_null( $this->currentRow ) ) {
                        $this->next();
@@ -132,16 +104,10 @@ class ResultWrapper implements Iterator {
                return $this->currentRow;
        }
 
-       /**
-        * @return int
-        */
        function key() {
                return $this->pos;
        }
 
-       /**
-        * @return stdClass
-        */
        function next() {
                $this->pos++;
                $this->currentRow = $this->fetchObject();
@@ -153,3 +119,5 @@ class ResultWrapper implements Iterator {
                return $this->current() !== false;
        }
 }
+
+class_alias( ResultWrapper::class, 'ResultWrapper' );
index 692a704..c3367e7 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\ILoadBalancer;
+
 /**@{
  * Database related constants
  */
index bd90330..db5b7e5 100644 (file)
@@ -1,19 +1,21 @@
 <?php
-/**
- * Utility class
- * @ingroup Database
- *
- * This allows us to distinguish a blob from a normal string and an array of strings
- */
-class Blob {
+
+namespace Wikimedia\Rdbms;
+
+class Blob implements IBlob {
        /** @var string */
        protected $mData;
 
-       function __construct( $data ) {
+       /**
+        * @param $data string
+        */
+       public function __construct( $data ) {
                $this->mData = $data;
        }
 
-       function fetch() {
+       public function fetch() {
                return $this->mData;
        }
 }
+
+class_alias( Blob::class, 'Blob' );
diff --git a/includes/libs/rdbms/encasing/IBlob.php b/includes/libs/rdbms/encasing/IBlob.php
new file mode 100644 (file)
index 0000000..b1d7aae
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+namespace Wikimedia\Rdbms;
+
+/**
+ * Wrapper allowing us to distinguish a blob from a normal string and an array of strings
+ * @ingroup Database
+ */
+interface IBlob {
+       /**
+        * @return string
+        */
+       public function fetch();
+}
index b0b3c87..98812a5 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * Used by Database::buildLike() to represent characters that have special
  * meaning in SQL LIKE clauses and thus need no escaping. Don't instantiate it
index 35be65c..aacdf40 100644 (file)
@@ -1,5 +1,13 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class MssqlBlob extends Blob {
+       /** @noinspection PhpMissingParentConstructorInspection */
+
+       /**
+        * @param string $data
+        */
        public function __construct( $data ) {
                if ( $data instanceof MssqlBlob ) {
                        return $data;
index cc52336..7994b73 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class PostgresBlob extends Blob {
 
 }
index ed102f4..7918f36 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * Base for all database-specific classes representing information about database fields
  * @ingroup Database
@@ -28,3 +31,5 @@ interface Field {
         */
        function isNullable();
 }
+
+class_alias( Field::class, 'Field' );
index 500b2ef..98cc2b1 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class MssqlField implements Field {
        private $name, $tableName, $default, $max_length, $nullable, $type;
 
index 02d3589..709c61e 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class MySQLField implements Field {
        private $name, $tablename, $default, $max_length, $nullable,
                $is_pk, $is_unique, $is_multiple, $is_key, $type, $binary,
diff --git a/includes/libs/rdbms/field/ORAField.php b/includes/libs/rdbms/field/ORAField.php
deleted file mode 100644 (file)
index e48310d..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-class ORAField implements Field {
-       private $name, $tablename, $default, $max_length, $nullable,
-               $is_pk, $is_unique, $is_multiple, $is_key, $type;
-
-       function __construct( $info ) {
-               $this->name = $info['column_name'];
-               $this->tablename = $info['table_name'];
-               $this->default = $info['data_default'];
-               $this->max_length = $info['data_length'];
-               $this->nullable = $info['not_null'];
-               $this->is_pk = isset( $info['prim'] ) && $info['prim'] == 1 ? 1 : 0;
-               $this->is_unique = isset( $info['uniq'] ) && $info['uniq'] == 1 ? 1 : 0;
-               $this->is_multiple = isset( $info['nonuniq'] ) && $info['nonuniq'] == 1 ? 1 : 0;
-               $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
-               $this->type = $info['data_type'];
-       }
-
-       function name() {
-               return $this->name;
-       }
-
-       function tableName() {
-               return $this->tablename;
-       }
-
-       function defaultValue() {
-               return $this->default;
-       }
-
-       function maxLength() {
-               return $this->max_length;
-       }
-
-       function isNullable() {
-               return $this->nullable;
-       }
-
-       function isKey() {
-               return $this->is_key;
-       }
-
-       function isMultipleKey() {
-               return $this->is_multiple;
-       }
-
-       function type() {
-               return $this->type;
-       }
-}
index d34c125..c5819a3 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use DatabasePostgres;
+
 class PostgresField implements Field {
        private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname,
                $has_default, $default;
index 0a2389b..39f8f01 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 class SQLiteField implements Field {
        private $info, $tableName;
 
index 5288c24..faf7fb1 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+use DBTransactionError;
+use DBReplicationWaitError;
+
 /**
  * An interface for generating database load balancers
  * @ingroup Database
@@ -178,7 +184,7 @@ interface ILBFactory {
         * @param string $fname Caller name
         * @param array $options Options map:
         *   - maxWriteDuration: abort if more than this much time was spent in write queries
-        * @throws Exception
+        * @throws DBTransactionError
         */
        public function commitMasterChanges( $fname = __METHOD__, array $options = [] );
 
index 77d4aa9..f05dabc 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
+use BagOStuff;
+use EmptyBagOStuff;
+use WANObjectCache;
+use Exception;
+use RuntimeException;
+use IDatabase;
+use DBTransactionError;
+use DBReplicationWaitError;
 
 /**
  * An interface for generating database load balancers
@@ -326,7 +336,7 @@ abstract class LBFactory implements ILBFactory {
                $masterPositions = array_fill( 0, count( $lbs ), false );
                foreach ( $lbs as $i => $lb ) {
                        if ( $lb->getServerCount() <= 1 ) {
-                               // Bug 27975 - Don't try to wait for replica DBs if there are none
+                               // T29975 - Don't try to wait for replica DBs if there are none
                                // Prevents permission error when getting master position
                                continue;
                        } elseif ( $opts['ifWritesSince']
index 4158e61..447b96f 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use InvalidArgumentException;
+
 /**
  * A multi-database, multi-master factory for Wikimedia and similar installations.
  * Ignores the old configuration globals.
index 5bf5032..15cd508 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
+
 /**
  * A simple single-master LBFactory that gets its configuration from the b/c globals
  */
index 819375d..5931d80 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use InvalidArgumentException;
+use BadMethodCallException;
+
 /**
  * An LBFactory class that always returns a single database object.
  */
index fc306b4..4c277ff 100644 (file)
  * @ingroup Database
  * @author Aaron Schulz
  */
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use Database;
+use DBConnRef;
+use MaintainableDBConnRef;
+use DBError;
+use DBAccessError;
+use DBTransactionError;
+use DBExpectedError;
+use Exception;
+use InvalidArgumentException;
 
 /**
  * Database cluster connection, tracking, load balancing, and transaction manager interface
@@ -228,9 +240,6 @@ interface ILoadBalancer {
         * Index must be an actual index into the array.
         * If the server is already open, returns it.
         *
-        * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
-        *
         * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
         *
         * @param int $i Server index or DB_MASTER/DB_REPLICA
@@ -370,7 +379,7 @@ interface ILoadBalancer {
         *
         * Use this only for mutli-database commits
         *
-        * @param integer $type IDatabase::TRIGGER_* constant
+        * @param int $type IDatabase::TRIGGER_* constant
         * @return Exception|null The first exception or null if there were none
         */
        public function runMasterPostTrxCallbacks( $type );
@@ -447,7 +456,7 @@ interface ILoadBalancer {
        /**
         * @note This method may trigger a DB connection if not yet done
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @param IDatabase|null DB master connection; used to avoid loops [optional]
+        * @param IDatabase|null $conn DB master connection; used to avoid loops [optional]
         * @return string|bool Reason the master is read-only or false if it is not
         */
        public function getReadOnlyReason( $domain = false, IDatabase $conn = null );
@@ -532,10 +541,10 @@ interface ILoadBalancer {
         *
         * @param IDatabase $conn Replica DB
         * @param DBMasterPos|bool $pos Master position; default: current position
-        * @param integer|null $timeout Timeout in seconds [optional]
+        * @param int $timeout Timeout in seconds [optional]
         * @return bool Success
         */
-       public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = null );
+       public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = 10 );
 
        /**
         * Set a callback via IDatabase::setTransactionListener() on
index 95f55b6..6878712 100644 (file)
  * @file
  * @ingroup Database
  */
+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;
+use ArrayUtils;
+use DBError;
+use DBAccessError;
+use DBExpectedError;
+use DBUnexpectedError;
+use DBTransactionError;
+use DBTransactionSizeError;
+use DBConnectionError;
+use InvalidArgumentException;
+use RuntimeException;
+use Exception;
 
 /**
  * Database connection, tracking, load balancing, and transaction manager for a cluster
@@ -31,7 +52,7 @@ use Wikimedia\ScopedCallback;
 class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
        private $mServers;
-       /** @var IDatabase[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
+       /** @var \Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
        private $mConns;
        /** @var float[] Map of (server index => weight) */
        private $mLoads;
@@ -67,8 +88,8 @@ class LoadBalancer implements ILoadBalancer {
        /** @var LoggerInterface */
        protected $perfLogger;
 
-       /** @var bool|IDatabase Database connection that caused a problem */
-       private $mErrorConnection;
+       /** @var \Database Database connection that caused a problem */
+       private $errorConnection;
        /** @var integer The generic (not query grouped) replica DB index (of $mServers) */
        private $mReadIndex;
        /** @var bool|DBMasterPos False if not set */
@@ -140,7 +161,6 @@ class LoadBalancer implements ILoadBalancer {
                ];
                $this->mLoads = [];
                $this->mWaitForPos = false;
-               $this->mErrorConnection = false;
                $this->mAllowLagged = false;
 
                if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) {
@@ -194,7 +214,7 @@ class LoadBalancer implements ILoadBalancer {
                        };
 
                foreach ( [ 'replLogger', 'connLogger', 'queryLogger', 'perfLogger' ] as $key ) {
-                       $this->$key = isset( $params[$key] ) ? $params[$key] : new \Psr\Log\NullLogger();
+                       $this->$key = isset( $params[$key] ) ? $params[$key] : new NullLogger();
                }
 
                $this->host = isset( $params['hostname'] )
@@ -211,7 +231,17 @@ class LoadBalancer implements ILoadBalancer {
         */
        private function getLoadMonitor() {
                if ( !isset( $this->loadMonitor ) ) {
+                       $compat = [
+                               'LoadMonitor' => LoadMonitor::class,
+                               'LoadMonitorNull' => LoadMonitorNull::class,
+                               'LoadMonitorMySQL' => LoadMonitorMySQL::class,
+                       ];
+
                        $class = $this->loadMonitorConfig['class'];
+                       if ( isset( $compat[$class] ) ) {
+                               $class = $compat[$class];
+                       }
+
                        $this->loadMonitor = new $class(
                                $this, $this->srvCache, $this->memCache, $this->loadMonitorConfig );
                        $this->loadMonitor->setLogger( $this->replLogger );
@@ -472,10 +502,13 @@ class LoadBalancer implements ILoadBalancer {
 
                // Check if we already know that the DB has reached this point
                $server = $this->getServerName( $index );
-               $key = $this->srvCache->makeGlobalKey( __CLASS__, 'last-known-pos', $server );
+               $key = $this->srvCache->makeGlobalKey( __CLASS__, 'last-known-pos', $server, 'v1' );
                /** @var DBMasterPos $knownReachedPos */
                $knownReachedPos = $this->srvCache->get( $key );
-               if ( $knownReachedPos && $knownReachedPos->hasReached( $this->mWaitForPos ) ) {
+               if (
+                       $knownReachedPos instanceof DBMasterPos &&
+                       $knownReachedPos->hasReached( $this->mWaitForPos )
+               ) {
                        $this->replLogger->debug( __METHOD__ .
                                ": replica DB $server known to be caught up (pos >= $knownReachedPos)." );
                        return true;
@@ -703,17 +736,17 @@ class LoadBalancer implements ILoadBalancer {
                                $this->mConns['local'][$i][0] = $conn;
                        } else {
                                $this->connLogger->warning( "Failed to connect to database $i at '$serverName'." );
-                               $this->mErrorConnection = $conn;
+                               $this->errorConnection = $conn;
                                $conn = false;
                        }
                }
 
-               if ( $conn && !$conn->isOpen() ) {
+               if ( $conn instanceof IDatabase && !$conn->isOpen() ) {
                        // Connection was made but later unrecoverably lost for some reason.
                        // Do not return a handle that will just throw exceptions on use,
                        // but let the calling code (e.g. getReaderIndex) try another server.
                        // See DatabaseMyslBase::ping() for how this can happen.
-                       $this->mErrorConnection = $conn;
+                       $this->errorConnection = $conn;
                        $conn = false;
                }
 
@@ -732,7 +765,7 @@ class LoadBalancer implements ILoadBalancer {
         * it has been freed first with reuseConnection().
         *
         * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
+        * error will be available via $this->errorConnection.
         *
         * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
         *
@@ -764,7 +797,7 @@ class LoadBalancer implements ILoadBalancer {
                        if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) {
                                $this->mLastError = "Error selecting database '$dbName' on server " .
                                        $conn->getServer() . " from client host {$this->host}";
-                               $this->mErrorConnection = $conn;
+                               $this->errorConnection = $conn;
                                $conn = false;
                        } else {
                                $conn->tablePrefix( $prefix );
@@ -785,7 +818,7 @@ class LoadBalancer implements ILoadBalancer {
                        $conn = $this->reallyOpenConnection( $server, $dbName );
                        if ( !$conn->isOpen() ) {
                                $this->connLogger->warning( __METHOD__ . ": connection error for $i/$domain" );
-                               $this->mErrorConnection = $conn;
+                               $this->errorConnection = $conn;
                                $conn = false;
                        } else {
                                $conn->tablePrefix( $prefix );
@@ -795,7 +828,7 @@ class LoadBalancer implements ILoadBalancer {
                }
 
                // Increment reference count
-               if ( $conn ) {
+               if ( $conn instanceof IDatabase ) {
                        $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
                        $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
                }
@@ -893,22 +926,13 @@ class LoadBalancer implements ILoadBalancer {
         * @throws DBConnectionError
         */
        private function reportConnectionError() {
-               $conn = $this->mErrorConnection; // the connection which caused the error
+               $conn = $this->errorConnection; // the connection which caused the error
                $context = [
                        'method' => __METHOD__,
                        'last_error' => $this->mLastError,
                ];
 
-               if ( !is_object( $conn ) ) {
-                       // No last connection, probably due to all servers being too busy
-                       $this->connLogger->error(
-                               "LB failure with no last connection. Connection error: {last_error}",
-                               $context
-                       );
-
-                       // If all servers were busy, mLastError will contain something sensible
-                       throw new DBConnectionError( null, $this->mLastError );
-               } else {
+               if ( $conn instanceof IDatabase ) {
                        $context['db_server'] = $conn->getServer();
                        $this->connLogger->warning(
                                "Connection error: {last_error} ({db_server})",
@@ -917,6 +941,15 @@ class LoadBalancer implements ILoadBalancer {
 
                        // throws DBConnectionError
                        $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" );
+               } else {
+                       // No last connection, probably due to all servers being too busy
+                       $this->connLogger->error(
+                               "LB failure with no last connection. Connection error: {last_error}",
+                               $context
+                       );
+
+                       // If all servers were busy, mLastError will contain something sensible
+                       throw new DBConnectionError( null, $this->mLastError );
                }
        }
 
@@ -1336,7 +1369,7 @@ class LoadBalancer implements ILoadBalancer {
 
        /**
         * @param string $domain Domain ID, or false for the current domain
-        * @param IDatabase|null DB master connectionl used to avoid loops [optional]
+        * @param IDatabase|null $conn DB master connectionl used to avoid loops [optional]
         * @return bool
         */
        private function masterRunningReadOnly( $domain, IDatabase $conn = null ) {
@@ -1471,8 +1504,9 @@ class LoadBalancer implements ILoadBalancer {
 
        /**
         * @param IDatabase $conn
-        * @param DBMasterPos|false $pos
+        * @param DBMasterPos|bool $pos
         * @param int $timeout
+        * @return bool
         */
        public function safeWaitForMasterPos( IDatabase $conn, $pos = false, $timeout = 10 ) {
                if ( $this->getServerCount() <= 1 || !$conn->getLBInfo( 'replica' ) ) {
@@ -1571,3 +1605,5 @@ class LoadBalancer implements ILoadBalancer {
                $this->disable();
        }
 }
+
+class_alias( LoadBalancer::class, 'LoadBalancer' );
index 0a05202..b9fefda 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use InvalidArgumentException;
+
 /**
  * Trivial LoadBalancer that always returns an injected connection handle
  */
@@ -72,3 +77,5 @@ class LoadBalancerSingle extends LoadBalancer {
                return $this->db;
        }
 }
+
+class_alias( 'Wikimedia\Rdbms\LoadBalancerSingle', 'LoadBalancerSingle' );
index 14a52c5..4f6701f 100644 (file)
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerAwareInterface;
+use BagOStuff;
 
 /**
  * An interface for database load monitoring
index da4909d..5e92c33 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
+use IDatabase;
+use BagOStuff;
 
 /**
  * Basic DB load monitor with no external dependencies
@@ -49,7 +54,7 @@ class LoadMonitor implements ILoadMonitor {
                $this->parent = $lb;
                $this->srvCache = $srvCache;
                $this->mainCache = $cache;
-               $this->replLogger = new \Psr\Log\NullLogger();
+               $this->replLogger = new NullLogger();
 
                $this->movingAveRatio = isset( $options['movingAveRatio'] )
                        ? $options['movingAveRatio']
index e374794..c0db68c 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use BagOStuff;
+
 /**
  * Basic MySQL load monitor with no external dependencies
  * Uses memcached to cache the replication lag for a short time
index c4e25dc..613dac5 100644 (file)
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
+use BagOStuff;
 
 class LoadMonitorNull implements ILoadMonitor {
        public function __construct(
index 3b97835..655e771 100644 (file)
@@ -27,7 +27,7 @@ abstract class Replacer {
         * @return array
         */
        public function cb() {
-               return [ &$this, 'replace' ];
+               return [ $this, 'replace' ];
        }
 
        /**
diff --git a/includes/libs/time/ConvertibleTimestamp.php b/includes/libs/time/ConvertibleTimestamp.php
deleted file mode 100644 (file)
index c830b4e..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-<?php
-/**
- * Creation, parsing, and conversion of timestamps.
- *
- * 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.20
- * @author Tyler Romeo, 2012
- */
-
-/**
- * Library for creating, parsing, and converting timestamps. Based on the JS
- * library that does the same thing.
- *
- * @since 1.28
- */
-class ConvertibleTimestamp {
-       /**
-        * Standard gmdate() formats for the different timestamp types.
-        */
-       private static $formats = [
-               TS_UNIX => 'U',
-               TS_MW => 'YmdHis',
-               TS_DB => 'Y-m-d H:i:s',
-               TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
-               TS_ISO_8601_BASIC => 'Ymd\THis\Z',
-               TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
-               TS_RFC2822 => 'D, d M Y H:i:s',
-               TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
-               TS_POSTGRES => 'Y-m-d H:i:s',
-       ];
-
-       /**
-        * The actual timestamp being wrapped (DateTime object).
-        * @var DateTime
-        */
-       public $timestamp;
-
-       /**
-        * Make a new timestamp and set it to the specified time,
-        * or the current time if unspecified.
-        *
-        * @param bool|string|int|float|DateTime $timestamp Timestamp to set, or false for current time
-        */
-       public function __construct( $timestamp = false ) {
-               if ( $timestamp instanceof DateTime ) {
-                       $this->timestamp = $timestamp;
-               } else {
-                       $this->setTimestamp( $timestamp );
-               }
-       }
-
-       /**
-        * Set the timestamp to the specified time, or the current time if unspecified.
-        *
-        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
-        * and then store it.
-        *
-        * @param string|bool $ts Timestamp to store, or false for now
-        * @throws TimestampException
-        */
-       public function setTimestamp( $ts = false ) {
-               $m = [];
-               $da = [];
-               $strtime = '';
-
-               // We want to catch 0, '', null... but not date strings starting with a letter.
-               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) {
-                       $uts = time();
-                       $strtime = "@$uts";
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_DB
-               } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_EXIF
-               } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
-                       # TS_MW
-               } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
-                       # TS_UNIX
-                       $strtime = "@{$m[1]}"; // https://secure.php.net/manual/en/datetime.formats.compound.php
-               } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
-                       # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
-                       $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
-                               str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match(
-                       '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601
-               } elseif ( preg_match(
-                       '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601_BASIC
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-               # Day of week
-                       '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
-                       # dd Mon yyyy
-                       '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
-                       # hh:mm:ss
-                       '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
-                       $ts
-               ) ) {
-                       # TS_RFC2822, accepting a trailing comment.
-                       # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
-                       # The regex is a superset of rfc2822 for readability
-                       $strtime = strtok( $ts, ';' );
-               } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
-                       # TS_RFC850
-                       $strtime = $ts;
-               } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
-                       # asctime
-                       $strtime = $ts;
-               } else {
-                       throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
-               }
-
-               if ( !$strtime ) {
-                       $da = array_map( 'intval', $da );
-                       $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
-                       $strtime = call_user_func_array( "sprintf", $da );
-               }
-
-               try {
-                       $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
-               }
-
-               if ( $final === false ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
-               }
-
-               $this->timestamp = $final;
-       }
-
-       /**
-        * Convert a timestamp string to a given format.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @param string $ts Timestamp
-        * @return string|bool Formatted timestamp or false on failure
-        */
-       public static function convert( $style = TS_UNIX, $ts ) {
-               try {
-                       $ct = new static( $ts );
-                       return $ct->getTimestamp( $style );
-               } catch ( TimestampException $e ) {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the current time in the given format
-        *
-        * @param int $style Constant Output format for timestamp
-        * @return string
-        */
-       public static function now( $style = TS_MW ) {
-               return static::convert( $style, time() );
-       }
-
-       /**
-        * Get the timestamp represented by this object in a certain form.
-        *
-        * Convert the internal timestamp to the specified format and then
-        * return it.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @throws TimestampException
-        * @return string The formatted timestamp
-        */
-       public function getTimestamp( $style = TS_UNIX ) {
-               if ( !isset( self::$formats[$style] ) ) {
-                       throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
-               }
-
-               $output = $this->timestamp->format( self::$formats[$style] );
-
-               if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
-                       $output .= ' GMT';
-               }
-
-               if ( $style == TS_MW && strlen( $output ) !== 14 ) {
-                       throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
-                               'the specified format' );
-               }
-
-               return $output;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return $this->getTimestamp();
-       }
-
-       /**
-        * Calculate the difference between two ConvertibleTimestamp objects.
-        *
-        * @param ConvertibleTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the
-        *   difference between the two dates or false on failure
-        */
-       public function diff( ConvertibleTimestamp $relativeTo ) {
-               return $this->timestamp->diff( $relativeTo->timestamp );
-       }
-
-       /**
-        * Set the timezone of this timestamp to the specified timezone.
-        *
-        * @param string $timezone Timezone to set
-        * @throws TimestampException
-        */
-       public function setTimezone( $timezone ) {
-               try {
-                       $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
-               }
-       }
-
-       /**
-        * Get the timezone of this timestamp.
-        *
-        * @return DateTimeZone The timezone
-        */
-       public function getTimezone() {
-               return $this->timestamp->getTimezone();
-       }
-
-       /**
-        * Format the timestamp in a given format.
-        *
-        * @param string $format Pattern to format in
-        * @return string The formatted timestamp
-        */
-       public function format( $format ) {
-               return $this->timestamp->format( $format );
-       }
-}
diff --git a/includes/libs/time/TimestampException.php b/includes/libs/time/TimestampException.php
deleted file mode 100644 (file)
index 36ffdee..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-/**
- * @since 1.20
- */
-class TimestampException extends Exception {
-}
diff --git a/includes/libs/time/defines.php b/includes/libs/time/defines.php
deleted file mode 100644 (file)
index ff4dde8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/**
- * Unix time - the number of seconds since 1970-01-01 00:00:00 UTC
- */
-define( 'TS_UNIX', 0 );
-
-/**
- * MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
- */
-define( 'TS_MW', 1 );
-
-/**
- * MySQL DATETIME (YYYY-MM-DD HH:MM:SS)
- */
-define( 'TS_DB', 2 );
-
-/**
- * RFC 2822 format, for E-mail and HTTP headers
- */
-define( 'TS_RFC2822', 3 );
-
-/**
- * ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
- *
- * This is used by Special:Export
- */
-define( 'TS_ISO_8601', 4 );
-
-/**
- * An Exif timestamp (YYYY:MM:DD HH:MM:SS)
- *
- * @see http://exif.org/Exif2-2.PDF The Exif 2.2 spec, see page 28 for the
- *       DateTime tag and page 36 for the DateTimeOriginal and
- *       DateTimeDigitized tags.
- */
-define( 'TS_EXIF', 5 );
-
-/**
- * Oracle format time.
- */
-define( 'TS_ORACLE', 6 );
-
-/**
- * Postgres format time.
- */
-define( 'TS_POSTGRES', 7 );
-
-/**
- * ISO 8601 basic format with no timezone: 19860209T200000Z.  This is used by ResourceLoader
- */
-define( 'TS_ISO_8601_BASIC', 9 );
index 0d171f5..f1df7f1 100644 (file)
@@ -647,7 +647,7 @@ class XMPReader implements LoggerAwareInterface {
        private function endElementNested( $elm ) {
 
                /* cur item must be the same as $elm, unless if in MODE_STRUCT
-                  in which case it could also be rdf:Description */
+                * in which case it could also be rdf:Description */
                if ( $this->curItem[0] !== $elm
                        && !( $elm === self::NS_RDF . ' Description'
                                && $this->mode[0] === self::MODE_STRUCT )
@@ -895,7 +895,7 @@ class XMPReader implements LoggerAwareInterface {
                if ( $elm === self::NS_RDF . ' Seq' ) {
                        array_unshift( $this->mode, self::MODE_LI );
                } elseif ( $elm === self::NS_RDF . ' Bag' ) {
-                       # bug 27105
+                       # T29105
                        $this->logger->info( __METHOD__ . ' Expected an rdf:Seq, but got an rdf:Bag. Pretending'
                                . ' it is a Seq, since some buggy software is known to screw this up.' );
                        array_unshift( $this->mode, self::MODE_LI );
index 052be33..5211a2c 100644 (file)
@@ -650,7 +650,7 @@ class XMPInfo {
                                'choices' => [ '1' => true, '2' => true ],
                        ],
                        /********
-                        * Disable extracting this property (bug 31944)
+                        * Disable extracting this property (T33944)
                         * Several files have a string instead of a Seq
                         * for this property. XMPReader doesn't handle
                         * mismatched types very gracefully (it marks
@@ -658,7 +658,7 @@ class XMPInfo {
                         * the relavent prop). Since this prop
                         * doesn't communicate all that useful information
                         * just disable this prop for now, until such
-                        * XMPReader is more graceful (bug 32172)
+                        * XMPReader is more graceful (T34172)
                         * 'YCbCrSubSampling'  => array(
                         *    'map_group' => 'exif',
                         *    'mode'      => XMPReader::MODE_SEQ,
index 31eaa3b..76ae279 100644 (file)
@@ -23,6 +23,7 @@
 
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * This contains some static methods for
index 6665336..4382910 100644 (file)
@@ -544,7 +544,8 @@ class LogEventsList extends ContextSource {
         * @param string $user The user who made the log entries
         * @param array $param Associative Array with the following additional options:
         * - lim Integer Limit of items to show, default is 50
-        * - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
+        * - conds Array Extra conditions for the query
+        *   (e.g. 'log_action != ' . $dbr->addQuotes( 'revision' ))
         * - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty
         *   if set to true (default), "No matching items in log" is displayed if loglist is empty
         * - msgKey Array If you want a nice box with a message, set this to the key of the message.
index b5af783..68404bf 100644 (file)
@@ -167,7 +167,7 @@ class LogFormatter {
 
        /**
         * Even uglier hack to maintain backwards compatibilty with IRC bots
-        * (bug 34508).
+        * (T36508).
         * @see getActionText()
         * @return string Text
         */
@@ -188,7 +188,7 @@ class LogFormatter {
 
        /**
         * Even uglier hack to maintain backwards compatibilty with IRC bots
-        * (bug 34508).
+        * (T36508).
         * @see getActionText()
         * @return string Text
         */
index 68163c1..ea28ff2 100644 (file)
@@ -181,7 +181,7 @@ class LogPager extends ReverseChronologicalPager {
                } else {
                        $this->mConds['log_user'] = $userid;
                }
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
@@ -256,7 +256,7 @@ class LogPager extends ReverseChronologicalPager {
                } else {
                        $this->mConds['log_title'] = $title->getDBkey();
                }
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
index 1d0bdf6..d66e7e3 100644 (file)
@@ -316,7 +316,7 @@ class EmailNotification {
                $pageTitle = $this->title->getPrefixedText();
 
                if ( $this->oldid ) {
-                       // Always show a link to the diff which triggered the mail. See bug 32210.
+                       // Always show a link to the diff which triggered the mail. See T34210.
                        $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
                                        $this->title->getCanonicalURL( [ 'diff' => 'next', 'oldid' => $this->oldid ] ) )
                                        ->inContentLanguage()->text();
@@ -363,7 +363,7 @@ class EmailNotification {
                        Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
                );
 
-               # Replace this after transforming the message, bug 35019
+               # Replace this after transforming the message, T37019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
 
                // Now build message's subject and body
index 21effa0..3858f27 100644 (file)
@@ -103,9 +103,9 @@ class UserMailer {
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param array $options:
-        *              'replyTo' MailAddress
-        *              'contentType' string default 'text/plain; charset=UTF-8'
-        *              'headers' array Extra headers to set
+        *     'replyTo' MailAddress
+        *     'contentType' string default 'text/plain; charset=UTF-8'
+        *     'headers' array Extra headers to set
         *
         * @throws MWException
         * @throws Exception
@@ -197,9 +197,9 @@ class UserMailer {
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param array $options:
-        *              'replyTo' MailAddress
-        *              'contentType' string default 'text/plain; charset=UTF-8'
-        *              'headers' array Extra headers to set
+        *     'replyTo' MailAddress
+        *     'contentType' string default 'text/plain; charset=UTF-8'
+        *     'headers' array Extra headers to set
         *
         * @throws MWException
         * @throws Exception
index ac0564d..0f0b074 100644 (file)
@@ -150,7 +150,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        if ( $params['interlace'] ) {
                                $animation_post = [ '-interlace', 'JPEG' ];
                        }
-                       # Sharpening, see bug 6193
+                       # Sharpening, see T8193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
                                < $wgSharpenReductionThreshold
@@ -178,10 +178,10 @@ class BitmapHandler extends TransformationalImageHandler {
                                // be a total drag. :P
                                $scene = 0;
                        } elseif ( $this->isAnimatedImage( $image ) ) {
-                               // Coalesce is needed to scale animated GIFs properly (bug 1017).
+                               // Coalesce is needed to scale animated GIFs properly (T3017).
                                $animation_pre = [ '-coalesce' ];
                                // We optimize the output, but -optimize is broken,
-                               // use optimizeTransparency instead (bug 11822)
+                               // use optimizeTransparency instead (T13822)
                                if ( version_compare( $this->getMagickVersion(), "6.3.5" ) >= 0 ) {
                                        $animation_post = [ '-fuzz', '5%', '-layers', 'optimizeTransparency' ];
                                }
@@ -211,7 +211,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                && $xcfMeta['colorType'] === 'greyscale-alpha'
                                && version_compare( $this->getMagickVersion(), "6.8.9-3" ) < 0
                        ) {
-                               // bug 66323 - Greyscale images not rendered properly.
+                               // T68323 - Greyscale images not rendered properly.
                                // So only take the "red" channel.
                                $channelOnly = [ '-channel', 'R', '-separate' ];
                                $animation_pre = array_merge( $animation_pre, $channelOnly );
@@ -283,7 +283,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        $im->readImage( $params['srcPath'] );
 
                        if ( $params['mimeType'] == 'image/jpeg' ) {
-                               // Sharpening, see bug 6193
+                               // Sharpening, see T8193
                                if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                        / ( $params['srcWidth'] + $params['srcHeight'] )
                                        < $wgSharpenReductionThreshold
@@ -312,7 +312,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                        // be a total drag. :P
                                        $im->setImageScene( 0 );
                                } elseif ( $this->isAnimatedImage( $image ) ) {
-                                       // Coalesce is needed to scale animated GIFs properly (bug 1017).
+                                       // Coalesce is needed to scale animated GIFs properly (T3017).
                                        $im = $im->coalesceImages();
                                }
                                // GIF interlacing is only available since 6.3.4
index 5e8f8c8..57b5b36 100644 (file)
@@ -277,9 +277,9 @@ class DjVuImage {
                                $reg = <<<EOR
                                        /\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
                                        ((?>    # Text to match is composed of atoms of either:
-                                         \\\\. # - any escaped character
-                                         |     # - any character different from " and \
-                                         [^"\\\\]+
+                                               \\\\. # - any escaped character
+                                               |     # - any character different from " and \
+                                               [^"\\\\]+
                                        )*?)
                                        "\s*\)
                                        | # Or page can be empty ; in this case, djvutxt dumps ()
index 51a0135..f237287 100644 (file)
@@ -24,6 +24,7 @@
  * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Format Image metadata values into a human readable form.
index 6c857a8..c9f0dfa 100644 (file)
@@ -112,8 +112,8 @@ class JpegHandler extends ExifBitmapHandler {
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
 
                        /* This used to use 0 (ExifBitmapHandler::OLD_BROKEN_FILE) for the cases
-                        *      * No metadata in the file
-                        *      * Something is broken in the file.
+                        *   * No metadata in the file
+                        *   * Something is broken in the file.
                         * However, if the metadata support gets expanded then you can't tell if the 0 is from
                         * a broken file, or just no props found. A broken file is likely to stay broken, but
                         * a file which had no props could have props once the metadata support is improved.
index 2a735a2..6a23bd6 100644 (file)
@@ -762,7 +762,7 @@ abstract class MediaHandler {
         * @param string $cmd
         */
        protected function logErrorForExternalProcess( $retval, $err, $cmd ) {
-               # Keep error output limited (bug 57985)
+               # Keep error output limited (T59985)
                $errMessage = trim( substr( $err, 0, self::MAX_ERR_LOG_SIZE ) );
 
                wfDebugLog( 'thumbnail',
index 6a974c7..4087fb3 100644 (file)
@@ -86,13 +86,13 @@ class SVGReader {
                }
 
                // Expand entities, since Adobe Illustrator uses them for xmlns
-               // attributes (bug 31719). Note that libxml2 has some protection
+               // attributes (T33719). Note that libxml2 has some protection
                // against large recursive entity expansions so this is not as
                // insecure as it might appear to be. However, it is still extremely
                // insecure. It's necessary to wrap any read() calls with
                // libxml_disable_entity_loader() to avoid arbitrary local file
                // inclusion, or even arbitrary code execution if the expect
-               // extension is installed (bug 46859).
+               // extension is installed (T48859).
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
 
index de49fc3..07581d7 100644 (file)
@@ -23,6 +23,8 @@
 
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
+use \Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\LoadBalancer;
 
 /**
  * Class to store objects in the database
@@ -403,7 +405,7 @@ class SqlBagOStuff extends BagOStuff {
                                $exptime = $this->convertExpiry( $exptime );
                                $encExpiry = $db->timestamp( $exptime );
                        }
-                       // (bug 24425) use a replace if the db supports it instead of
+                       // (T26425) use a replace if the db supports it instead of
                        // delete/insert to avoid clashes with conflicting keynames
                        $db->update(
                                $tableName,
@@ -478,7 +480,7 @@ class SqlBagOStuff extends BagOStuff {
                                ], __METHOD__, 'IGNORE' );
 
                        if ( $db->affectedRows() == 0 ) {
-                               // Race condition. See bug 28611
+                               // Race condition. See T30611
                                $newValue = null;
                        }
                } catch ( DBError $e ) {
index 34ff63c..e7a906d 100644 (file)
@@ -726,7 +726,7 @@ class Article implements Page {
 
                $ns = $this->getTitle()->getNamespace();
 
-               # Don't index user and user talk pages for blocked users (bug 11443)
+               # Don't index user and user talk pages for blocked users (T13443)
                if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
                        $specificTarget = null;
                        $vagueTarget = null;
@@ -784,7 +784,7 @@ class Article implements Page {
                }
 
                if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
-                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+                       # (T16900) site config can override user-defined __INDEX__ or __NOINDEX__
                        $policy = array_merge(
                                $policy,
                                self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
@@ -1171,7 +1171,10 @@ class Article implements Page {
                $loggedIn = $this->getContext()->getUser()->isLoggedIn();
                if ( $loggedIn || $cache->get( $key ) ) {
                        $logTypes = [ 'delete', 'move' ];
-                       $conds = [ "log_action != 'revision'" ];
+
+                       $dbr = wfGetDB( DB_REPLICA );
+
+                       $conds = [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ];
                        // Give extensions a chance to hide their (unrelated) log entries
                        Hooks::run( 'Article::MissingArticleConditions', [ &$conds, $logTypes ] );
                        LogEventsList::showLogExtract(
index b60b010..f8202a6 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class for viewing MediaWiki file description pages
  *
@@ -213,7 +215,7 @@ class ImagePage extends Article {
                }
 
                $out->addModuleStyles( [
-                       'filepage', // always show the local local Filepage.css, bug 29277
+                       'filepage', // always show the local local Filepage.css, T31277
                        'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page
                ] );
        }
@@ -336,7 +338,7 @@ class ImagePage extends Article {
                        $filename = wfEscapeWikiText( $this->displayImg->getName() );
                        $linktext = $filename;
 
-                       // Use of &$this in hooks triggers warnings in PHP 7.1
+                       // Avoid PHP 7.1 warning from passing $this by reference
                        $imagePage = $this;
 
                        Hooks::run( 'ImageOpenShowImageInlineBefore', [ &$imagePage, &$out ] );
@@ -534,7 +536,7 @@ class ImagePage extends Article {
                                // this will get messy.
                                // The dirmark, however, must not be immediately adjacent
                                // to the filename, because it can get copied with it.
-                               // See bug 25277.
+                               // See T27277.
                                // @codingStandardsIgnoreStart Ignore long line
                                $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
@@ -585,6 +587,8 @@ EOT
                } else {
                        # Image does not exist
                        if ( !$this->getId() ) {
+                               $dbr = wfGetDB( DB_REPLICA );
+
                                # No article exists either
                                # Show deletion log to be consistent with normal articles
                                LogEventsList::showLogExtract(
@@ -593,7 +597,7 @@ EOT
                                        $this->getTitle()->getPrefixedText(),
                                        '',
                                        [ 'lim' => 10,
-                                               'conds' => [ "log_action != 'revision'" ],
+                                               'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                                'showIfEmpty' => false,
                                                'msgKey' => [ 'moveddeleted-notice' ]
                                        ]
diff --git a/includes/page/PageAcrhive.php b/includes/page/PageAcrhive.php
new file mode 100644 (file)
index 0000000..388e693
--- /dev/null
@@ -0,0 +1,743 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+
+/**
+ * Used to show archived pages and eventually restore them.
+ */
+class PageArchive {
+       /** @var Title */
+       protected $title;
+
+       /** @var Status */
+       protected $fileStatus;
+
+       /** @var Status */
+       protected $revisionStatus;
+
+       /** @var Config */
+       protected $config;
+
+       public function __construct( $title, Config $config = null ) {
+               if ( is_null( $title ) ) {
+                       throw new MWException( __METHOD__ . ' given a null title.' );
+               }
+               $this->title = $title;
+               if ( $config === null ) {
+                       wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
+               }
+               $this->config = $config;
+       }
+
+       public function doesWrites() {
+               return true;
+       }
+
+       /**
+        * List all deleted pages recorded in the archive table. Returns result
+        * wrapper with (ar_namespace, ar_title, count) fields, ordered by page
+        * namespace/title.
+        *
+        * @return ResultWrapper
+        */
+       public static function listAllPages() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               return self::listPages( $dbr, '' );
+       }
+
+       /**
+        * List deleted pages recorded in the archive table matching the
+        * given title prefix.
+        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
+        *
+        * @param string $prefix Title prefix
+        * @return ResultWrapper
+        */
+       public static function listPagesByPrefix( $prefix ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $title = Title::newFromText( $prefix );
+               if ( $title ) {
+                       $ns = $title->getNamespace();
+                       $prefix = $title->getDBkey();
+               } else {
+                       // Prolly won't work too good
+                       // @todo handle bare namespace names cleanly?
+                       $ns = 0;
+               }
+
+               $conds = [
+                       'ar_namespace' => $ns,
+                       'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+               ];
+
+               return self::listPages( $dbr, $conds );
+       }
+
+       /**
+        * @param IDatabase $dbr
+        * @param string|array $condition
+        * @return bool|ResultWrapper
+        */
+       protected static function listPages( $dbr, $condition ) {
+               return $dbr->select(
+                       [ 'archive' ],
+                       [
+                               'ar_namespace',
+                               'ar_title',
+                               'count' => 'COUNT(*)'
+                       ],
+                       $condition,
+                       __METHOD__,
+                       [
+                               'GROUP BY' => [ 'ar_namespace', 'ar_title' ],
+                               'ORDER BY' => [ 'ar_namespace', 'ar_title' ],
+                               'LIMIT' => 100,
+                       ]
+               );
+       }
+
+       /**
+        * List the revisions of the given page. Returns result wrapper with
+        * (ar_minor_edit, ar_timestamp, ar_user, ar_user_text, ar_comment) fields.
+        *
+        * @return ResultWrapper
+        */
+       public function listRevisions() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $tables = [ 'archive' ];
+
+               $fields = [
+                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
+                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey() ];
+
+               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
+
+               $join_conds = [];
+
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $options,
+                       ''
+               );
+
+               return $dbr->select( $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $options,
+                       $join_conds
+               );
+       }
+
+       /**
+        * List the deleted file revisions for this page, if it's a file page.
+        * Returns a result wrapper with various filearchive fields, or null
+        * if not a file page.
+        *
+        * @return ResultWrapper
+        * @todo Does this belong in Image for fuller encapsulation?
+        */
+       public function listFiles() {
+               if ( $this->title->getNamespace() != NS_FILE ) {
+                       return null;
+               }
+
+               $dbr = wfGetDB( DB_REPLICA );
+               return $dbr->select(
+                       'filearchive',
+                       ArchivedFile::selectFields(),
+                       [ 'fa_name' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'fa_timestamp DESC' ]
+               );
+       }
+
+       /**
+        * Return a Revision object containing data for the deleted revision.
+        * Note that the result *may* or *may not* have a null page ID.
+        *
+        * @param string $timestamp
+        * @return Revision|null
+        */
+       public function getRevision( $timestamp ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $fields = [
+                       'ar_rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_len',
+                       'ar_sha1',
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               $row = $dbr->selectRow( 'archive',
+                       $fields,
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ],
+                       __METHOD__ );
+
+               if ( $row ) {
+                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
+               }
+
+               return null;
+       }
+
+       /**
+        * Return the most-previous revision, either live or deleted, against
+        * the deleted revision given by timestamp.
+        *
+        * May produce unexpected results in case of history merges or other
+        * unusual time issues.
+        *
+        * @param string $timestamp
+        * @return Revision|null Null when there is no previous revision
+        */
+       public function getPreviousRevision( $timestamp ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               // Check the previous deleted revision...
+               $row = $dbr->selectRow( 'archive',
+                       'ar_timestamp',
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp < ' .
+                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
+                       __METHOD__,
+                       [
+                               'ORDER BY' => 'ar_timestamp DESC',
+                               'LIMIT' => 1 ] );
+               $prevDeleted = $row ? wfTimestamp( TS_MW, $row->ar_timestamp ) : false;
+
+               $row = $dbr->selectRow( [ 'page', 'revision' ],
+                       [ 'rev_id', 'rev_timestamp' ],
+                       [
+                               'page_namespace' => $this->title->getNamespace(),
+                               'page_title' => $this->title->getDBkey(),
+                               'page_id = rev_page',
+                               'rev_timestamp < ' .
+                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
+                       __METHOD__,
+                       [
+                               'ORDER BY' => 'rev_timestamp DESC',
+                               'LIMIT' => 1 ] );
+               $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
+               $prevLiveId = $row ? intval( $row->rev_id ) : null;
+
+               if ( $prevLive && $prevLive > $prevDeleted ) {
+                       // Most prior revision was live
+                       return Revision::newFromId( $prevLiveId );
+               } elseif ( $prevDeleted ) {
+                       // Most prior revision was deleted
+                       return $this->getRevision( $prevDeleted );
+               }
+
+               // No prior revision on this page.
+               return null;
+       }
+
+       /**
+        * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
+        *
+        * @param object $row Database row
+        * @return string
+        */
+       public function getTextFromRow( $row ) {
+               if ( is_null( $row->ar_text_id ) ) {
+                       // An old row from MediaWiki 1.4 or previous.
+                       // Text is embedded in this row in classic compression format.
+                       return Revision::getRevisionText( $row, 'ar_' );
+               }
+
+               // New-style: keyed to the text storage backend.
+               $dbr = wfGetDB( DB_REPLICA );
+               $text = $dbr->selectRow( 'text',
+                       [ 'old_text', 'old_flags' ],
+                       [ 'old_id' => $row->ar_text_id ],
+                       __METHOD__ );
+
+               return Revision::getRevisionText( $text );
+       }
+
+       /**
+        * Fetch (and decompress if necessary) the stored text of the most
+        * recently edited deleted revision of the page.
+        *
+        * If there are no archived revisions for the page, returns NULL.
+        *
+        * @return string|null
+        */
+       public function getLastRevisionText() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $row = $dbr->selectRow( 'archive',
+                       [ 'ar_text', 'ar_flags', 'ar_text_id' ],
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ar_timestamp DESC' ] );
+
+               if ( $row ) {
+                       return $this->getTextFromRow( $row );
+               }
+
+               return null;
+       }
+
+       /**
+        * Quick check if any archived revisions are present for the page.
+        *
+        * @return bool
+        */
+       public function isDeleted() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey() ],
+                       __METHOD__
+               );
+
+               return ( $n > 0 );
+       }
+
+       /**
+        * Restore the given (or all) text and file revisions for the page.
+        * Once restored, the items will be removed from the archive tables.
+        * The deletion log will be updated with an undeletion notice.
+        *
+        * This also sets Status objects, $this->fileStatus and $this->revisionStatus
+        * (depending what operations are attempted).
+        *
+        * @param array $timestamps Pass an empty array to restore all revisions,
+        *   otherwise list the ones to undelete.
+        * @param string $comment
+        * @param array $fileVersions
+        * @param bool $unsuppress
+        * @param User $user User performing the action, or null to use $wgUser
+        * @param string|string[] $tags Change tags to add to log entry
+        *   ($user should be able to add the specified tags before this is called)
+        * @return array|bool array(number of file revisions restored, number of image revisions
+        *   restored, log message) on success, false on failure.
+        */
+       public function undelete( $timestamps, $comment = '', $fileVersions = [],
+               $unsuppress = false, User $user = null, $tags = null
+       ) {
+               // If both the set of text revisions and file revisions are empty,
+               // restore everything. Otherwise, just restore the requested items.
+               $restoreAll = empty( $timestamps ) && empty( $fileVersions );
+
+               $restoreText = $restoreAll || !empty( $timestamps );
+               $restoreFiles = $restoreAll || !empty( $fileVersions );
+
+               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+                       $img = wfLocalFile( $this->title );
+                       $img->load( File::READ_LATEST );
+                       $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
+                       if ( !$this->fileStatus->isOK() ) {
+                               return false;
+                       }
+                       $filesRestored = $this->fileStatus->successCount;
+               } else {
+                       $filesRestored = 0;
+               }
+
+               if ( $restoreText ) {
+                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
+                       if ( !$this->revisionStatus->isOK() ) {
+                               return false;
+                       }
+
+                       $textRestored = $this->revisionStatus->getValue();
+               } else {
+                       $textRestored = 0;
+               }
+
+               // 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 {
+                       wfDebug( "Undelete: nothing undeleted...\n" );
+
+                       return false;
+               }
+
+               if ( trim( $comment ) != '' ) {
+                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
+               }
+
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
+
+               $logEntry = new ManualLogEntry( 'delete', 'restore' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $this->title );
+               $logEntry->setComment( $reason );
+               $logEntry->setTags( $tags );
+
+               Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
+
+               $logid = $logEntry->insert();
+               $logEntry->publish( $logid );
+
+               return [ $textRestored, $filesRestored, $reason ];
+       }
+
+       /**
+        * This is the meaty bit -- It restores archived revisions of the given page
+        * to the revision table.
+        *
+        * @param array $timestamps Pass an empty array to restore all revisions,
+        *   otherwise list the ones to undelete.
+        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+        * @param string $comment
+        * @throws ReadOnlyError
+        * @return Status Status object containing the number of revisions restored on success
+        */
+       private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
+               if ( wfReadOnly() ) {
+                       throw new ReadOnlyError();
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->startAtomic( __METHOD__ );
+
+               $restoreAll = empty( $timestamps );
+
+               # Does this page already exist? We'll have to update it...
+               $article = WikiPage::factory( $this->title );
+               # Load latest data for the current page (T33179)
+               $article->loadPageData( 'fromdbmaster' );
+               $oldcountable = $article->isCountable();
+
+               $page = $dbw->selectRow( 'page',
+                       [ 'page_id', 'page_latest' ],
+                       [ 'page_namespace' => $this->title->getNamespace(),
+                               'page_title' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'FOR UPDATE' ] // lock page
+               );
+
+               if ( $page ) {
+                       $makepage = false;
+                       # Page already exists. Import the history, and if necessary
+                       # we'll update the latest revision field in the record.
+
+                       # Get the time span of this page
+                       $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
+                               [ 'rev_id' => $page->page_latest ],
+                               __METHOD__ );
+
+                       if ( $previousTimestamp === false ) {
+                               wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
+
+                               $status = Status::newGood( 0 );
+                               $status->warning( 'undeleterevision-missing' );
+                               $dbw->endAtomic( __METHOD__ );
+
+                               return $status;
+                       }
+               } else {
+                       # Have to create a new article...
+                       $makepage = true;
+                       $previousTimestamp = 0;
+               }
+
+               $oldWhere = [
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+               ];
+               if ( !$restoreAll ) {
+                       $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
+               }
+
+               $fields = [
+                       'ar_id',
+                       'ar_rev_id',
+                       'rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_page_id',
+                       'ar_len',
+                       'ar_sha1'
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               /**
+                * Select each archived revision...
+                */
+               $result = $dbw->select(
+                       [ 'archive', 'revision' ],
+                       $fields,
+                       $oldWhere,
+                       __METHOD__,
+                       /* options */
+                       [ 'ORDER BY' => 'ar_timestamp' ],
+                       [ 'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ] ]
+               );
+
+               $rev_count = $result->numRows();
+               if ( !$rev_count ) {
+                       wfDebug( __METHOD__ . ": no revisions to restore\n" );
+
+                       $status = Status::newGood( 0 );
+                       $status->warning( "undelete-no-results" );
+                       $dbw->endAtomic( __METHOD__ );
+
+                       return $status;
+               }
+
+               // We use ar_id because there can be duplicate ar_rev_id even for the same
+               // page.  In this case, we may be able to restore the first one.
+               $restoreFailedArIds = [];
+
+               // Map rev_id to the ar_id that is allowed to use it.  When checking later,
+               // if it doesn't match, the current ar_id can not be restored.
+
+               // Value can be an ar_id or -1 (-1 means no ar_id can use it, since the
+               // rev_id is taken before we even start the restore).
+               $allowedRevIdToArIdMap = [];
+
+               $latestRestorableRow = null;
+
+               foreach ( $result as $row ) {
+                       if ( $row->ar_rev_id ) {
+                               // rev_id is taken even before we start restoring.
+                               if ( $row->ar_rev_id === $row->rev_id ) {
+                                       $restoreFailedArIds[] = $row->ar_id;
+                                       $allowedRevIdToArIdMap[$row->ar_rev_id] = -1;
+                               } else {
+                                       // rev_id is not taken yet in the DB, but it might be taken
+                                       // by a prior revision in the same restore operation. If
+                                       // not, we need to reserve it.
+                                       if ( isset( $allowedRevIdToArIdMap[$row->ar_rev_id] ) ) {
+                                               $restoreFailedArIds[] = $row->ar_id;
+                                       } else {
+                                               $allowedRevIdToArIdMap[$row->ar_rev_id] = $row->ar_id;
+                                               $latestRestorableRow = $row;
+                                       }
+                               }
+                       } else {
+                               // If ar_rev_id is null, there can't be a collision, and a
+                               // rev_id will be chosen automatically.
+                               $latestRestorableRow = $row;
+                       }
+               }
+
+               $result->seek( 0 ); // move back
+
+               $oldPageId = 0;
+               if ( $latestRestorableRow !== null ) {
+                       $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
+
+                       // grab the content to check consistency with global state before restoring the page.
+                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
+                               [
+                                       'title' => $article->getTitle(), // used to derive default content model
+                               ]
+                       );
+                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
+                       $content = $revision->getContent( Revision::RAW );
+
+                       // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
+                       $status = $content->prepareSave( $article, 0, -1, $user );
+                       if ( !$status->isOK() ) {
+                               $dbw->endAtomic( __METHOD__ );
+
+                               return $status;
+                       }
+               }
+
+               $newid = false; // newly created page ID
+               $restored = 0; // number of revisions restored
+               /** @var Revision $revision */
+               $revision = null;
+
+               // If there are no restorable revisions, we can skip most of the steps.
+               if ( $latestRestorableRow === null ) {
+                       $failedRevisionCount = $rev_count;
+               } else {
+                       if ( $makepage ) {
+                               // Check the state of the newest to-be version...
+                               if ( !$unsuppress
+                                       && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
+                               ) {
+                                       $dbw->endAtomic( __METHOD__ );
+
+                                       return Status::newFatal( "undeleterevdel" );
+                               }
+                               // Safe to insert now...
+                               $newid = $article->insertOn( $dbw, $latestRestorableRow->ar_page_id );
+                               if ( $newid === false ) {
+                                       // The old ID is reserved; let's pick another
+                                       $newid = $article->insertOn( $dbw );
+                               }
+                               $pageId = $newid;
+                       } else {
+                               // Check if a deleted revision will become the current revision...
+                               if ( $latestRestorableRow->ar_timestamp > $previousTimestamp ) {
+                                       // Check the state of the newest to-be version...
+                                       if ( !$unsuppress
+                                               && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
+                                       ) {
+                                               $dbw->endAtomic( __METHOD__ );
+
+                                               return Status::newFatal( "undeleterevdel" );
+                                       }
+                               }
+
+                               $newid = false;
+                               $pageId = $article->getId();
+                       }
+
+                       foreach ( $result as $row ) {
+                               // Check for key dupes due to needed archive integrity.
+                               if ( $row->ar_rev_id && $allowedRevIdToArIdMap[$row->ar_rev_id] !== $row->ar_id ) {
+                                       continue;
+                               }
+                               // Insert one revision at a time...maintaining deletion status
+                               // unless we are specifically removing all restrictions...
+                               $revision = Revision::newFromArchiveRow( $row,
+                                       [
+                                               'page' => $pageId,
+                                               'title' => $this->title,
+                                               'deleted' => $unsuppress ? 0 : $row->ar_deleted
+                                       ] );
+
+                               $revision->insertOn( $dbw );
+                               $restored++;
+
+                               Hooks::run( 'ArticleRevisionUndeleted',
+                                       [ &$this->title, $revision, $row->ar_page_id ] );
+                       }
+
+                       // Now that it's safely stored, take it out of the archive
+                       // Don't delete rows that we failed to restore
+                       $toDeleteConds = $oldWhere;
+                       $failedRevisionCount = count( $restoreFailedArIds );
+                       if ( $failedRevisionCount > 0 ) {
+                               $toDeleteConds[] = 'ar_id NOT IN ( ' . $dbw->makeList( $restoreFailedArIds ) . ' )';
+                       }
+
+                       $dbw->delete( 'archive',
+                               $toDeleteConds,
+                               __METHOD__ );
+               }
+
+               $status = Status::newGood( $restored );
+
+               if ( $failedRevisionCount > 0 ) {
+                       $status->warning(
+                               wfMessage( 'undeleterevision-duplicate-revid', $failedRevisionCount ) );
+               }
+
+               // Was anything restored at all?
+               if ( $restored ) {
+                       $created = (bool)$newid;
+                       // Attach the latest revision to the page...
+                       $wasnew = $article->updateIfNewerOn( $dbw, $revision );
+                       if ( $created || $wasnew ) {
+                               // Update site stats, link tables, etc
+                               $article->doEditUpdates(
+                                       $revision,
+                                       User::newFromName( $revision->getUserText( Revision::RAW ), false ),
+                                       [
+                                               'created' => $created,
+                                               'oldcountable' => $oldcountable,
+                                               'restored' => true
+                                       ]
+                               );
+                       }
+
+                       Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] );
+                       if ( $this->title->getNamespace() == NS_FILE ) {
+                               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
+                       }
+               }
+
+               $dbw->endAtomic( __METHOD__ );
+
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       public function getFileStatus() {
+               return $this->fileStatus;
+       }
+
+       /**
+        * @return Status
+        */
+       public function getRevisionStatus() {
+               return $this->revisionStatus;
+       }
+}
index 1fa4bfa..e4b524b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Special handling for file pages
  *
index 1c1412a..4bc8ad6 100644 (file)
@@ -22,6 +22,7 @@
 
 use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * Class representing a MediaWiki article and history.
@@ -151,7 +152,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return WikiPage|null
         */
        public static function newFromID( $id, $from = 'fromdb' ) {
-               // page id's are never 0 or negative, see bug 61166
+               // page ids are never 0 or negative, see T63166
                if ( $id < 1 ) {
                        return null;
                }
@@ -257,7 +258,7 @@ class WikiPage implements Page, IDBAccessObject {
                $this->mTimestamp = '';
                $this->mIsRedirect = false;
                $this->mLatest = false;
-               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+               // T59026: do not clear mPreparedEdit since prepareTextForEdit() already checks
                // the requested rev ID and content against the cached one for equality. For most
                // content types, the output should not change during the lifetime of this cache.
                // Clearing it can cause extra parses on edit for no reason.
@@ -323,7 +324,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
 
-               Hooks::run( 'ArticlePageDataAfter', [ &$this, &$row ] );
+               Hooks::run( 'ArticlePageDataAfter', [ &$wikiPage, &$row ] );
 
                return $row;
        }
@@ -424,7 +425,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
                        $this->mIsRedirect = intval( $data->page_is_redirect );
                        $this->mLatest = intval( $data->page_latest );
-                       // Bug 37225: $latest may no longer match the cached latest Revision object.
+                       // T39225: $latest may no longer match the cached latest Revision object.
                        // Double-check the ID of any cached latest Revision object for consistency.
                        if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
                                $this->mLastRevision = null;
@@ -582,12 +583,10 @@ class WikiPage implements Page, IDBAccessObject {
                $row = null;
                while ( $continue ) {
                        $row = $db->selectRow(
-                               [ 'page', 'revision' ],
+                               [ 'revision' ],
                                $revSelectFields,
                                [
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
+                                       'rev_page' => $this->getId()
                                ],
                                __METHOD__,
                                [
@@ -621,7 +620,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $this->mDataLoadedFrom == self::READ_LOCKING ) {
-                       // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always
+                       // T39225: if session S1 loads the page row FOR UPDATE, the result always
                        // includes the latest changes committed. This is true even within REPEATABLE-READ
                        // transactions, where S1 normally only sees changes committed before the first S1
                        // SELECT. Thus we need S1 to also gets the revision row FOR UPDATE; otherwise, it
@@ -1462,7 +1461,7 @@ class WikiPage implements Page, IDBAccessObject {
                                        $this->getContentHandler()->getModelID() );
                        }
 
-                       // Bug 30711: always use current version when adding a new section
+                       // T32711: always use current version when adding a new section
                        if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
                                $oldContent = $this->getContent();
                        } else {
@@ -1697,7 +1696,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        return $status;
                } elseif ( !$oldContent ) {
-                       // Sanity check for bug 37225
+                       // Sanity check for T39225
                        throw new MWException( "Could not find text for current revision {$oldid}." );
                }
 
@@ -1785,7 +1784,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $dbw->endAtomic( __METHOD__ );
                        $this->mTimestamp = $now;
                } else {
-                       // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+                       // T34948: revision ID must be set to page {{REVISIONID}} and
                        // related variables correctly. Likewise for {{REVISIONUSER}} (T135261).
                        $revision->setId( $this->getLatest() );
                        $revision->setUserIdAndName(
@@ -2025,7 +2024,7 @@ class WikiPage implements Page, IDBAccessObject {
                $user = is_null( $user ) ? $wgUser : $user;
                // XXX: check $user->getId() here???
 
-               // Use a sane default for $serialFormat, see bug 57026
+               // Use a sane default for $serialFormat, see T59026
                if ( $serialFormat === null ) {
                        $serialFormat = $content->getContentHandler()->getDefaultFormat();
                }
@@ -2197,7 +2196,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Update the links tables and other secondary data
                if ( $content ) {
-                       $recursive = $options['changed']; // bug 50785
+                       $recursive = $options['changed']; // T52785
                        $updates = $content->getSecondaryDataUpdates(
                                $this->getTitle(), null, $recursive, $editInfo->output
                        );
@@ -2299,7 +2298,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
-               } elseif ( $options['changed'] ) { // bug 50785
+               } elseif ( $options['changed'] ) { // T52785
                        self::onArticleEdit( $this->mTitle, $revision );
                }
 
@@ -2913,7 +2912,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $dbw->onTransactionPreCommitOrIdle(
                        function () use ( $dbw, $logEntry, $logid ) {
-                               // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+                               // T58776: avoid deadlocks (especially from FileDeleteForm)
                                $logEntry->publish( $logid );
                        },
                        __METHOD__
@@ -3193,7 +3192,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                // Set patrolling and bot flag on the edits, which gets rollbacked.
-               // This is done even on edit failure to have patrolling in that case (bug 62157).
+               // This is done even on edit failure to have patrolling in that case (T64157).
                $set = [];
                if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
                        // Mark all reverted edits as bot
index 395cee5..dc302a2 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * IndexPager is an efficient pager which uses a (roughly unique) index in the
  * data set to implement paging, rather than a "LIMIT offset,limit" clause.
index 6f325c9..76f3470 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Pager
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * IndexPager with a formatted navigation bar
index cbacd34..2023d13 100644 (file)
@@ -38,6 +38,7 @@ class BlockLevelPass {
        const COLON_STATE_COMMENT = 5;
        const COLON_STATE_COMMENTDASH = 6;
        const COLON_STATE_COMMENTDASHDASH = 7;
+       const COLON_STATE_LC = 8;
 
        /**
         * Make lists from lines starting with ':', '*', '#', etc.
@@ -298,7 +299,7 @@ class BlockLevelPass {
 
                                if ( $openMatch || $closeMatch ) {
                                        $pendingPTag = false;
-                                       # @todo bug 5718: paragraph closed
+                                       # @todo T7718: paragraph closed
                                        $output .= $this->closeParagraph();
                                        if ( $preOpenMatch && !$preCloseMatch ) {
                                                $this->inPre = true;
@@ -352,7 +353,7 @@ class BlockLevelPass {
                                        }
                                }
                        }
-                       # somewhere above we forget to get out of pre block (bug 785)
+                       # somewhere above we forget to get out of pre block (T2785)
                        if ( $preCloseMatch && $this->inPre ) {
                                $this->inPre = false;
                        }
@@ -389,15 +390,14 @@ class BlockLevelPass {
         * @return string The position of the ':', or false if none found
         */
        private function findColonNoLinks( $str, &$before, &$after ) {
-               $colonPos = strpos( $str, ':' );
-               if ( $colonPos === false ) {
+               if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE ) ) {
                        # Nothing to find!
                        return false;
                }
 
-               $ltPos = strpos( $str, '<' );
-               if ( $ltPos === false || $ltPos > $colonPos ) {
+               if ( $m[0][0] === ':' ) {
                        # Easy; no tag nesting to worry about
+                       $colonPos = $m[0][1];
                        $before = substr( $str, 0, $colonPos );
                        $after = substr( $str, $colonPos + 1 );
                        return $colonPos;
@@ -405,9 +405,10 @@ class BlockLevelPass {
 
                # Ugly state machine to walk through avoiding tags.
                $state = self::COLON_STATE_TEXT;
-               $level = 0;
+               $ltLevel = 0;
+               $lcLevel = 0;
                $len = strlen( $str );
-               for ( $i = 0; $i < $len; $i++ ) {
+               for ( $i = $m[0][1]; $i < $len; $i++ ) {
                        $c = $str[$i];
 
                        switch ( $state ) {
@@ -418,7 +419,7 @@ class BlockLevelPass {
                                        $state = self::COLON_STATE_TAGSTART;
                                        break;
                                case ":":
-                                       if ( $level === 0 ) {
+                                       if ( $ltLevel === 0 ) {
                                                # We found it!
                                                $before = substr( $str, 0, $i );
                                                $after = substr( $str, $i + 1 );
@@ -428,35 +429,44 @@ class BlockLevelPass {
                                        break;
                                default:
                                        # Skip ahead looking for something interesting
-                                       $colonPos = strpos( $str, ':', $i );
-                                       if ( $colonPos === false ) {
+                                       if ( !preg_match( '/:|<|-\{/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
                                                # Nothing else interesting
                                                return false;
                                        }
-                                       $ltPos = strpos( $str, '<', $i );
-                                       if ( $level === 0 ) {
-                                               if ( $ltPos === false || $colonPos < $ltPos ) {
-                                                       # We found it!
-                                                       $before = substr( $str, 0, $colonPos );
-                                                       $after = substr( $str, $colonPos + 1 );
-                                                       return $i;
-                                               }
+                                       if ( $m[0][0] === '-{' ) {
+                                               $state = self::COLON_STATE_LC;
+                                               $lcLevel++;
+                                               $i = $m[0][1] + 1;
+                                       } else {
+                                               # Skip ahead to next interesting character.
+                                               $i = $m[0][1] - 1;
                                        }
-                                       if ( $ltPos === false ) {
-                                               # Nothing else interesting to find; abort!
-                                               # We're nested, but there's no close tags left. Abort!
-                                               break 2;
+                                       break;
+                               }
+                               break;
+                       case self::COLON_STATE_LC:
+                               # In language converter markup -{ ... }-
+                               if ( !preg_match( '/-\{|\}-/', $str, $m, PREG_OFFSET_CAPTURE, $i ) ) {
+                                       # Nothing else interesting to find; abort!
+                                       # We're nested in language converter markup, but there
+                                       # are no close tags left.  Abort!
+                                       break 2;
+                               } elseif ( $m[0][0] === '-{' ) {
+                                       $i = $m[0][1] + 1;
+                                       $lcLevel++;
+                               } elseif ( $m[0][0] === '}-' ) {
+                                       $i = $m[0][1] + 1;
+                                       $lcLevel--;
+                                       if ( $lcLevel === 0 ) {
+                                               $state = self::COLON_STATE_TEXT;
                                        }
-                                       # Skip ahead to next tag start
-                                       $i = $ltPos;
-                                       $state = self::COLON_STATE_TAGSTART;
                                }
                                break;
                        case self::COLON_STATE_TAG:
                                # In a <tag>
                                switch ( $c ) {
                                case ">":
-                                       $level++;
+                                       $ltLevel++;
                                        $state = self::COLON_STATE_TEXT;
                                        break;
                                case "/":
@@ -486,10 +496,12 @@ class BlockLevelPass {
                        case self::COLON_STATE_CLOSETAG:
                                # In a </tag>
                                if ( $c === ">" ) {
-                                       $level--;
-                                       if ( $level < 0 ) {
+                                       if ( $ltLevel > 0 ) {
+                                               $ltLevel--;
+                                       } else {
+                                               # ignore the excess close tag, but keep looking for
+                                               # colons. (This matches Parsoid behavior.)
                                                wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
-                                               return false;
                                        }
                                        $state = self::COLON_STATE_TEXT;
                                }
@@ -526,8 +538,11 @@ class BlockLevelPass {
                                throw new MWException( "State machine error in " . __METHOD__ );
                        }
                }
-               if ( $level > 0 ) {
-                       wfDebug( __METHOD__ . ": Invalid input; not enough close tags (level $level, state $state)\n" );
+               if ( $ltLevel > 0 || $lcLevel > 0 ) {
+                       wfDebug(
+                               __METHOD__ . ": Invalid input; not enough close tags " .
+                               "(level $ltLevel/$lcLevel, state $state)\n"
+                       );
                        return false;
                }
                return false;
index 6aa3acc..e34d10b 100644 (file)
@@ -157,7 +157,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * urlencodes a string according to one of three patterns: (bug 22474)
+        * urlencodes a string according to one of three patterns: (T24474)
         *
         * By default (for HTTP "query" strings), spaces are encoded as '+'.
         * Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
index 08e3c77..605a873 100644 (file)
@@ -107,7 +107,7 @@ class DateFormatter {
                $this->targets[self::ISO2] = '[[y-m-d]]';
 
                # Rules
-               #            pref    source       target
+               #            pref       source      target
                $this->rules[self::DMY][self::MD] = self::DM;
                $this->rules[self::ALL][self::MD] = self::MD;
                $this->rules[self::MDY][self::DM] = self::MD;
@@ -127,7 +127,7 @@ class DateFormatter {
         * Get a DateFormatter object
         *
         * @param Language|string|null $lang In which language to format the date
-        *              Defaults to the site content language
+        *     Defaults to the site content language
         * @return DateFormatter
         */
        public static function getInstance( $lang = null ) {
@@ -197,7 +197,7 @@ class DateFormatter {
 
                        // Another horrible hack
                        $this->mLinked = $linked;
-                       $text = preg_replace_callback( $regex, [ &$this, 'replace' ], $text );
+                       $text = preg_replace_callback( $regex, [ $this, 'replace' ], $text );
                        unset( $this->mLinked );
                }
                return $text;
index e7712f2..d2a0a1a 100644 (file)
@@ -613,7 +613,7 @@ class LinkHolderArray {
        public function replaceText( $text ) {
                $text = preg_replace_callback(
                        '/<!--(LINK|IWLINK) (.*?)-->/',
-                       [ &$this, 'replaceTextCallback' ],
+                       [ $this, 'replaceTextCallback' ],
                        $text );
 
                return $text;
index 3ec0596..8db1fe3 100644 (file)
@@ -89,13 +89,15 @@ class Parser {
        # Everything except bracket, space, or control characters
        # \p{Zs} is unicode 'separator, space' category. It covers the space 0x20
        # as well as U+3000 is IDEOGRAPHIC SPACE for T21052
-       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
+       # \x{FFFD} is the Unicode replacement character, which Preprocessor_DOM
+       # uses to replace invalid HTML characters.
+       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}]';
        # Simplified expression to match an IPv4 or IPv6 address, or
        # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
-       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}])';
+       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}])';
        # RegExp to make image URLs (embeds IPv6 part of EXT_LINK_ADDR)
        // @codingStandardsIgnoreStart Generic.Files.LineLength
-       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
+       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}]+)
                \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
        // @codingStandardsIgnoreEnd
 
@@ -264,7 +266,7 @@ class Parser {
                $this->mUrlProtocols = wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
                        self::EXT_LINK_ADDR .
-                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
+                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
                } elseif ( defined( 'HPHP_VERSION' ) ) {
@@ -330,7 +332,9 @@ class Parser {
                CoreTagHooks::register( $this );
                $this->initialiseVariables();
 
-               Hooks::run( 'ParserFirstCallInit', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserFirstCallInit', [ &$parser ] );
        }
 
        /**
@@ -381,7 +385,9 @@ class Parser {
 
                $this->mProfiler = new SectionProfiler();
 
-               Hooks::run( 'ParserClearState', [ &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserClearState', [ &$parser ] );
        }
 
        /**
@@ -413,6 +419,8 @@ class Parser {
                        $text = strtr( $text, "\x7f", "?" );
                        $magicScopeVariable = $this->lock();
                }
+               // Strip U+0000 NULL (T159174)
+               $text = str_replace( "\000", '', $text );
 
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
@@ -435,11 +443,13 @@ class Parser {
                        $this->mRevisionSize = null;
                }
 
-               Hooks::run( 'ParserBeforeStrip', [ &$this, &$text, &$this->mStripState ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserBeforeStrip', [ &$parser, &$text, &$this->mStripState ] );
                # No more strip!
-               Hooks::run( 'ParserAfterStrip', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterStrip', [ &$parser, &$text, &$this->mStripState ] );
                $text = $this->internalParse( $text );
-               Hooks::run( 'ParserAfterParse', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterParse', [ &$parser, &$text, &$this->mStripState ] );
 
                $text = $this->internalParseHalfParsed( $text, true, $linestart );
 
@@ -615,8 +625,10 @@ class Parser {
         * @return string UNSAFE half-parsed HTML
         */
        public function recursiveTagParse( $text, $frame = false ) {
-               Hooks::run( 'ParserBeforeStrip', [ &$this, &$text, &$this->mStripState ] );
-               Hooks::run( 'ParserAfterStrip', [ &$this, &$text, &$this->mStripState ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserBeforeStrip', [ &$parser, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterStrip', [ &$parser, &$text, &$this->mStripState ] );
                $text = $this->internalParse( $text, false, $frame );
                return $text;
        }
@@ -663,8 +675,10 @@ class Parser {
                if ( $revid !== null ) {
                        $this->mRevisionId = $revid;
                }
-               Hooks::run( 'ParserBeforeStrip', [ &$this, &$text, &$this->mStripState ] );
-               Hooks::run( 'ParserAfterStrip', [ &$this, &$text, &$this->mStripState ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'ParserBeforeStrip', [ &$parser, &$text, &$this->mStripState ] );
+               Hooks::run( 'ParserAfterStrip', [ &$parser, &$text, &$this->mStripState ] );
                $text = $this->replaceVariables( $text, $frame );
                $text = $this->mStripState->unstripBoth( $text );
                return $text;
@@ -1259,8 +1273,11 @@ class Parser {
 
                $origText = $text;
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
                # Hook to suspend the parser in this state
-               if ( !Hooks::run( 'ParserBeforeInternalParse', [ &$this, &$text, &$this->mStripState ] ) ) {
+               if ( !Hooks::run( 'ParserBeforeInternalParse', [ &$parser, &$text, &$this->mStripState ] ) ) {
                        return $text;
                }
 
@@ -1280,16 +1297,16 @@ class Parser {
                        $text = $this->replaceVariables( $text );
                }
 
-               Hooks::run( 'InternalParseBeforeSanitize', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'InternalParseBeforeSanitize', [ &$parser, &$text, &$this->mStripState ] );
                $text = Sanitizer::removeHTMLtags(
                        $text,
-                       [ &$this, 'attributeStripCallback' ],
+                       [ $this, 'attributeStripCallback' ],
                        false,
                        array_keys( $this->mTransparentTagHooks ),
                        [],
-                       [ &$this, 'addTrackingCategory' ]
+                       [ $this, 'addTrackingCategory' ]
                );
-               Hooks::run( 'InternalParseBeforeLinks', [ &$this, &$text, &$this->mStripState ] );
+               Hooks::run( 'InternalParseBeforeLinks', [ &$parser, &$text, &$this->mStripState ] );
 
                # Tables need to come after variable replacement for things to work
                # properly; putting them before other transformations should keep
@@ -1328,8 +1345,11 @@ class Parser {
        private function internalParseHalfParsed( $text, $isMain = true, $linestart = true ) {
                $text = $this->mStripState->unstripGeneral( $text );
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
                if ( $isMain ) {
-                       Hooks::run( 'ParserAfterUnstrip', [ &$this, &$text ] );
+                       Hooks::run( 'ParserAfterUnstrip', [ &$parser, &$text ] );
                }
 
                # Clean up special characters, only run once, next-to-last before doBlockLevels
@@ -1368,7 +1388,7 @@ class Parser {
                $text = $this->mStripState->unstripNoWiki( $text );
 
                if ( $isMain ) {
-                       Hooks::run( 'ParserBeforeTidy', [ &$this, &$text ] );
+                       Hooks::run( 'ParserBeforeTidy', [ &$parser, &$text ] );
                }
 
                $text = $this->replaceTransparentTags( $text );
@@ -1409,7 +1429,7 @@ class Parser {
                }
 
                if ( $isMain ) {
-                       Hooks::run( 'ParserAfterTidy', [ &$this, &$text ] );
+                       Hooks::run( 'ParserAfterTidy', [ &$parser, &$text ] );
                }
 
                return $text;
@@ -1434,20 +1454,21 @@ class Parser {
                $spdash = "(?:-|$space)"; # a dash or a non-newline space
                $spaces = "$space++"; # possessive match of 1 or more spaces
                $text = preg_replace_callback(
-                       '!(?:                            # Start cases
-                               (<a[ \t\r\n>].*?</a>) |      # m[1]: Skip link text
-                               (<.*?>) |                    # m[2]: Skip stuff inside
-                                                            #       HTML elements' . "
-                               (\b(?i:$prots)($addr$urlChar*)) | # m[3]: Free external links
-                                                            # m[4]: Post-protocol path
-                               \b(?:RFC|PMID) $spaces       # m[5]: RFC or PMID, capture number
+                       '!(?:                        # Start cases
+                               (<a[ \t\r\n>].*?</a>) |    # m[1]: Skip link text
+                               (<.*?>) |                  # m[2]: Skip stuff inside HTML elements' . "
+                               (\b                        # m[3]: Free external links
+                                       (?i:$prots)
+                                       ($addr$urlChar*)         # m[4]: Post-protocol path
+                               ) |
+                               \b(?:RFC|PMID) $spaces     # m[5]: RFC or PMID, capture number
                                        ([0-9]+)\b |
-                               \bISBN $spaces (             # m[6]: ISBN, capture number
+                               \bISBN $spaces (           # m[6]: ISBN, capture number
                                        (?: 97[89] $spdash? )?   #  optional 13-digit ISBN prefix
                                        (?: [0-9]  $spdash? ){9} #  9 digits with opt. delimiters
                                        [0-9Xx]                  #  check digit
                                )\b
-                       )!xu", [ &$this, 'magicLinkCallback' ], $text );
+                       )!xu", [ $this, 'magicLinkCallback' ], $text );
                return $text;
        }
 
@@ -2467,7 +2488,7 @@ class Parser {
         *
         * @private
         *
-        * @param int $index
+        * @param string $index Magic variable identifier as mapped in MagicWord::$mVariableIDs
         * @param bool|PPFrame $frame
         *
         * @throws MWException
@@ -2486,18 +2507,21 @@ class Parser {
                                . ' called while parsing (no title set)' );
                }
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
                /**
                 * Some of these require message or data lookups and can be
                 * expensive to check many times.
                 */
-               if ( Hooks::run( 'ParserGetVariableValueVarCache', [ &$this, &$this->mVarCache ] ) ) {
+               if ( Hooks::run( 'ParserGetVariableValueVarCache', [ &$parser, &$this->mVarCache ] ) ) {
                        if ( isset( $this->mVarCache[$index] ) ) {
                                return $this->mVarCache[$index];
                        }
                }
 
                $ts = wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() );
-               Hooks::run( 'ParserGetVariableValueTs', [ &$this, &$ts ] );
+               Hooks::run( 'ParserGetVariableValueTs', [ &$parser, &$ts ] );
 
                $pageLang = $this->getFunctionLang();
 
@@ -2810,7 +2834,7 @@ class Parser {
                                $ret = null;
                                Hooks::run(
                                        'ParserGetVariableValueSwitch',
-                                       [ &$this, &$this->mVarCache, &$index, &$ret, &$frame ]
+                                       [ &$parser, &$this->mVarCache, &$index, &$ret, &$frame ]
                                );
 
                                return $ret;
@@ -3354,7 +3378,10 @@ class Parser {
                        throw new MWException( "Tag hook for $function is not callable\n" );
                }
 
-               $allArgs = [ &$this ];
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+
+               $allArgs = [ &$parser ];
                if ( $flags & self::SFH_OBJECT_ARGS ) {
                        # Convert arguments to PPNodes and collect for appending to $allArgs
                        $funcArgs = [];
@@ -3863,7 +3890,9 @@ class Parser {
                                        throw new MWException( "Tag hook for $name is not callable\n" );
                                }
 
-                               $output = call_user_func_array( $callback, [ &$this, $frame, $content, $attributes ] );
+                               // Avoid PHP 7.1 warning from passing $this by reference
+                               $parser = $this;
+                               $output = call_user_func_array( $callback, [ &$parser, $frame, $content, $attributes ] );
                        } else {
                                $output = '<span class="error">Invalid tag extension name: ' .
                                        htmlspecialchars( $name ) . '</span>';
@@ -4438,6 +4467,9 @@ class Parser {
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
+               // Strip U+0000 NULL (T159174)
+               $text = str_replace( "\000", '', $text );
+
                // We still normalize line endings for backwards-compatibility
                // with other code that just calls PST, but this should already
                // be handled in TextContent subclasses
@@ -4966,7 +4998,9 @@ class Parser {
                }
                $ig->setAdditionalOptions( $params );
 
-               Hooks::run( 'BeforeParserrenderImageGallery', [ &$this, &$ig ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $parser = $this;
+               Hooks::run( 'BeforeParserrenderImageGallery', [ &$parser, &$ig ] );
 
                $lines = StringUtils::explode( "\n", $text );
                foreach ( $lines as $line ) {
index 9e96540..f76c0b5 100644 (file)
@@ -223,7 +223,7 @@ class ParserCache {
 
                // The edit section preference may not be the appropiate one in
                // the ParserOutput, as we are not storing it in the parsercache
-               // key. Force it here. See bug 31445.
+               // key. Force it here. See T33445.
                $value->setEditSectionTokens( $popts->getEditSection() );
 
                $wikiPage = method_exists( $article, 'getPage' )
index 2900f41..7be8281 100644 (file)
@@ -409,7 +409,7 @@ class ParserOptions {
         * when the page is rendered based on the language of the user.
         *
         * @note When saving, this will return the default language instead of the user's.
-        * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
+        * {{int: }} uses this which used to produce inconsistent link tables (T16404).
         *
         * @return Language
         * @since 1.19
index 0c162b4..b2f99b3 100644 (file)
@@ -709,7 +709,7 @@ class ParserOutput extends CacheTime {
                        return false;
                }
 
-               // Important to parse with correct title (bug 31469)
+               // Important to parse with correct title (T33469)
                $cat = wfMessage( $msg )
                        ->title( $title )
                        ->inContentLanguage()
index 661318b..b93c617 100644 (file)
@@ -134,7 +134,7 @@ class Preprocessor_DOM extends Preprocessor {
         *                                is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
-        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
         *
         * Any flag added to the $flags parameter here, or any other parameter liable to cause a
         * change in the DOM tree for a given text, must be passed through the section identifier
index 2666c93..b2e9531 100644 (file)
@@ -107,7 +107,7 @@ class Preprocessor_Hash extends Preprocessor {
         *                                 included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
-        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+        * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
         *
         * Any flag added to the $flags parameter here, or any other parameter liable to cause a
         * change in the DOM tree for a given text, must be passed through the section identifier
index 534e86b..1f1add7 100644 (file)
@@ -129,7 +129,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        return false;
                }
 
-               // Reduce effects of race conditions for slow parses (bug 46014)
+               // Reduce effects of race conditions for slow parses (T48014)
                $cacheTime = wfTimestampNow();
 
                $time = - microtime( true );
index 8b4f01a..252a227 100644 (file)
@@ -22,6 +22,7 @@
  * @defgroup Profiler Profiler
  */
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\TransactionProfiler;
 
 /**
  * Profiler base class that defines the interface and some trivial
index 088721c..264ec0c 100644 (file)
@@ -41,7 +41,7 @@ class ProfilerOutputDb extends ProfilerOutput {
        }
 
        public function canUse() {
-               # Do not log anything if database is readonly (bug 5375)
+               # Do not log anything if database is readonly (T7375)
                return !wfReadOnly();
        }
 
diff --git a/includes/rcfeed/FormattedRCFeed.php b/includes/rcfeed/FormattedRCFeed.php
new file mode 100644 (file)
index 0000000..48a9f94
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Base class for RC feed engines that send messages in a freely configurable
+ * format to a uri-addressed engine set in $wgRCEngines.
+ * @since 1.29
+ */
+abstract class FormattedRCFeed extends RCFeed {
+       private $params;
+
+       /**
+        * @param array $params
+        *  - 'uri'
+        *  - 'formatter'
+        * @see $wgRCFeeds
+        */
+       public function __construct( array $params = [] ) {
+               $this->params = $params;
+       }
+
+       /**
+        * Send some text to the specified feed.
+        *
+        * @param array $feed The feed, as configured in an associative array
+        * @param string $line The text to send
+        * @return bool Success
+        */
+       abstract public function send( array $feed, $line );
+
+       /**
+        * @param RecentChange $rc
+        * @param string|null $actionComment
+        * @return bool Success
+        */
+       public function notify( RecentChange $rc, $actionComment = null ) {
+               $params = $this->params;
+               /** @var $formatter RCFeedFormatter */
+               $formatter = is_object( $params['formatter'] ) ? $params['formatter'] : new $params['formatter'];
+
+               $line = $formatter->getLine( $params, $rc, $actionComment );
+               if ( !$line ) {
+                       // @codeCoverageIgnoreStart
+                       // T109544 - If a feed formatter returns null, this will otherwise cause an
+                       // error in at least RedisPubSubFeedEngine. Not sure best to handle this.
+                       return;
+                       // @codeCoverageIgnoreEnd
+               }
+               return $this->send( $params, $line );
+       }
+}
diff --git a/includes/rcfeed/RCFeed.php b/includes/rcfeed/RCFeed.php
new file mode 100644 (file)
index 0000000..284f68a
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @see $wgRCFeeds
+ * @since 1.29
+ */
+abstract class RCFeed {
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params = [] ) {
+       }
+
+       /**
+        * Dispatch the recent changes notification.
+        *
+        * @param RecentChange $rc
+        * @param string|null $actionComment
+        * @return bool Success
+        */
+       abstract public function notify( RecentChange $rc, $actionComment = null );
+
+       /**
+        * @param array $params
+        * @return RCFeed
+        * @throws Exception
+        */
+       final public static function factory( array $params ) {
+               if ( !isset( $params['class'] ) ) {
+                       if ( !isset( $params['uri'] ) ) {
+                               throw new Exception( "RCFeeds must have a 'class' or 'uri' set." );
+                       }
+                       return RecentChange::getEngine( $params['uri'], $params );
+               }
+               $class = $params['class'];
+               if ( !class_exists( $class ) ) {
+                       throw new Exception( "Unknown class '$class'." );
+               }
+               return new $class( $params );
+       }
+}
index 0b0cd86..49436fa 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 /**
- * Interface for RC feed engines, which send formatted notifications
- *
+ * Backward-compatibility alias.
  * @since 1.22
+ * @deprecated since 1.29 Use FormattedRCFeed instead
  */
-interface RCFeedEngine {
-       /**
-        * Sends some text to the specified live feed.
-        *
-        * @see IRCColourfulRCFeedFormatter::cleanupForIRC
-        * @param array $feed The feed, as configured in an associative array
-        * @param string $line The text to send
-        * @return bool Success
-        */
-       public function send( array $feed, $line );
+abstract class RCFeedEngine extends FormattedRCFeed {
 }
index c10e959..4c011be 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +19,7 @@
  */
 
 /**
- * Emit a recent change notification via Redis Pub/Sub
+ * Send recent change notifications via Redis Pub/Sub
  *
  * If the feed URI contains a path component, it will be used to generate a
  * channel name by stripping the leading slash and replacing any remaining
  *
  * @since 1.22
  */
-class RedisPubSubFeedEngine implements RCFeedEngine {
+class RedisPubSubFeedEngine extends RCFeedEngine {
 
        /**
-        * @see RCFeedEngine::send
+        * @see FormattedRCFeed::send
         */
        public function send( array $feed, $line ) {
                $parsed = wfParseUrl( $feed['uri'] );
index 9afae66..61ced5f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 /**
- * Sends the notification to the specified host in a UDP packet.
+ * Send recent change notifications in a UDP packet.
  * @since 1.22
  */
-
-class UDPRCFeedEngine implements RCFeedEngine {
+class UDPRCFeedEngine extends RCFeedEngine {
        /**
         * @see RCFeedEngine::send
         */
index a4100bb..210deb1 100644 (file)
@@ -23,11 +23,11 @@ interface Processor {
 
        /**
         * @return array With following keys:
-        *              'globals' - variables to be set to $GLOBALS
-        *              'defines' - constants to define
-        *              'callbacks' - functions to be executed by the registry
-        *              'credits' - metadata to be stored by registry
-        *              'attributes' - registration info which isn't a global variable
+        *     'globals' - variables to be set to $GLOBALS
+        *     'defines' - constants to define
+        *     'callbacks' - functions to be executed by the registry
+        *     'credits' - metadata to be stored by registry
+        *     'attributes' - registration info which isn't a global variable
         */
        public function getExtractedInfo();
 
index 5aaaa1b..a31551c 100644 (file)
@@ -87,17 +87,17 @@ class VersionChecker {
         * installed extensions in the $credits array.
         *
         * Example $extDependencies:
-        *      {
-        *              'FooBar' => {
-        *                      'MediaWiki' => '>= 1.25.0',
-        *                      'extensions' => {
-        *                              'FooBaz' => '>= 1.25.0'
-        *                      },
-        *                      'skins' => {
-        *                              'BazBar' => '>= 1.0.0'
-        *                      }
-        *              }
-        *      }
+        *     {
+        *       'FooBar' => {
+        *         'MediaWiki' => '>= 1.25.0',
+        *         'extensions' => {
+        *           'FooBaz' => '>= 1.25.0'
+        *         },
+        *         'skins' => {
+        *           'BazBar' => '>= 1.0.0'
+        *         }
+        *       }
+        *     }
         *
         * @param array $extDependencies All extensions that depend on other ones
         * @return array
index f0b48d5..717fb45 100644 (file)
@@ -255,7 +255,10 @@ class ResourceLoader implements LoggerAwareInterface {
                $this->register( include "$IP/resources/ResourcesOOUI.php" );
                // Register extension modules
                $this->register( $config->get( 'ResourceModules' ) );
-               Hooks::run( 'ResourceLoaderRegisterModules', [ &$this ] );
+
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $rl = $this;
+               Hooks::run( 'ResourceLoaderRegisterModules', [ &$rl ] );
 
                if ( $config->get( 'EnableJavaScriptTest' ) === true ) {
                        $this->registerTestModules();
@@ -404,7 +407,9 @@ class ResourceLoader implements LoggerAwareInterface {
                $testModules = [];
                $testModules['qunit'] = [];
                // Get other test suites (e.g. from extensions)
-               Hooks::run( 'ResourceLoaderTestModules', [ &$testModules, &$this ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $rl = $this;
+               Hooks::run( 'ResourceLoaderTestModules', [ &$testModules, &$rl ] );
 
                // Add the testrunner (which configures QUnit) to the dependencies.
                // Since it must be ready before any of the test suites are executed.
@@ -709,7 +714,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        $module = $this->getModule( $name );
                        if ( $module ) {
                                // Do not allow private modules to be loaded from the web.
-                               // This is a security issue, see bug 34907.
+                               // This is a security issue, see T36907.
                                if ( $module->getGroup() === 'private' ) {
                                        $this->logger->debug( "Request for private module '$name' denied" );
                                        $this->errors[] = "Cannot show private module \"$name\"";
@@ -813,6 +818,7 @@ class ResourceLoader implements LoggerAwareInterface {
         * @return void
         */
        protected function sendResponseHeaders( ResourceLoaderContext $context, $etag, $errors ) {
+               \MediaWiki\HeaderCallback::warnIfHeadersSent();
                $rlMaxage = $this->config->get( 'ResourceLoaderMaxage' );
                // Use a short cache expiry so that updates propagate to clients quickly, if:
                // - No version specified (shared resources, e.g. stylesheets)
@@ -1211,7 +1217,7 @@ MESSAGE;
                        $styles = (array)$styles;
                        foreach ( $styles as $style ) {
                                $style = trim( $style );
-                               // Don't output an empty "@media print { }" block (bug 40498)
+                               // Don't output an empty "@media print { }" block (T42498)
                                if ( $style !== '' ) {
                                        // Transform the media type based on request params and config
                                        // The way that this relies on $wgRequest to propagate request params is slightly evil
@@ -1628,7 +1634,7 @@ MESSAGE;
         */
        public function getLessCompiler( $extraVars = [] ) {
                // When called from the installer, it is possible that a required PHP extension
-               // is missing (at least for now; see bug 47564). If this is the case, throw an
+               // is missing (at least for now; see T49564). If this is the case, throw an
                // exception (caught by the installer) to prevent a fatal error later on.
                if ( !class_exists( 'Less_Parser' ) ) {
                        throw new MWException( 'MediaWiki requires the less.php parser' );
index ef2827c..8c792ad 100644 (file)
@@ -365,7 +365,11 @@ class ResourceLoaderClientHtml {
                $rl = $mainContext->getResourceLoader();
                $chunks = [];
 
+               // Sort module names so requests are more uniform
+               sort( $modules );
+
                if ( $mainContext->getDebug() && count( $modules ) > 1 ) {
+
                        $chunks = [];
                        // Recursively call us for every item
                        foreach ( $modules as $name ) {
@@ -374,8 +378,6 @@ class ResourceLoaderClientHtml {
                        return new WrappedStringList( "\n", $chunks );
                }
 
-               // Sort module names so requests are more uniform
-               sort( $modules );
                // Create keyed-by-source and then keyed-by-group list of module objects from modules list
                $sortedModules = [];
                foreach ( $modules as $name ) {
@@ -415,7 +417,7 @@ class ResourceLoaderClientHtml {
                                // Special handling for the user group; because users might change their stuff
                                // on-wiki like user pages, or user preferences; we need to find the highest
                                // timestamp of these user-changeable modules so we can ensure cache misses on change
-                               // This should NOT be done for the site group (bug 27564) because anons get that too
+                               // This should NOT be done for the site group (T29564) because anons get that too
                                // and we shouldn't be putting timestamps in CDN-cached HTML
                                if ( $group === 'user' ) {
                                        // Must setModules() before makeVersionQuery()
index a1a89cb..8955b8c 100644 (file)
@@ -197,7 +197,7 @@ class ResourceLoaderContext {
                if ( $this->direction === null ) {
                        $this->direction = $this->getRequest()->getRawVal( 'dir' );
                        if ( !$this->direction ) {
-                               // Determine directionality based on user language (bug 6100)
+                               // Determine directionality based on user language (T8100)
                                $this->direction = Language::factory( $this->getLanguage() )->getDir();
                        }
                }
index 8124f33..d4dabe7 100644 (file)
@@ -461,29 +461,47 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @param array $localFileRefs List of files
         */
        protected function saveFileDependencies( ResourceLoaderContext $context, $localFileRefs ) {
-               // Normalise array
-               $localFileRefs = array_values( array_unique( $localFileRefs ) );
-               sort( $localFileRefs );
 
                try {
+                       // Related bugs and performance considerations:
+                       // 1. Don't needlessly change the database value with the same list in a
+                       //    different order or with duplicates.
+                       // 2. Use relative paths to avoid ghost entries when $IP changes. (T111481)
+                       // 3. Don't needlessly replace the database with the same value
+                       //    just because $IP changed (e.g. when upgrading a wiki).
+                       // 4. Don't create an endless replace loop on every request for this
+                       //    module when '../' is used anywhere. Even though both are expanded
+                       //    (one expanded by getFileDependencies from the DB, the other is
+                       //    still raw as originally read by RL), the latter has not
+                       //    been normalized yet.
+
+                       // Normalise
+                       $localFileRefs = array_values( array_unique( $localFileRefs ) );
+                       sort( $localFileRefs );
+                       $localPaths = self::getRelativePaths( $localFileRefs );
+
+                       $storedPaths = self::getRelativePaths( $this->getFileDependencies( $context ) );
                        // If the list has been modified since last time we cached it, update the cache
-                       if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                       if ( $localPaths !== $storedPaths ) {
+                               $vary = $context->getSkin() . '|' . $context->getLanguage();
                                $cache = ObjectCache::getLocalClusterInstance();
-                               $key = $cache->makeKey( __METHOD__, $this->getName() );
+                               $key = $cache->makeKey( __METHOD__, $this->getName(), $vary );
                                $scopeLock = $cache->getScopedLock( $key, 0 );
                                if ( !$scopeLock ) {
                                        return; // T124649; avoid write slams
                                }
 
-                               $vary = $context->getSkin() . '|' . $context->getLanguage();
+                               $deps = FormatJson::encode( $localPaths );
                                $dbw = wfGetDB( DB_MASTER );
-                               $dbw->replace( 'module_deps',
-                                       [ [ 'md_module', 'md_skin' ] ],
+                               $dbw->upsert( 'module_deps',
                                        [
                                                'md_module' => $this->getName(),
                                                'md_skin' => $vary,
-                                               // Use relative paths to avoid ghost entries when $IP changes (T111481)
-                                               'md_deps' => FormatJson::encode( self::getRelativePaths( $localFileRefs ) ),
+                                               'md_deps' => $deps,
+                                       ],
+                                       [ 'md_module', 'md_skin' ],
+                                       [
+                                               'md_deps' => $deps,
                                        ]
                                );
 
@@ -633,7 +651,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                        && substr( rtrim( $scripts ), -1 ) !== ';'
                                ) {
                                        // Append semicolon to prevent weird bugs caused by files not
-                                       // terminating their statements right (bug 27054)
+                                       // terminating their statements right (T29054)
                                        $scripts .= ";\n";
                                }
                        }
@@ -644,7 +662,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                if ( $context->shouldIncludeStyles() ) {
                        $styles = [];
                        // Don't create empty stylesheets like [ '' => '' ] for modules
-                       // that don't *have* any stylesheets (bug 38024).
+                       // that don't *have* any stylesheets (T40024).
                        $stylePairs = $this->getStyles( $context );
                        if ( count( $stylePairs ) ) {
                                // If we are in debug mode without &only= set, we'll want to return an array of URLs
index a99305c..48e4a0d 100644 (file)
@@ -82,7 +82,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgSearchType' => $conf->get( 'SearchType' ),
                        'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ),
                        // Force object to avoid "empty" associative array from
-                       // becoming [] instead of {} in JS (bug 34604)
+                       // becoming [] instead of {} in JS (T36604)
                        'wgActionPaths' => (object)$conf->get( 'ActionPaths' ),
                        'wgServer' => $conf->get( 'Server' ),
                        'wgServerName' => $conf->get( 'ServerName' ),
index 14d6e05..b0d060b 100644 (file)
@@ -268,7 +268,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return true;
                }
 
-               // Bug 68488: For other modules (i.e. ones that are called in cached html output) only check
+               // T70488: For other modules (i.e. ones that are called in cached html output) only check
                // page existance. This ensures that, if some pages in a module are temporarily blanked,
                // we don't end omit the module's script or link tag on some pages.
                return count( $revisions ) === 0;
@@ -357,6 +357,11 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        }
                }
 
+               if ( !$wikiModules ) {
+                       // Nothing to preload
+                       return;
+               }
+
                $pageNames = array_keys( $allPages );
                sort( $pageNames );
                $hash = sha1( implode( '|', $pageNames ) );
index 833e38b..64a6aec 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Abstract base class for a list of deletable items. The list class
  * needs to be able to make a query from a set of identifiers to pull
@@ -255,7 +257,8 @@ abstract class RevDelList extends RevisionListBase {
                $status->merge( $this->doPreCommitUpdates() );
                if ( !$status->isOK() ) {
                        // Fatal error, such as no configured archive directory or I/O failures
-                       wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
+                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                       $lbFactory->rollbackMasterChanges( __METHOD__ );
                        return $status;
                }
 
index f0b1907..453c6cc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * List for revision table items
  *
index 8a06b65..910fd77 100644 (file)
@@ -93,7 +93,7 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField {
        public function merge( SearchIndexField $that ) {
                // TODO: which definitions may be compatible?
                if ( ( $that instanceof self ) && $this->type === $that->type &&
-                    $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
+                       $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
                ) {
                        return $that;
                }
index c3985d1..53d09e8 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This class is used for different SQL-based search engines shipped with MediaWiki
  * @ingroup Search
index 0041450..7cc8509 100644 (file)
@@ -773,7 +773,8 @@ final class SessionManager implements SessionManagerInterface {
                                        return $failHandler();
                                }
                        } elseif ( !$info->getUserInfo()->isVerified() ) {
-                               $this->logger->warning(
+                               // probably just a session timeout
+                               $this->logger->info(
                                        'Session "{session}": Unverified user provided and no metadata to auth it',
                                        [
                                                'session' => $info,
index 3ab0f43..c6990fe 100644 (file)
@@ -91,9 +91,9 @@ interface SessionManagerInterface extends LoggerAwareInterface {
         *
         * The return value is such that someone could theoretically do this:
         * @code
-        *  foreach ( $provider->getVaryHeaders() as $header => $options ) {
-        *      $outputPage->addVaryHeader( $header, $options );
-        *  }
+        * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+        *   $outputPage->addVaryHeader( $header, $options );
+        * }
         * @endcode
         *
         * @return array
index 61c7500..e8d81cb 100644 (file)
@@ -397,9 +397,9 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         *
         * The return value is such that someone could theoretically do this:
         * @code
-        *  foreach ( $provider->getVaryHeaders() as $header => $options ) {
-        *      $outputPage->addVaryHeader( $header, $options );
-        *  }
+        * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+        *   $outputPage->addVaryHeader( $header, $options );
+        * }
         * @endcode
         *
         * @protected For use by \MediaWiki\Session\SessionManager only
index e5247f2..e106f37 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * Represents the site configuration of a wiki.
  * Holds a list of sites (ie SiteList), stored in the database.
index 6a97a50..28f19f9 100644 (file)
@@ -463,6 +463,9 @@ class Site implements Serializable {
         * @param string $languageCode
         */
        public function setLanguageCode( $languageCode ) {
+               if ( !Language::isValidCode( $languageCode ) ) {
+                       throw new InvalidArgumentException( "$languageCode is not a valid language code." );
+               }
                $this->languageCode = $languageCode;
        }
 
index 65eb9b7..e571c58 100644 (file)
@@ -112,7 +112,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        $toolbox['info']['id'] = 't-info';
                }
 
-               Hooks::run( 'BaseTemplateToolbox', [ &$this, &$toolbox ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $template = $this;
+               Hooks::run( 'BaseTemplateToolbox', [ &$template, &$toolbox ] );
                return $toolbox;
        }
 
@@ -227,7 +229,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        ob_start();
                        // We pass an extra 'true' at the end so extensions using BaseTemplateToolbox
                        // can abort and avoid outputting double toolbox links
-                       Hooks::run( 'SkinTemplateToolboxEnd', [ &$this, true ] );
+                       // Avoid PHP 7.1 warning from passing $this by reference
+                       $template = $this;
+                       Hooks::run( 'SkinTemplateToolboxEnd', [ &$template, true ] );
                        $hookContents = ob_get_contents();
                        ob_end_clean();
                        if ( !trim( $hookContents ) ) {
@@ -320,12 +324,12 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * If a "data" key is present, it must be an array, where the keys represent
         * the data-xxx properties with their provided values. For example,
-        *  $item['data'] = [
-        *       'foo' => 1,
-        *       'bar' => 'baz',
-        *  ];
+        *     $item['data'] = [
+        *       'foo' => 1,
+        *       'bar' => 'baz',
+        *     ];
         * will render as element properties:
-        *  data-foo='1' data-bar='baz'
+        *     data-foo='1' data-bar='baz'
         *
         * @param array $options Can be used to affect the output of a link.
         * Possible options are:
@@ -644,7 +648,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * @since 1.25
         */
        public function getIndicators() {
-               $out = "<div class=\"mw-indicators\">\n";
+               $out = "<div class=\"mw-indicators mw-body-content\">\n";
                foreach ( $this->data['indicators'] as $id => $content ) {
                        $out .= Html::rawElement(
                                'div',
index 96812ea..a7740a0 100644 (file)
@@ -381,7 +381,7 @@ abstract class Skin extends ContextSource {
 
                if ( $title->isSpecialPage() ) {
                        $type = 'ns-special';
-                       // bug 23315: provide a class based on the canonical special page name without subpages
+                       // T25315: provide a class based on the canonical special page name without subpages
                        list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
                        if ( $canonicalName ) {
                                $type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" );
@@ -906,7 +906,10 @@ abstract class Skin extends ContextSource {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
                        if ( $url ) {
-                               $html = Html::rawElement( 'a', [ "href" => $url ], $html );
+                               global $wgExternalLinkTarget;
+                               $html = Html::rawElement( 'a',
+                                       [ "href" => $url, "target" => $wgExternalLinkTarget ],
+                                       $html );
                        }
                }
                return $html;
@@ -1283,7 +1286,7 @@ abstract class Skin extends ContextSource {
                                        $line = array_map( 'trim', explode( '|', $line, 2 ) );
                                        if ( count( $line ) !== 2 ) {
                                                // Second sanity check, could be hit by people doing
-                                               // funky stuff with parserfuncs... (bug 33321)
+                                               // funky stuff with parserfuncs... (T35321)
                                                continue;
                                        }
 
@@ -1538,7 +1541,7 @@ abstract class Skin extends ContextSource {
 
                $attribs = [];
                if ( !is_null( $tooltip ) ) {
-                       # Bug 25462: undo double-escaping.
+                       # T27462: undo double-escaping.
                        $tooltip = Sanitizer::decodeCharReferences( $tooltip );
                        $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
                                ->inLanguage( $lang )->text();
index bc6dfca..780fac4 100644 (file)
@@ -582,7 +582,7 @@ class SkinTemplate extends Skin {
                /* set up the default links for the personal toolbar */
                $personal_urls = [];
 
-               # Due to bug 32276, if a user does not have read permissions,
+               # Due to T34276, if a user does not have read permissions,
                # $this->getTitle() will just give Special:Badtitle, which is
                # not especially useful as a returnto parameter. Use the title
                # from the request instead, if there was one.
@@ -663,7 +663,7 @@ class SkinTemplate extends Skin {
                                        'text' => $this->msg( 'pt-userlogout' )->text(),
                                        'href' => self::makeSpecialUrl( 'Userlogout',
                                                // userlogout link must always contain an & character, otherwise we might not be able
-                                               // to detect a buggy precaching proxy (bug 17790)
+                                               // to detect a buggy precaching proxy (T19790)
                                                $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto ),
                                        'active' => false
                                ];
@@ -1120,7 +1120,7 @@ class SkinTemplate extends Skin {
                        $content_navigation['namespaces']['special'] = [
                                'class' => 'selected',
                                'text' => $this->msg( 'nstab-special' )->text(),
-                               'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510
+                               'href' => $request->getRequestURL(), // @see: T4457, T4510
                                'context' => 'subject'
                        ];
 
index 00439a1..f62b302 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Special page which uses a ChangesList to show query results.
@@ -311,7 +312,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        $operator = $opts['invert'] ? '!=' : '=';
                        $boolean = $opts['invert'] ? 'AND' : 'OR';
 
-                       // Namespace association (bug 2429)
+                       // Namespace association (T4429)
                        if ( !$opts['associated'] ) {
                                $condition = "rc_namespace $operator $selectedNS";
                        } else {
index c4e53ee..bafee65 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
  * suited for reports generating images
index c3ee321..5c048a2 100644 (file)
@@ -177,7 +177,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
                # 1. When switching accounts, it sucks to get automatically logged out
                # 2. Do not return to PasswordReset after a successful password change
-               #    but goto Wiki start page (Main_Page) instead ( bug 33997 )
+               #    but goto Wiki start page (Main_Page) instead ( T35997 )
                $returnToTitle = Title::newFromText( $this->mReturnTo );
                if ( is_object( $returnToTitle )
                        && ( $returnToTitle->isSpecial( 'Userlogout' )
@@ -702,7 +702,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         */
        protected function getFakeTemplate( $msg, $msgType ) {
                global $wgAuth, $wgEnableEmail, $wgHiddenPrefs, $wgEmailConfirmToEdit, $wgEnableUserEmail,
-                          $wgSecureLogin, $wgPasswordResetRoutes;
+                       $wgSecureLogin, $wgPasswordResetRoutes;
 
                // make a best effort to get the value of fields which used to be fixed in the old login
                // template but now might or might not exist depending on what providers are used
@@ -727,7 +727,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $user = $this->getUser();
                $template = new FakeAuthTemplate();
 
-               // Pre-fill username (if not creating an account, bug 44775).
+               // Pre-fill username (if not creating an account, T46775).
                if ( $data->mUsername == '' && $this->isSignup() ) {
                        if ( $user->isLoggedIn() ) {
                                $data->mUsername = $user->getName();
@@ -772,7 +772,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $resetLink = $this->isSignup()
                        ? null
                        : is_array( $wgPasswordResetRoutes )
-                         && in_array( true, array_values( $wgPasswordResetRoutes ), true );
+                               && in_array( true, array_values( $wgPasswordResetRoutes ), true );
 
                $template->set( 'header', '' );
                $template->set( 'formheader', '' );
index 3bb3f85..45cef2b 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
  *
index 3592500..40f82f5 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a class for doing query pages; since they're almost all the same,
  * we factor out some of the functionality into a superclass, and let
@@ -322,7 +324,7 @@ abstract class QueryPage extends SpecialPage {
                                                        $value = wfTimestamp( TS_UNIX,
                                                                $row->value );
                                                } else {
-                                                       $value = intval( $row->value ); // @bug 14414
+                                                       $value = intval( $row->value ); // T16414
                                                }
                                        } else {
                                                $value = 0;
index daabded..33e1cc3 100644 (file)
@@ -346,7 +346,7 @@ class SpecialPageFactory {
                        return [ null, null ];
                }
 
-               if ( !isset( $bits[1] ) ) { // bug 2087
+               if ( !isset( $bits[1] ) ) { // T4087
                        $par = null;
                } else {
                        $par = $bits[1];
@@ -512,7 +512,7 @@ class SpecialPageFactory {
                // @todo FIXME: Redirects broken due to this call
                $bits = explode( '/', $title->getDBkey(), 2 );
                $name = $bits[0];
-               if ( !isset( $bits[1] ) ) { // bug 2087
+               if ( !isset( $bits[1] ) ) { // T4087
                        $par = null;
                } else {
                        $par = $bits[1];
index 00fca12..9d92cbd 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class definition for a wanted query page like
  * WantedPages, WantedTemplates, etc
index c18ae0e..04c04b2 100644 (file)
@@ -64,7 +64,7 @@ class SpecialBlock extends FormSpecialPage {
        protected function checkExecutePermissions( User $user ) {
                parent::checkExecutePermissions( $user );
 
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                $status = self::checkUnblockSelf( $this->target, $user );
                if ( $status !== true ) {
                        throw new ErrorPageError( 'badaccess', $status );
@@ -275,7 +275,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        // If the username was hidden (ipb_deleted == 1), don't show the reason
-                       // unless this user also has rights to hideuser: Bug 35839
+                       // unless this user also has rights to hideuser: T37839
                        if ( !$block->mHideName || $this->getUser()->isAllowed( 'hideuser' ) ) {
                                $fields['Reason']['default'] = $block->mReason;
                        } else {
@@ -744,7 +744,7 @@ class SpecialBlock extends FormSpecialPage {
                        $blockNotConfirmed = !$data['Confirm'] || ( array_key_exists( 'PreviousTarget', $data )
                                && $data['PreviousTarget'] !== $target );
 
-                       # Special case for API - bug 32434
+                       # Special case for API - T34434
                        $reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
 
                        # Show form unless the user is already aware of this...
@@ -824,7 +824,7 @@ class SpecialBlock extends FormSpecialPage {
                $logEntry->setComment( $data['Reason'][0] );
                $logEntry->setPerformer( $performer );
                $logEntry->setParameters( $logParams );
-               # Relate log ID to block IDs (bug 25763)
+               # Relate log ID to block IDs (T27763)
                $blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
                $logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
                $logId = $logEntry->insert();
@@ -902,7 +902,7 @@ class SpecialBlock extends FormSpecialPage {
        }
 
        /**
-        * bug 15810: blocked admins should not be able to block/unblock
+        * T17810: blocked admins should not be able to block/unblock
         * others, and probably shouldn't be able to unblock themselves
         * either.
         * @param User|int|string $user
index b730ecd..9aba41e 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page listing redirects to non existent page. Those should be
  * fixed to point to an existing page.
index 766de1b..1028002 100644 (file)
@@ -359,7 +359,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                [ 'page' => $userpage->getPrefixedText() ]
                        );
 
-                       # Suppression log link (bug 59120)
+                       # Suppression log link (T61120)
                        if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
                                $tools['log-suppression'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Log', 'suppress' ),
index 9140bf1..59351dc 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page listing redirects to redirecting page.
  * The software will automatically not follow double redirects, to prevent loops.
@@ -75,7 +77,7 @@ class DoubleRedirectsPage extends QueryPage {
                        'conds' => [
                                'ra.rd_from = pa.page_id',
 
-                               // Filter out redirects where the target goes interwiki (bug 40353).
+                               // Filter out redirects where the target goes interwiki (T42353).
                                // This isn't an optimization, it is required for correct results,
                                // otherwise a non-double redirect like Bar -> w:Foo will show up
                                // like "Bar -> Foo -> w:Foo".
index b447271..e1ecfe8 100644 (file)
@@ -793,7 +793,7 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
         * HTMLMultiSelectField throws validation errors if we get input data
         * that doesn't match the data set in the form setup. This causes
         * problems if something gets removed from the watchlist while the
-        * form is open (bug 32126), but we know that invalid items will
+        * form is open (T34126), but we know that invalid items will
         * be harmless so we can override it here.
         *
         * @param string $value The value the field was submitted with
index ca0d139..560d75a 100644 (file)
@@ -263,7 +263,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        $user = $this->getUser();
 
                        // To prevent cross-site scripting attacks, don't show the preview if raw HTML is
-                       // allowed and a valid edit token is not provided (bug 71111). However, MediaWiki
+                       // allowed and a valid edit token is not provided (T73111). However, MediaWiki
                        // does not currently provide logged-out users with CSRF protection; in that case,
                        // do not show the preview unless anonymous editing is allowed.
                        if ( $user->isAnon() && !$user->isAllowed( 'edit' ) ) {
index bf535a6..f5e9e49 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup SpecialPage
  */
 
+use Mediawiki\MediaWikiServices;
+
 /**
  * A special page that allows users to export pages in a XML file
  *
@@ -359,7 +361,7 @@ class SpecialExport extends SpecialPage {
 
                        $pages = array_keys( $pageSet );
 
-                       // Normalize titles to the same format and remove dupes, see bug 17374
+                       // Normalize titles to the same format and remove dupes, see T19374
                        foreach ( $pages as $k => $v ) {
                                $pages[$k] = str_replace( " ", "_", $v );
                        }
@@ -374,7 +376,7 @@ class SpecialExport extends SpecialPage {
                        $buffer = WikiExporter::BUFFER;
                } else {
                        // Use an unbuffered query; histories may be very long!
-                       $lb = wfGetLBFactory()->newMainLB();
+                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB();
                        $db = $lb->getConnection( DB_REPLICA );
                        $buffer = WikiExporter::STREAM;
 
@@ -392,7 +394,7 @@ class SpecialExport extends SpecialPage {
                        $exporter->allPages();
                } else {
                        foreach ( $pages as $page ) {
-                               # Bug 8824: Only export pages the user can read
+                               # T10824: Only export pages the user can read
                                $title = Title::newFromText( $page );
                                if ( is_null( $title ) ) {
                                        // @todo Perhaps output an <error> tag or something.
index 0e2e7db..dc6a619 100644 (file)
@@ -137,7 +137,9 @@ class SpecialJavaScriptTest extends SpecialPage {
                $code .= '(function () {'
                        . 'var start = window.__karma__ ? window.__karma__.start : QUnit.start;'
                        . 'try {'
-                       . 'mw.loader.using( ' . Xml::encodeJsVar( $modules ) . ' ).always( start );'
+                       . 'mw.loader.using( ' . Xml::encodeJsVar( $modules ) . ' )'
+                       . '.always( start )'
+                       . '.fail( function ( e ) { throw e; } );'
                        . '} catch ( e ) { start(); throw e; }'
                        . '}());';
 
index a2fa844..a1f5efa 100644 (file)
@@ -22,6 +22,8 @@
  * @author Brion Vibber
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:LinkSearch to search the external-links table.
  * @ingroup SpecialPage
index dbe5c2f..52c710d 100644 (file)
@@ -24,6 +24,8 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:ListDuplicatedFiles Lists all files where the current version is
  *   a duplicate of the current version of some other file.
index d034a6c..b2d6a33 100644 (file)
@@ -24,6 +24,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:Listredirects - Lists all the redirects on the wiki.
  * @ingroup SpecialPage
index 533a331..195d08b 100644 (file)
@@ -96,7 +96,7 @@ class SpecialLog extends SpecialPage {
 
                # Some log types are only for a 'User:' title but we might have been given
                # only the username instead of the full title 'User:username'. This part try
-               # to lookup for a user by that name and eventually fix user input. See bug 1697.
+               # to lookup for a user by that name and eventually fix user input. See T3697.
                if ( in_array( $opts->getValue( 'type' ), self::getLogTypesOnUser() ) ) {
                        # ok we have a type of log which expect a user title.
                        $target = Title::newFromText( $opts->getValue( 'page' ) );
index 1cb6549..a88767a 100644 (file)
@@ -22,6 +22,8 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * @ingroup SpecialPage
  */
index 6095412..0776eec 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that list pages that have highest category count
  *
index 210c4a2..8560dca 100644 (file)
@@ -24,6 +24,8 @@
  * @author Umherirrender
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that listed pages that have highest interwiki count
  *
index 712574c..ff8550d 100644 (file)
@@ -25,6 +25,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page to show pages ordered by the number of pages linking to them.
  *
index 41678cb..699940b 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A querypage to show categories ordered in descending order by the pages in them
  *
index d102791..f5c2c5f 100644 (file)
@@ -22,6 +22,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special page lists templates with a large number of
  * transclusion links, i.e. "most used" templates
index 298d6c4..7d8a493 100644 (file)
@@ -77,7 +77,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $request = $this->getRequest();
                $target = !is_null( $par ) ? $par : $request->getVal( 'target' );
 
-               // Yes, the use of getVal() and getText() is wanted, see bug 20365
+               // Yes, the use of getVal() and getText() is wanted, see T22365
 
                $oldTitleText = $request->getVal( 'wpOldTitle', $target );
                $this->oldTitle = Title::newFromText( $oldTitleText );
@@ -620,7 +620,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        // a redirect to the new title. This is not safe, but what we did before was
                        // even worse: we just determined whether a redirect should have been created,
                        // and reported that it was created if it should have, without any checks.
-                       // Also note that isRedirect() is unreliable because of bug 37209.
+                       // Also note that isRedirect() is unreliable because of T39209.
                        $msgName = 'movepage-moved-redirect';
                } else {
                        $msgName = 'movepage-moved-noredirect';
@@ -630,7 +630,9 @@ class MovePageForm extends UnlistedSpecialPage {
                        $newLink )->params( $oldText, $newText )->parseAsBlock() );
                $out->addWikiMsg( $msgName );
 
-               Hooks::run( 'SpecialMovepageAfterMove', [ &$this, &$ot, &$nt ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $movePage = $this;
+               Hooks::run( 'SpecialMovepageAfterMove', [ &$movePage, &$ot, &$nt ] );
 
                # Now we move extra pages we've been asked to move: subpages and talk
                # pages.  First, if the old page or the new page is a talk page, we
@@ -706,7 +708,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        $newPageName = preg_replace(
                                '#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
-                               StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+                               StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
                                $oldSubpage->getDBkey()
                        );
 
@@ -719,7 +721,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
 
-                       # Bug 14385: we need makeTitleSafe because the new page names may
+                       # T16385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
                        if ( !$newSubpage ) {
index 4671591..34ffa07 100644 (file)
@@ -83,7 +83,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                        $showme = $from;
                }
 
-               // Bug 27864: if transcluded, show all pages instead of the form.
+               // T29864: if transcluded, show all pages instead of the form.
                if ( $this->including() || $showme != '' || $ns !== null ) {
                        $this->showPrefixChunk( $namespace, $showme, $from );
                } else {
index 5bdae15..8e20d88 100644 (file)
@@ -21,8 +21,6 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Linker\LinkRenderer;
-
 /**
  * A special page that lists protected pages
  *
@@ -273,317 +271,3 @@ class SpecialProtectedpages extends SpecialPage {
                return 'maintenance';
        }
 }
-
-/**
- * @todo document
- * @ingroup Pager
- */
-class ProtectedPagesPager extends TablePager {
-       public $mForm, $mConds;
-       private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
-
-       /**
-        * @var LinkRenderer
-        */
-       private $linkRenderer;
-
-       /**
-        * @param SpecialProtectedpages $form
-        * @param array $conds
-        * @param $type
-        * @param $level
-        * @param $namespace
-        * @param string $sizetype
-        * @param int $size
-        * @param bool $indefonly
-        * @param bool $cascadeonly
-        * @param bool $noredirect
-        * @param LinkRenderer $linkRenderer
-        */
-       function __construct( $form, $conds = [], $type, $level, $namespace,
-               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
-               LinkRenderer $linkRenderer
-       ) {
-               $this->mForm = $form;
-               $this->mConds = $conds;
-               $this->type = ( $type ) ? $type : 'edit';
-               $this->level = $level;
-               $this->namespace = $namespace;
-               $this->sizetype = $sizetype;
-               $this->size = intval( $size );
-               $this->indefonly = (bool)$indefonly;
-               $this->cascadeonly = (bool)$cascadeonly;
-               $this->noredirect = (bool)$noredirect;
-               $this->linkRenderer = $linkRenderer;
-               parent::__construct( $form->getContext() );
-       }
-
-       function preprocessResults( $result ) {
-               # Do a link batch query
-               $lb = new LinkBatch;
-               $userids = [];
-
-               foreach ( $result as $row ) {
-                       $lb->add( $row->page_namespace, $row->page_title );
-                       // field is nullable, maybe null on old protections
-                       if ( $row->log_user !== null ) {
-                               $userids[] = $row->log_user;
-                       }
-               }
-
-               // fill LinkBatch with user page and user talk
-               if ( count( $userids ) ) {
-                       $userCache = UserCache::singleton();
-                       $userCache->doQuery( $userids, [], __METHOD__ );
-                       foreach ( $userids as $userid ) {
-                               $name = $userCache->getProp( $userid, 'name' );
-                               if ( $name !== false ) {
-                                       $lb->add( NS_USER, $name );
-                                       $lb->add( NS_USER_TALK, $name );
-                               }
-                       }
-               }
-
-               $lb->execute();
-       }
-
-       function getFieldNames() {
-               static $headers = null;
-
-               if ( $headers == [] ) {
-                       $headers = [
-                               'log_timestamp' => 'protectedpages-timestamp',
-                               'pr_page' => 'protectedpages-page',
-                               'pr_expiry' => 'protectedpages-expiry',
-                               'log_user' => 'protectedpages-performer',
-                               'pr_params' => 'protectedpages-params',
-                               'log_comment' => 'protectedpages-reason',
-                       ];
-                       foreach ( $headers as $key => $val ) {
-                               $headers[$key] = $this->msg( $val )->text();
-                       }
-               }
-
-               return $headers;
-       }
-
-       /**
-        * @param string $field
-        * @param string $value
-        * @return string HTML
-        * @throws MWException
-        */
-       function formatValue( $field, $value ) {
-               /** @var $row object */
-               $row = $this->mCurrentRow;
-
-               switch ( $field ) {
-                       case 'log_timestamp':
-                               // when timestamp is null, this is a old protection row
-                               if ( $value === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
-                                       );
-                               } else {
-                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
-                                               $value, $this->getUser() ) );
-                               }
-                               break;
-
-                       case 'pr_page':
-                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( !$title ) {
-                                       $formatted = Html::element(
-                                               'span',
-                                               [ 'class' => 'mw-invalidtitle' ],
-                                               Linker::getInvalidTitleDescription(
-                                                       $this->getContext(),
-                                                       $row->page_namespace,
-                                                       $row->page_title
-                                               )
-                                       );
-                               } else {
-                                       $formatted = $this->linkRenderer->makeLink( $title );
-                               }
-                               if ( !is_null( $row->page_len ) ) {
-                                       $formatted .= $this->getLanguage()->getDirMark() .
-                                               ' ' . Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-length' ],
-                                               Linker::formatRevisionSize( $row->page_len )
-                                       );
-                               }
-                               break;
-
-                       case 'pr_expiry':
-                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
-                                       $value, /* User preference timezone */true ) );
-                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
-                                       $changeProtection = $this->linkRenderer->makeKnownLink(
-                                               $title,
-                                               $this->msg( 'protect_change' )->text(),
-                                               [],
-                                               [ 'action' => 'unprotect' ]
-                                       );
-                                       $formatted .= ' ' . Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-actions' ],
-                                               $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
-                                       );
-                               }
-                               break;
-
-                       case 'log_user':
-                               // when timestamp is null, this is a old protection row
-                               if ( $row->log_timestamp === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
-                                       );
-                               } else {
-                                       $username = UserCache::singleton()->getProp( $value, 'name' );
-                                       if ( LogEventsList::userCanBitfield(
-                                               $row->log_deleted,
-                                               LogPage::DELETED_USER,
-                                               $this->getUser()
-                                       ) ) {
-                                               if ( $username === false ) {
-                                                       $formatted = htmlspecialchars( $value );
-                                               } else {
-                                                       $formatted = Linker::userLink( $value, $username )
-                                                               . Linker::userToolLinks( $value, $username );
-                                               }
-                                       } else {
-                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
-                                       }
-                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
-                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
-                                       }
-                               }
-                               break;
-
-                       case 'pr_params':
-                               $params = [];
-                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
-                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
-                               if ( $row->pr_cascade ) {
-                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
-                               }
-                               $formatted = $this->getLanguage()->commaList( $params );
-                               break;
-
-                       case 'log_comment':
-                               // when timestamp is null, this is an old protection row
-                               if ( $row->log_timestamp === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
-                                       );
-                               } else {
-                                       if ( LogEventsList::userCanBitfield(
-                                               $row->log_deleted,
-                                               LogPage::DELETED_COMMENT,
-                                               $this->getUser()
-                                       ) ) {
-                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
-                                       } else {
-                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
-                                       }
-                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
-                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
-                                       }
-                               }
-                               break;
-
-                       default:
-                               throw new MWException( "Unknown field '$field'" );
-               }
-
-               return $formatted;
-       }
-
-       function getQueryInfo() {
-               $conds = $this->mConds;
-               $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
-                       ' OR pr_expiry IS NULL';
-               $conds[] = 'page_id=pr_page';
-               $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
-
-               if ( $this->sizetype == 'min' ) {
-                       $conds[] = 'page_len>=' . $this->size;
-               } elseif ( $this->sizetype == 'max' ) {
-                       $conds[] = 'page_len<=' . $this->size;
-               }
-
-               if ( $this->indefonly ) {
-                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
-                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
-               }
-               if ( $this->cascadeonly ) {
-                       $conds[] = 'pr_cascade = 1';
-               }
-               if ( $this->noredirect ) {
-                       $conds[] = 'page_is_redirect = 0';
-               }
-
-               if ( $this->level ) {
-                       $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
-               }
-               if ( !is_null( $this->namespace ) ) {
-                       $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
-               }
-
-               return [
-                       'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
-                       'fields' => [
-                               'pr_id',
-                               'page_namespace',
-                               'page_title',
-                               'page_len',
-                               'pr_type',
-                               'pr_level',
-                               'pr_expiry',
-                               'pr_cascade',
-                               'log_timestamp',
-                               'log_user',
-                               'log_comment',
-                               'log_deleted',
-                       ],
-                       'conds' => $conds,
-                       'join_conds' => [
-                               'log_search' => [
-                                       'LEFT JOIN', [
-                                               'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
-                                       ]
-                               ],
-                               'logging' => [
-                                       'LEFT JOIN', [
-                                               'ls_log_id = log_id'
-                                       ]
-                               ]
-                       ]
-               ];
-       }
-
-       protected function getTableClass() {
-               return parent::getTableClass() . ' mw-protectedpages';
-       }
-
-       function getIndexField() {
-               return 'pr_id';
-       }
-
-       function getDefaultSort() {
-               return 'pr_id';
-       }
-
-       function isFieldSortable( $field ) {
-               // no index for sorting exists
-               return false;
-       }
-}
index b2e5674..cdad926 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki
@@ -455,6 +456,16 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $panel[] = $form;
                $panelString = implode( "\n", $panel );
 
+               // Insert a placeholder for RCFilters
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                       $this->getOutput()->addHTML(
+                               Html::element(
+                                       'div',
+                                       [ 'class' => 'rcfilters-container' ]
+                               )
+                       );
+               }
+
                $this->getOutput()->addHTML(
                        Xml::fieldset(
                                $this->msg( 'recentchanges-legend' )->text(),
@@ -526,13 +537,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                parent::addModules();
                $out = $this->getOutput();
                $out->addModules( 'mediawiki.special.recentchanges' );
-               if ( $this->getUser()->getOption(
-                               'rcenhancedfilters',
-                               /*default=*/ null,
-                               /*ignoreHidden=*/ true
-                       )
-               ) {
-                       $out->addModules( 'mediawiki.rcfilters.filters' );
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                       $out->addModules( 'mediawiki.rcfilters.filters.ui' );
+                       $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
                }
        }
 
@@ -668,7 +675,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        function makeOptionsLink( $title, $override, $options, $active = false ) {
                $params = $override + $options;
 
-               // Bug 36524: false values have be converted to "0" otherwise
+               // T38524: false values have be converted to "0" otherwise
                // wfArrayToCgi() will omit it them.
                foreach ( $params as &$value ) {
                        if ( $value === false ) {
@@ -681,7 +688,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
                }
 
-               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
+               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [
+                       'data-params' => json_encode( $override ),
+                       'data-keys' => implode( ',', array_keys( $override ) ),
+               ], $params );
        }
 
        /**
@@ -817,9 +827,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
        function filterOnUserExperienceLevel( &$tables, &$conds, &$join_conds, $opts ) {
                global $wgLearnerEdits,
-                          $wgExperiencedUserEdits,
-                          $wgLearnerMemberSince,
-                          $wgExperiencedUserMemberSince;
+                       $wgExperiencedUserEdits,
+                       $wgLearnerMemberSince,
+                       $wgExperiencedUserMemberSince;
 
                $selectedExpLevels = explode( ',', strtolower( $opts['userExpLevel'] ) );
                // remove values that are not recognized
index 34620ff..b7356e7 100644 (file)
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Widget\Search\BasicSearchResultSetWidget;
-use MediaWiki\Widget\Search\InterwikiSearchResultSetWidget;
 use MediaWiki\Widget\Search\FullSearchResultWidget;
+use MediaWiki\Widget\Search\InterwikiSearchResultWidget;
+use MediaWiki\Widget\Search\InterwikiSearchResultSetWidget;
 use MediaWiki\Widget\Search\SimpleSearchResultWidget;
+use MediaWiki\Widget\Search\SimpleSearchResultSetWidget;
 
 /**
  * implements Special:Search - Run text & title search and display the output
@@ -385,13 +387,26 @@ class SpecialSearch extends SpecialPage {
                // results to display.
                $linkRenderer = $this->getLinkRenderer();
                $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer );
-               $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer );
-               $sidebarResultsWidget = new InterwikiSearchResultSetWidget(
-                       $this,
-                       $sidebarResultWidget,
-                       $linkRenderer,
-                       MediaWikiServices::getInstance()->getInterwikiLookup()
-               );
+
+               if ( $search->getFeatureData( 'enable-new-crossproject-page' ) ) {
+
+                       $sidebarResultWidget = new InterwikiSearchResultWidget( $this, $linkRenderer );
+                       $sidebarResultsWidget = new InterwikiSearchResultSetWidget(
+                               $this,
+                               $sidebarResultWidget,
+                               $linkRenderer,
+                               MediaWikiServices::getInstance()->getInterwikiLookup()
+                       );
+               } else {
+                       $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer );
+                       $sidebarResultsWidget = new SimpleSearchResultSetWidget(
+                               $this,
+                               $sidebarResultWidget,
+                               $linkRenderer,
+                               MediaWikiServices::getInstance()->getInterwikiLookup()
+                       );
+               }
+
                $widget = new BasicSearchResultSetWidget( $this, $mainResultWidget, $sidebarResultsWidget );
 
                $out->addHTML( $widget->render(
index a78b082..a5e5113 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * SpecialShortpages extends QueryPage. It is used to return the shortest
  * pages in the database.
index a7a1c58..19850e6 100644 (file)
@@ -95,9 +95,11 @@ class SpecialStatistics extends SpecialPage {
                        if ( !$msg->isDisabled() ) {
                                $descriptionHtml = $this->msg( 'parentheses' )->rawParams( $msg->parse() )
                                        ->escaped();
-                               $text .= "<br />" .
-                                         Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
-                                                                               " $descriptionHtml" );
+                               $text .= "<br />" . Html::rawElement(
+                                       'small',
+                                       [ 'class' => 'mw-statistic-desc' ],
+                                       " $descriptionHtml"
+                               );
                        }
                }
 
index 0d42e3f..01125fc 100644 (file)
@@ -186,7 +186,7 @@ class SpecialUnblock extends SpecialPage {
                        return [ [ 'ipb_cant_unblock', $target ] ];
                }
 
-               # bug 15810: blocked admins should have limited access here.  This
+               # T17810: blocked admins should have limited access here.  This
                # won't allow sysops to remove autoblocks on themselves, but they
                # should have ipblock-exempt anyway
                $status = SpecialBlock::checkUnblockSelf( $target, $performer );
index 4c6a593..dc5f877 100644 (file)
  * @file
  * @ingroup SpecialPage
  */
-use MediaWiki\MediaWikiServices;
 
-/**
- * Used to show archived pages and eventually restore them.
- *
- * @ingroup SpecialPage
- */
-class PageArchive {
-       /** @var Title */
-       protected $title;
-
-       /** @var Status */
-       protected $fileStatus;
-
-       /** @var Status */
-       protected $revisionStatus;
-
-       /** @var Config */
-       protected $config;
-
-       function __construct( $title, Config $config = null ) {
-               if ( is_null( $title ) ) {
-                       throw new MWException( __METHOD__ . ' given a null title.' );
-               }
-               $this->title = $title;
-               if ( $config === null ) {
-                       wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
-                       $config = MediaWikiServices::getInstance()->getMainConfig();
-               }
-               $this->config = $config;
-       }
-
-       public function doesWrites() {
-               return true;
-       }
-
-       /**
-        * List all deleted pages recorded in the archive table. Returns result
-        * wrapper with (ar_namespace, ar_title, count) fields, ordered by page
-        * namespace/title.
-        *
-        * @return ResultWrapper
-        */
-       public static function listAllPages() {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               return self::listPages( $dbr, '' );
-       }
-
-       /**
-        * List deleted pages recorded in the archive table matching the
-        * given title prefix.
-        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
-        *
-        * @param string $prefix Title prefix
-        * @return ResultWrapper
-        */
-       public static function listPagesByPrefix( $prefix ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $title = Title::newFromText( $prefix );
-               if ( $title ) {
-                       $ns = $title->getNamespace();
-                       $prefix = $title->getDBkey();
-               } else {
-                       // Prolly won't work too good
-                       // @todo handle bare namespace names cleanly?
-                       $ns = 0;
-               }
-
-               $conds = [
-                       'ar_namespace' => $ns,
-                       'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
-               ];
-
-               return self::listPages( $dbr, $conds );
-       }
-
-       /**
-        * @param IDatabase $dbr
-        * @param string|array $condition
-        * @return bool|ResultWrapper
-        */
-       protected static function listPages( $dbr, $condition ) {
-               return $dbr->select(
-                       [ 'archive' ],
-                       [
-                               'ar_namespace',
-                               'ar_title',
-                               'count' => 'COUNT(*)'
-                       ],
-                       $condition,
-                       __METHOD__,
-                       [
-                               'GROUP BY' => [ 'ar_namespace', 'ar_title' ],
-                               'ORDER BY' => [ 'ar_namespace', 'ar_title' ],
-                               'LIMIT' => 100,
-                       ]
-               );
-       }
-
-       /**
-        * List the revisions of the given page. Returns result wrapper with
-        * (ar_minor_edit, ar_timestamp, ar_user, ar_user_text, ar_comment) fields.
-        *
-        * @return ResultWrapper
-        */
-       function listRevisions() {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $tables = [ 'archive' ];
-
-               $fields = [
-                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
-                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey() ];
-
-               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
-
-               $join_conds = [];
-
-               ChangeTags::modifyDisplayQuery(
-                       $tables,
-                       $fields,
-                       $conds,
-                       $join_conds,
-                       $options,
-                       ''
-               );
-
-               return $dbr->select( $tables,
-                       $fields,
-                       $conds,
-                       __METHOD__,
-                       $options,
-                       $join_conds
-               );
-       }
-
-       /**
-        * List the deleted file revisions for this page, if it's a file page.
-        * Returns a result wrapper with various filearchive fields, or null
-        * if not a file page.
-        *
-        * @return ResultWrapper
-        * @todo Does this belong in Image for fuller encapsulation?
-        */
-       function listFiles() {
-               if ( $this->title->getNamespace() != NS_FILE ) {
-                       return null;
-               }
-
-               $dbr = wfGetDB( DB_REPLICA );
-               return $dbr->select(
-                       'filearchive',
-                       ArchivedFile::selectFields(),
-                       [ 'fa_name' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'fa_timestamp DESC' ]
-               );
-       }
-
-       /**
-        * Return a Revision object containing data for the deleted revision.
-        * Note that the result *may* or *may not* have a null page ID.
-        *
-        * @param string $timestamp
-        * @return Revision|null
-        */
-       function getRevision( $timestamp ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $fields = [
-                       'ar_rev_id',
-                       'ar_text',
-                       'ar_comment',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_len',
-                       'ar_sha1',
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $row = $dbr->selectRow( 'archive',
-                       $fields,
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ],
-                       __METHOD__ );
-
-               if ( $row ) {
-                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
-               }
-
-               return null;
-       }
-
-       /**
-        * Return the most-previous revision, either live or deleted, against
-        * the deleted revision given by timestamp.
-        *
-        * May produce unexpected results in case of history merges or other
-        * unusual time issues.
-        *
-        * @param string $timestamp
-        * @return Revision|null Null when there is no previous revision
-        */
-       function getPreviousRevision( $timestamp ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               // Check the previous deleted revision...
-               $row = $dbr->selectRow( 'archive',
-                       'ar_timestamp',
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               'ar_timestamp < ' .
-                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
-                       __METHOD__,
-                       [
-                               'ORDER BY' => 'ar_timestamp DESC',
-                               'LIMIT' => 1 ] );
-               $prevDeleted = $row ? wfTimestamp( TS_MW, $row->ar_timestamp ) : false;
-
-               $row = $dbr->selectRow( [ 'page', 'revision' ],
-                       [ 'rev_id', 'rev_timestamp' ],
-                       [
-                               'page_namespace' => $this->title->getNamespace(),
-                               'page_title' => $this->title->getDBkey(),
-                               'page_id = rev_page',
-                               'rev_timestamp < ' .
-                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
-                       __METHOD__,
-                       [
-                               'ORDER BY' => 'rev_timestamp DESC',
-                               'LIMIT' => 1 ] );
-               $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
-               $prevLiveId = $row ? intval( $row->rev_id ) : null;
-
-               if ( $prevLive && $prevLive > $prevDeleted ) {
-                       // Most prior revision was live
-                       return Revision::newFromId( $prevLiveId );
-               } elseif ( $prevDeleted ) {
-                       // Most prior revision was deleted
-                       return $this->getRevision( $prevDeleted );
-               }
-
-               // No prior revision on this page.
-               return null;
-       }
-
-       /**
-        * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
-        *
-        * @param object $row Database row
-        * @return string
-        */
-       function getTextFromRow( $row ) {
-               if ( is_null( $row->ar_text_id ) ) {
-                       // An old row from MediaWiki 1.4 or previous.
-                       // Text is embedded in this row in classic compression format.
-                       return Revision::getRevisionText( $row, 'ar_' );
-               }
-
-               // New-style: keyed to the text storage backend.
-               $dbr = wfGetDB( DB_REPLICA );
-               $text = $dbr->selectRow( 'text',
-                       [ 'old_text', 'old_flags' ],
-                       [ 'old_id' => $row->ar_text_id ],
-                       __METHOD__ );
-
-               return Revision::getRevisionText( $text );
-       }
-
-       /**
-        * Fetch (and decompress if necessary) the stored text of the most
-        * recently edited deleted revision of the page.
-        *
-        * If there are no archived revisions for the page, returns NULL.
-        *
-        * @return string|null
-        */
-       function getLastRevisionText() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $row = $dbr->selectRow( 'archive',
-                       [ 'ar_text', 'ar_flags', 'ar_text_id' ],
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'ar_timestamp DESC' ] );
-
-               if ( $row ) {
-                       return $this->getTextFromRow( $row );
-               }
-
-               return null;
-       }
-
-       /**
-        * Quick check if any archived revisions are present for the page.
-        *
-        * @return bool
-        */
-       function isDeleted() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() ],
-                       __METHOD__
-               );
-
-               return ( $n > 0 );
-       }
-
-       /**
-        * Restore the given (or all) text and file revisions for the page.
-        * Once restored, the items will be removed from the archive tables.
-        * The deletion log will be updated with an undeletion notice.
-        *
-        * This also sets Status objects, $this->fileStatus and $this->revisionStatus
-        * (depending what operations are attempted).
-        *
-        * @param array $timestamps Pass an empty array to restore all revisions,
-        *   otherwise list the ones to undelete.
-        * @param string $comment
-        * @param array $fileVersions
-        * @param bool $unsuppress
-        * @param User $user User performing the action, or null to use $wgUser
-        * @param string|string[] $tags Change tags to add to log entry
-        *   ($user should be able to add the specified tags before this is called)
-        * @return array(number of file revisions restored, number of image revisions
-        *   restored, log message) on success, false on failure.
-        */
-       function undelete( $timestamps, $comment = '', $fileVersions = [],
-               $unsuppress = false, User $user = null, $tags = null
-       ) {
-               // If both the set of text revisions and file revisions are empty,
-               // restore everything. Otherwise, just restore the requested items.
-               $restoreAll = empty( $timestamps ) && empty( $fileVersions );
-
-               $restoreText = $restoreAll || !empty( $timestamps );
-               $restoreFiles = $restoreAll || !empty( $fileVersions );
-
-               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
-                       $img = wfLocalFile( $this->title );
-                       $img->load( File::READ_LATEST );
-                       $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
-                       if ( !$this->fileStatus->isOK() ) {
-                               return false;
-                       }
-                       $filesRestored = $this->fileStatus->successCount;
-               } else {
-                       $filesRestored = 0;
-               }
-
-               if ( $restoreText ) {
-                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-                       if ( !$this->revisionStatus->isOK() ) {
-                               return false;
-                       }
-
-                       $textRestored = $this->revisionStatus->getValue();
-               } else {
-                       $textRestored = 0;
-               }
-
-               // 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 {
-                       wfDebug( "Undelete: nothing undeleted...\n" );
-
-                       return false;
-               }
-
-               if ( trim( $comment ) != '' ) {
-                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
-               }
-
-               if ( $user === null ) {
-                       global $wgUser;
-                       $user = $wgUser;
-               }
-
-               $logEntry = new ManualLogEntry( 'delete', 'restore' );
-               $logEntry->setPerformer( $user );
-               $logEntry->setTarget( $this->title );
-               $logEntry->setComment( $reason );
-               $logEntry->setTags( $tags );
-
-               Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
-
-               $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
-
-               return [ $textRestored, $filesRestored, $reason ];
-       }
-
-       /**
-        * This is the meaty bit -- It restores archived revisions of the given page
-        * to the revision table.
-        *
-        * @param array $timestamps Pass an empty array to restore all revisions,
-        *   otherwise list the ones to undelete.
-        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
-        * @param string $comment
-        * @throws ReadOnlyError
-        * @return Status Status object containing the number of revisions restored on success
-        */
-       private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError();
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->startAtomic( __METHOD__ );
-
-               $restoreAll = empty( $timestamps );
-
-               # Does this page already exist? We'll have to update it...
-               $article = WikiPage::factory( $this->title );
-               # Load latest data for the current page (bug 31179)
-               $article->loadPageData( 'fromdbmaster' );
-               $oldcountable = $article->isCountable();
-
-               $page = $dbw->selectRow( 'page',
-                       [ 'page_id', 'page_latest' ],
-                       [ 'page_namespace' => $this->title->getNamespace(),
-                               'page_title' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'FOR UPDATE' ] // lock page
-               );
-
-               if ( $page ) {
-                       $makepage = false;
-                       # Page already exists. Import the history, and if necessary
-                       # we'll update the latest revision field in the record.
-
-                       # Get the time span of this page
-                       $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
-                               [ 'rev_id' => $page->page_latest ],
-                               __METHOD__ );
-
-                       if ( $previousTimestamp === false ) {
-                               wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
-
-                               $status = Status::newGood( 0 );
-                               $status->warning( 'undeleterevision-missing' );
-                               $dbw->endAtomic( __METHOD__ );
-
-                               return $status;
-                       }
-               } else {
-                       # Have to create a new article...
-                       $makepage = true;
-                       $previousTimestamp = 0;
-               }
-
-               $oldWhere = [
-                       'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey(),
-               ];
-               if ( !$restoreAll ) {
-                       $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
-               }
-
-               $fields = [
-                       'ar_id',
-                       'ar_rev_id',
-                       'rev_id',
-                       'ar_text',
-                       'ar_comment',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_page_id',
-                       'ar_len',
-                       'ar_sha1'
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               /**
-                * Select each archived revision...
-                */
-               $result = $dbw->select(
-                       [ 'archive', 'revision' ],
-                       $fields,
-                       $oldWhere,
-                       __METHOD__,
-                       /* options */
-                       [ 'ORDER BY' => 'ar_timestamp' ],
-                       [ 'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ] ]
-               );
-
-               $rev_count = $result->numRows();
-               if ( !$rev_count ) {
-                       wfDebug( __METHOD__ . ": no revisions to restore\n" );
-
-                       $status = Status::newGood( 0 );
-                       $status->warning( "undelete-no-results" );
-                       $dbw->endAtomic( __METHOD__ );
-
-                       return $status;
-               }
-
-               // We use ar_id because there can be duplicate ar_rev_id even for the same
-               // page.  In this case, we may be able to restore the first one.
-               $restoreFailedArIds = [];
-
-               // Map rev_id to the ar_id that is allowed to use it.  When checking later,
-               // if it doesn't match, the current ar_id can not be restored.
-
-               // Value can be an ar_id or -1 (-1 means no ar_id can use it, since the
-               // rev_id is taken before we even start the restore).
-               $allowedRevIdToArIdMap = [];
-
-               $latestRestorableRow = null;
-
-               foreach ( $result as $row ) {
-                       if ( $row->ar_rev_id ) {
-                               // rev_id is taken even before we start restoring.
-                               if ( $row->ar_rev_id === $row->rev_id ) {
-                                       $restoreFailedArIds[] = $row->ar_id;
-                                       $allowedRevIdToArIdMap[$row->ar_rev_id] = -1;
-                               } else {
-                                       // rev_id is not taken yet in the DB, but it might be taken
-                                       // by a prior revision in the same restore operation. If
-                                       // not, we need to reserve it.
-                                       if ( isset( $allowedRevIdToArIdMap[$row->ar_rev_id] ) ) {
-                                               $restoreFailedArIds[] = $row->ar_id;
-                                       } else {
-                                               $allowedRevIdToArIdMap[$row->ar_rev_id] = $row->ar_id;
-                                               $latestRestorableRow = $row;
-                                       }
-                               }
-                       } else {
-                               // If ar_rev_id is null, there can't be a collision, and a
-                               // rev_id will be chosen automatically.
-                               $latestRestorableRow = $row;
-                       }
-               }
-
-               $result->seek( 0 ); // move back
-
-               $oldPageId = 0;
-               if ( $latestRestorableRow !== null ) {
-                       $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
-
-                       // grab the content to check consistency with global state before restoring the page.
-                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
-                               [
-                                       'title' => $article->getTitle(), // used to derive default content model
-                               ]
-                       );
-                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
-                       $content = $revision->getContent( Revision::RAW );
-
-                       // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
-                       $status = $content->prepareSave( $article, 0, -1, $user );
-                       if ( !$status->isOK() ) {
-                               $dbw->endAtomic( __METHOD__ );
-
-                               return $status;
-                       }
-               }
-
-               $newid = false; // newly created page ID
-               $restored = 0; // number of revisions restored
-               /** @var Revision $revision */
-               $revision = null;
-
-               // If there are no restorable revisions, we can skip most of the steps.
-               if ( $latestRestorableRow === null ) {
-                       $failedRevisionCount = $rev_count;
-               } else {
-                       if ( $makepage ) {
-                               // Check the state of the newest to-be version...
-                               if ( !$unsuppress
-                                       && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
-                               ) {
-                                       $dbw->endAtomic( __METHOD__ );
-
-                                       return Status::newFatal( "undeleterevdel" );
-                               }
-                               // Safe to insert now...
-                               $newid = $article->insertOn( $dbw, $latestRestorableRow->ar_page_id );
-                               if ( $newid === false ) {
-                                       // The old ID is reserved; let's pick another
-                                       $newid = $article->insertOn( $dbw );
-                               }
-                               $pageId = $newid;
-                       } else {
-                               // Check if a deleted revision will become the current revision...
-                               if ( $latestRestorableRow->ar_timestamp > $previousTimestamp ) {
-                                       // Check the state of the newest to-be version...
-                                       if ( !$unsuppress
-                                               && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
-                                       ) {
-                                               $dbw->endAtomic( __METHOD__ );
-
-                                               return Status::newFatal( "undeleterevdel" );
-                                       }
-                               }
-
-                               $newid = false;
-                               $pageId = $article->getId();
-                       }
-
-                       foreach ( $result as $row ) {
-                               // Check for key dupes due to needed archive integrity.
-                               if ( $row->ar_rev_id && $allowedRevIdToArIdMap[$row->ar_rev_id] !== $row->ar_id ) {
-                                       continue;
-                               }
-                               // Insert one revision at a time...maintaining deletion status
-                               // unless we are specifically removing all restrictions...
-                               $revision = Revision::newFromArchiveRow( $row,
-                                       [
-                                               'page' => $pageId,
-                                               'title' => $this->title,
-                                               'deleted' => $unsuppress ? 0 : $row->ar_deleted
-                                       ] );
-
-                               $revision->insertOn( $dbw );
-                               $restored++;
-
-                               Hooks::run( 'ArticleRevisionUndeleted',
-                                       [ &$this->title, $revision, $row->ar_page_id ] );
-                       }
-
-                       // Now that it's safely stored, take it out of the archive
-                       // Don't delete rows that we failed to restore
-                       $toDeleteConds = $oldWhere;
-                       $failedRevisionCount = count( $restoreFailedArIds );
-                       if ( $failedRevisionCount > 0 ) {
-                               $toDeleteConds[] = 'ar_id NOT IN ( ' . $dbw->makeList( $restoreFailedArIds ) . ' )';
-                       }
-
-                       $dbw->delete( 'archive',
-                               $toDeleteConds,
-                               __METHOD__ );
-               }
-
-               $status = Status::newGood( $restored );
-
-               if ( $failedRevisionCount > 0 ) {
-                       $status->warning(
-                               wfMessage( 'undeleterevision-duplicate-revid', $failedRevisionCount ) );
-               }
-
-               // Was anything restored at all?
-               if ( $restored ) {
-                       $created = (bool)$newid;
-                       // Attach the latest revision to the page...
-                       $wasnew = $article->updateIfNewerOn( $dbw, $revision );
-                       if ( $created || $wasnew ) {
-                               // Update site stats, link tables, etc
-                               $article->doEditUpdates(
-                                       $revision,
-                                       User::newFromName( $revision->getUserText( Revision::RAW ), false ),
-                                       [
-                                               'created' => $created,
-                                               'oldcountable' => $oldcountable,
-                                               'restored' => true
-                                       ]
-                               );
-                       }
-
-                       Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] );
-                       if ( $this->title->getNamespace() == NS_FILE ) {
-                               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
-                       }
-               }
-
-               $dbw->endAtomic( __METHOD__ );
-
-               return $status;
-       }
-
-       /**
-        * @return Status
-        */
-       function getFileStatus() {
-               return $this->fileStatus;
-       }
-
-       /**
-        * @return Status
-        */
-       function getRevisionStatus() {
-               return $this->revisionStatus;
-       }
-}
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Special page allowing users with the appropriate permissions to view
index ec39ccf..1469742 100644 (file)
@@ -55,7 +55,7 @@ class UnusedCategoriesPage extends QueryPage {
        }
 
        /**
-        * A should come before Z (bug 30907)
+        * A should come before Z (T32907)
         * @return bool
         */
        function sortDescending() {
index 96878a3..e82279e 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that displays a list of pages that are not on anyones watchlist.
  *
index c5a1f27..f4a4818 100644 (file)
@@ -281,10 +281,12 @@ class SpecialUpload extends SpecialPage {
                $desiredTitleObj = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $delNotice = ''; // empty by default
                if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
+                       $dbr = wfGetDB( DB_REPLICA );
+
                        LogEventsList::showLogExtract( $delNotice, [ 'delete', 'move' ],
                                $desiredTitleObj,
                                '', [ 'lim' => 10,
-                                       'conds' => [ "log_action != 'revision'" ],
+                                       'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
                                        'showIfEmpty' => false,
                                        'msgKey' => [ 'upload-recreate-warning' ] ]
                        );
index 8478e94..b0bb595 100644 (file)
@@ -327,7 +327,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                header( "Content-Type: $contentType", true );
                header( 'Content-Transfer-Encoding: binary', true );
                header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
-               // Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
+               // T55032 - It shouldn't be a problem here, but let's be safe and not cache
                header( 'Cache-Control: private' );
                header( "Content-Length: $size", true );
        }
index c067f44..a9b732e 100644 (file)
@@ -38,7 +38,7 @@ class SpecialUserLogout extends UnlistedSpecialPage {
        function execute( $par ) {
                /**
                 * Some satellite ISPs use broken precaching schemes that log people out straight after
-                * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
+                * they're logged in (T19790). Luckily, there's a way to detect such requests.
                 */
                if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
                        wfDebug( "Special:UserLogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
index b0808f6..b33aa7d 100644 (file)
@@ -170,8 +170,8 @@ class UserrightsPage extends SpecialPage {
                        }
 
                        $targetUser = $this->mFetchedUser;
-                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
-                               $targetUser->clearInstanceCache(); // bug 38989
+                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (T63252)
+                               $targetUser->clearInstanceCache(); // T40989
                        }
 
                        if ( $request->getVal( 'conflictcheck-originalgroups' )
@@ -257,6 +257,7 @@ class UserrightsPage extends SpecialPage {
                $addgroup = [];
                $groupExpiries = []; // associative array of (group name => expiry)
                $removegroup = [];
+               $existingUGMs = $user->getGroupMemberships();
 
                // This could possibly create a highly unlikely race condition if permissions are changed between
                //  when the form is loaded and when the form is saved. Ignoring it for the moment.
@@ -269,12 +270,14 @@ class UserrightsPage extends SpecialPage {
                                if ( $this->canProcessExpiries() ) {
                                        // read the expiry information from the request
                                        $expiryDropdown = $this->getRequest()->getVal( "wpExpiry-$group" );
+                                       if ( $expiryDropdown === 'existing' ) {
+                                               continue;
+                                       }
+
                                        if ( $expiryDropdown === 'other' ) {
                                                $expiryValue = $this->getRequest()->getVal( "wpExpiry-$group-other" );
-                                       } elseif ( $expiryDropdown !== 'existing' ) {
-                                               $expiryValue = $expiryDropdown;
                                        } else {
-                                               continue;
+                                               $expiryValue = $expiryDropdown;
                                        }
 
                                        // validate the expiry
@@ -288,6 +291,16 @@ class UserrightsPage extends SpecialPage {
                                        if ( $groupExpiries[$group] && $groupExpiries[$group] < wfTimestampNow() ) {
                                                return Status::newFatal( 'userrights-expiry-in-past', $group );
                                        }
+
+                                       // if the user can only add this group (not remove it), the expiry time
+                                       // cannot be brought forward (T156784)
+                                       if ( !$this->canRemove( $group ) &&
+                                               isset( $existingUGMs[$group] ) &&
+                                               ( $existingUGMs[$group]->getExpiry() ?: 'infinity' ) >
+                                                       ( $groupExpiries[$group] ?: 'infinity' )
+                                       ) {
+                                               return Status::newFatal( 'userrights-cannot-shorten-expiry', $group );
+                                       }
                                }
                        } else {
                                $removegroup[] = $group;
@@ -300,7 +313,8 @@ class UserrightsPage extends SpecialPage {
        }
 
        /**
-        * Save user groups changes in the database.
+        * Save user groups changes in the database. This function does not throw errors;
+        * instead, it ignores groups that the performer does not have permission to set.
         *
         * @param User|UserRightsProxy $user
         * @param array $add Array of groups to add
@@ -317,6 +331,7 @@ class UserrightsPage extends SpecialPage {
                // Validate input set...
                $isself = $user->getName() == $this->getUser()->getName();
                $groups = $user->getGroups();
+               $ugms = $user->getGroupMemberships();
                $changeable = $this->changeableGroups();
                $addable = array_merge( $changeable['add'], $isself ? $changeable['add-self'] : [] );
                $removable = array_merge( $changeable['remove'], $isself ? $changeable['remove-self'] : [] );
@@ -325,9 +340,19 @@ class UserrightsPage extends SpecialPage {
                        array_intersect( (array)$remove, $removable, $groups ) );
                $add = array_intersect( (array)$add, $addable );
 
-               // add only groups that are not already present or that need their expiry updated
+               // add only groups that are not already present or that need their expiry updated,
+               // UNLESS the user can only add this group (not remove it) and the expiry time
+               // is being brought forward (T156784)
                $add = array_filter( $add,
-                       function( $group ) use ( $groups, $groupExpiries ) {
+                       function( $group ) use ( $groups, $groupExpiries, $removable, $ugms ) {
+                               if ( isset( $groupExpiries[$group] ) &&
+                                       !in_array( $group, $removable ) &&
+                                       isset( $ugms[$group] ) &&
+                                       ( $ugms[$group]->getExpiry() ?: 'infinity' ) >
+                                               ( $groupExpiries[$group] ?: 'infinity' )
+                               ) {
+                                       return false;
+                               }
                                return !in_array( $group, $groups ) || array_key_exists( $group, $groupExpiries );
                        } );
 
@@ -757,22 +782,30 @@ class UserrightsPage extends SpecialPage {
 
                foreach ( $allgroups as $group ) {
                        $set = isset( $usergroups[$group] );
+                       // Users who can add the group, but not remove it, can only lengthen
+                       // expiries, not shorten them. So they should only see the expiry
+                       // dropdown if the group currently has a finite expiry
+                       $canOnlyLengthenExpiry = ( $set && $this->canAdd( $group ) &&
+                                !$this->canRemove( $group ) && $usergroups[$group]->getExpiry() );
                        // Should the checkbox be disabled?
-                       $disabled = !(
+                       $disabledCheckbox = !(
                                ( $set && $this->canRemove( $group ) ) ||
                                ( !$set && $this->canAdd( $group ) ) );
+                       // Should the expiry elements be disabled?
+                       $disabledExpiry = $disabledCheckbox && !$canOnlyLengthenExpiry;
                        // Do we need to point out that this action is irreversible?
-                       $irreversible = !$disabled && (
+                       $irreversible = !$disabledCheckbox && (
                                ( $set && !$this->canAdd( $group ) ) ||
                                ( !$set && !$this->canRemove( $group ) ) );
 
                        $checkbox = [
                                'set' => $set,
-                               'disabled' => $disabled,
+                               'disabled' => $disabledCheckbox,
+                               'disabled-expiry' => $disabledExpiry,
                                'irreversible' => $irreversible
                        ];
 
-                       if ( $disabled ) {
+                       if ( $disabledCheckbox && $disabledExpiry ) {
                                $columns['unchangeable'][$group] = $checkbox;
                        } else {
                                $columns['changeable'][$group] = $checkbox;
@@ -806,12 +839,14 @@ class UserrightsPage extends SpecialPage {
                                $member = UserGroupMembership::getGroupMemberName( $group, $user->getName() );
                                if ( $checkbox['irreversible'] ) {
                                        $text = $this->msg( 'userrights-irreversible-marker', $member )->text();
+                               } elseif ( $checkbox['disabled'] && !$checkbox['disabled-expiry'] ) {
+                                       $text = $this->msg( 'userrights-no-shorten-expiry-marker', $member )->text();
                                } else {
                                        $text = $member;
                                }
                                $checkboxHtml = Xml::checkLabel( $text, "wpGroup-" . $group,
                                        "wpGroup-" . $group, $checkbox['set'], $attr );
-                               $ret .= "\t\t" . ( $checkbox['disabled']
+                               $ret .= "\t\t" . ( ( $checkbox['disabled'] && $checkbox['disabled-expiry'] )
                                        ? Xml::tags( 'div', [ 'class' => 'mw-userrights-disabled' ], $checkboxHtml )
                                        : Xml::tags( 'div', [], $checkboxHtml )
                                ) . "\n";
@@ -824,9 +859,11 @@ class UserrightsPage extends SpecialPage {
                                                $usergroups[$group]->getExpiry() :
                                                null;
 
-                                       // If the user can't uncheck this checkbox, print the current expiry below
+                                       // If the user can't modify the expiry, print the current expiry below
                                        // it in plain text. Otherwise provide UI to set/change the expiry
-                                       if ( $checkbox['set'] && ( $checkbox['irreversible'] || $checkbox['disabled'] ) ) {
+                                       if ( $checkbox['set'] &&
+                                               ( $checkbox['irreversible'] || $checkbox['disabled-expiry'] )
+                                       ) {
                                                if ( $currentExpiry ) {
                                                        $expiryFormatted = $uiLanguage->userTimeAndDate( $currentExpiry, $uiUser );
                                                        $expiryFormattedD = $uiLanguage->userDate( $currentExpiry, $uiUser );
@@ -848,7 +885,7 @@ class UserrightsPage extends SpecialPage {
                                                        "mw-input-wpExpiry-$group", // forward compatibility with HTMLForm
                                                        $currentExpiry ? 'existing' : 'infinite'
                                                );
-                                               if ( $checkbox['disabled'] ) {
+                                               if ( $checkbox['disabled-expiry'] ) {
                                                        $expiryFormOptions->setAttribute( 'disabled', 'disabled' );
                                                }
 
@@ -883,11 +920,17 @@ class UserrightsPage extends SpecialPage {
 
                                                // Add custom expiry field
                                                $attribs = [ 'id' => "mw-input-wpExpiry-$group-other" ];
-                                               if ( $checkbox['disabled'] ) {
+                                               if ( $checkbox['disabled-expiry'] ) {
                                                        $attribs['disabled'] = 'disabled';
                                                }
                                                $expiryHtml .= Xml::input( "wpExpiry-$group-other", 30, '', $attribs );
 
+                                               // If the user group is set but the checkbox is disabled, mimic a
+                                               // checked checkbox in the form submission
+                                               if ( $checkbox['set'] && $checkbox['disabled'] ) {
+                                                       $expiryHtml .= Html::hidden( "wpGroup-$group", 1 );
+                                               }
+
                                                $expiryHtml .= Xml::closeElement( 'span' );
                                        }
 
index 74d5e5d..6d481f8 100644 (file)
@@ -83,7 +83,7 @@ class WantedFilesPage extends WantedQueryPage {
         * KLUGE: The results may contain false positives for files
         * that exist e.g. in a shared repo.  Setting this at least
         * keeps them from showing up as redlinks in the output, even
-        * if it doesn't fix the real problem (bug 6220).
+        * if it doesn't fix the real problem (T8220).
         *
         * @note could also have existing links here from broken file
         * redirects.
index c37ecbd..8cea6cc 100644 (file)
@@ -85,7 +85,9 @@ class WantedPagesPage extends WantedQueryPage {
                        ]
                ];
                // Replacement for the WantedPages::getSQL hook
-               Hooks::run( 'WantedPages::getQueryInfo', [ &$this, &$query ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $wantedPages = $this;
+               Hooks::run( 'WantedPages::getQueryInfo', [ &$wantedPages, &$query ] );
 
                return $query;
        }
index 85ac2de..822648b 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki,
index 1fec05d..0d6f493 100644 (file)
@@ -111,7 +111,9 @@ class ActiveUsersPager extends UsersPager {
                                        'user_groups', '1', [
                                                'ug_user = user_id',
                                                'ug_group' => $group,
-                                               'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
+                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
+                                                       '1' :
+                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ]
                                ) . ')';
                        }
index efc51ef..ca1b7dc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Use TablePager for prettified output. We have to pretend that we're
  * getting data from a table when in fact not all of it comes from the database.
index a4124db..9a447ef 100644 (file)
@@ -23,6 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class BlockListPager extends TablePager {
 
index 367d073..5126bad 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ContribsPager extends ReverseChronologicalPager {
 
@@ -160,7 +162,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $user = $this->getUser();
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
@@ -200,7 +202,9 @@ class ContribsPager extends ReverseChronologicalPager {
                        $this->tagFilter
                );
 
-               Hooks::run( 'ContribsPager::getQueryInfo', [ &$this, &$queryInfo ] );
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $pager = $this;
+               Hooks::run( 'ContribsPager::getQueryInfo', [ &$pager, &$queryInfo ] );
 
                return $queryInfo;
        }
@@ -400,7 +404,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                $difftext = $linkRenderer->makeKnownLink(
                                        $page,
                                        new HtmlArmor( $this->messages['diff'] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-diff' ],
                                        [
                                                'diff' => 'prev',
                                                'oldid' => $row->rev_id
@@ -412,13 +416,13 @@ class ContribsPager extends ReverseChronologicalPager {
                        $histlink = $linkRenderer->makeKnownLink(
                                $page,
                                new HtmlArmor( $this->messages['hist'] ),
-                               [],
+                               [ 'class' => 'mw-changeslist-history' ],
                                [ 'action' => 'history' ]
                        );
 
                        if ( $row->rev_parent_id === null ) {
                                // For some reason rev_parent_id isn't populated for this row.
-                               // Its rumoured this is true on wikipedia for some revisions (bug 34922).
+                               // Its rumoured this is true on wikipedia for some revisions (T36922).
                                // Next best thing is to have the total number of bytes.
                                $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
                                $chardiff .= Linker::formatRevisionSize( $row->rev_len );
index 9ffcce9..a1f6b84 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class DeletedContribsPager extends IndexPager {
 
@@ -59,7 +61,7 @@ class DeletedContribsPager extends IndexPager {
                list( $index, $userCond ) = $this->getUserCond();
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
-               // Paranoia: avoid brute force searches (bug 17792)
+               // Paranoia: avoid brute force searches (T19792)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
index 59dea02..3789dfa 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ImageListPager extends TablePager {
 
@@ -449,7 +451,7 @@ class ImageListPager extends TablePager {
                                        $imgfile = $this->msg( 'imgfile' )->text();
                                }
 
-                               // Weird files can maybe exist? Bug 22227
+                               // Weird files can maybe exist? T24227
                                $filePage = Title::makeTitleSafe( NS_FILE, $value );
                                if ( $filePage ) {
                                        $link = $linkRenderer->makeKnownLink(
index e298f10..dafd244 100644 (file)
@@ -100,8 +100,10 @@ class NewPagesPager extends ReverseChronologicalPager {
                ];
                $join_conds = [ 'page' => [ 'INNER JOIN', 'page_id=rc_cur_id' ] ];
 
+               // Avoid PHP 7.1 warning from passing $this by reference
+               $pager = $this;
                Hooks::run( 'SpecialNewpagesConditions',
-                       [ &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ] );
+                       [ &$pager, $this->opts, &$conds, &$tables, &$fields, &$join_conds ] );
 
                $options = [];
 
diff --git a/includes/specials/pagers/ProtectedPagesPager.php b/includes/specials/pagers/ProtectedPagesPager.php
new file mode 100644 (file)
index 0000000..45dced8
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+use \MediaWiki\Linker\LinkRenderer;
+
+/**
+ * @todo document
+ */
+class ProtectedPagesPager extends TablePager {
+       public $mForm, $mConds;
+       private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
+
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
+       /**
+        * @param SpecialProtectedpages $form
+        * @param array $conds
+        * @param $type
+        * @param $level
+        * @param $namespace
+        * @param string $sizetype
+        * @param int $size
+        * @param bool $indefonly
+        * @param bool $cascadeonly
+        * @param bool $noredirect
+        * @param LinkRenderer $linkRenderer
+        */
+       function __construct( $form, $conds = [], $type, $level, $namespace,
+               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
+               LinkRenderer $linkRenderer
+       ) {
+               $this->mForm = $form;
+               $this->mConds = $conds;
+               $this->type = ( $type ) ? $type : 'edit';
+               $this->level = $level;
+               $this->namespace = $namespace;
+               $this->sizetype = $sizetype;
+               $this->size = intval( $size );
+               $this->indefonly = (bool)$indefonly;
+               $this->cascadeonly = (bool)$cascadeonly;
+               $this->noredirect = (bool)$noredirect;
+               $this->linkRenderer = $linkRenderer;
+               parent::__construct( $form->getContext() );
+       }
+
+       function preprocessResults( $result ) {
+               # Do a link batch query
+               $lb = new LinkBatch;
+               $userids = [];
+
+               foreach ( $result as $row ) {
+                       $lb->add( $row->page_namespace, $row->page_title );
+                       // field is nullable, maybe null on old protections
+                       if ( $row->log_user !== null ) {
+                               $userids[] = $row->log_user;
+                       }
+               }
+
+               // fill LinkBatch with user page and user talk
+               if ( count( $userids ) ) {
+                       $userCache = UserCache::singleton();
+                       $userCache->doQuery( $userids, [], __METHOD__ );
+                       foreach ( $userids as $userid ) {
+                               $name = $userCache->getProp( $userid, 'name' );
+                               if ( $name !== false ) {
+                                       $lb->add( NS_USER, $name );
+                                       $lb->add( NS_USER_TALK, $name );
+                               }
+                       }
+               }
+
+               $lb->execute();
+       }
+
+       function getFieldNames() {
+               static $headers = null;
+
+               if ( $headers == [] ) {
+                       $headers = [
+                               'log_timestamp' => 'protectedpages-timestamp',
+                               'pr_page' => 'protectedpages-page',
+                               'pr_expiry' => 'protectedpages-expiry',
+                               'log_user' => 'protectedpages-performer',
+                               'pr_params' => 'protectedpages-params',
+                               'log_comment' => 'protectedpages-reason',
+                       ];
+                       foreach ( $headers as $key => $val ) {
+                               $headers[$key] = $this->msg( $val )->text();
+                       }
+               }
+
+               return $headers;
+       }
+
+       /**
+        * @param string $field
+        * @param string $value
+        * @return string HTML
+        * @throws MWException
+        */
+       function formatValue( $field, $value ) {
+               /** @var $row object */
+               $row = $this->mCurrentRow;
+
+               switch ( $field ) {
+                       case 'log_timestamp':
+                               // when timestamp is null, this is a old protection row
+                               if ( $value === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
+                                       );
+                               } else {
+                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                                               $value, $this->getUser() ) );
+                               }
+                               break;
+
+                       case 'pr_page':
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( !$title ) {
+                                       $formatted = Html::element(
+                                               'span',
+                                               [ 'class' => 'mw-invalidtitle' ],
+                                               Linker::getInvalidTitleDescription(
+                                                       $this->getContext(),
+                                                       $row->page_namespace,
+                                                       $row->page_title
+                                               )
+                                       );
+                               } else {
+                                       $formatted = $this->linkRenderer->makeLink( $title );
+                               }
+                               if ( !is_null( $row->page_len ) ) {
+                                       $formatted .= $this->getLanguage()->getDirMark() .
+                                               ' ' . Html::rawElement(
+                                                       'span',
+                                                       [ 'class' => 'mw-protectedpages-length' ],
+                                                       Linker::formatRevisionSize( $row->page_len )
+                                               );
+                               }
+                               break;
+
+                       case 'pr_expiry':
+                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
+                                       $value, /* User preference timezone */true ) );
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+                                       $changeProtection = $this->linkRenderer->makeKnownLink(
+                                               $title,
+                                               $this->msg( 'protect_change' )->text(),
+                                               [],
+                                               [ 'action' => 'unprotect' ]
+                                       );
+                                       $formatted .= ' ' . Html::rawElement(
+                                                       'span',
+                                                       [ 'class' => 'mw-protectedpages-actions' ],
+                                                       $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
+                                               );
+                               }
+                               break;
+
+                       case 'log_user':
+                               // when timestamp is null, this is a old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
+                                       );
+                               } else {
+                                       $username = UserCache::singleton()->getProp( $value, 'name' );
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_USER,
+                                               $this->getUser()
+                                       ) ) {
+                                               if ( $username === false ) {
+                                                       $formatted = htmlspecialchars( $value );
+                                               } else {
+                                                       $formatted = Linker::userLink( $value, $username )
+                                                               . Linker::userToolLinks( $value, $username );
+                                               }
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       case 'pr_params':
+                               $params = [];
+                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
+                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
+                               if ( $row->pr_cascade ) {
+                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
+                               }
+                               $formatted = $this->getLanguage()->commaList( $params );
+                               break;
+
+                       case 'log_comment':
+                               // when timestamp is null, this is an old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
+                                       );
+                               } else {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_COMMENT,
+                                               $this->getUser()
+                                       ) ) {
+                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       default:
+                               throw new MWException( "Unknown field '$field'" );
+               }
+
+               return $formatted;
+       }
+
+       function getQueryInfo() {
+               $conds = $this->mConds;
+               $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
+                       ' OR pr_expiry IS NULL';
+               $conds[] = 'page_id=pr_page';
+               $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
+
+               if ( $this->sizetype == 'min' ) {
+                       $conds[] = 'page_len>=' . $this->size;
+               } elseif ( $this->sizetype == 'max' ) {
+                       $conds[] = 'page_len<=' . $this->size;
+               }
+
+               if ( $this->indefonly ) {
+                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
+               }
+               if ( $this->cascadeonly ) {
+                       $conds[] = 'pr_cascade = 1';
+               }
+               if ( $this->noredirect ) {
+                       $conds[] = 'page_is_redirect = 0';
+               }
+
+               if ( $this->level ) {
+                       $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
+               }
+               if ( !is_null( $this->namespace ) ) {
+                       $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+               }
+
+               return [
+                       'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
+                       'fields' => [
+                               'pr_id',
+                               'page_namespace',
+                               'page_title',
+                               'page_len',
+                               'pr_type',
+                               'pr_level',
+                               'pr_expiry',
+                               'pr_cascade',
+                               'log_timestamp',
+                               'log_user',
+                               'log_comment',
+                               'log_deleted',
+                       ],
+                       'conds' => $conds,
+                       'join_conds' => [
+                               'log_search' => [
+                                       'LEFT JOIN', [
+                                               'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
+                                       ]
+                               ],
+                               'logging' => [
+                                       'LEFT JOIN', [
+                                               'ls_log_id = log_id'
+                                       ]
+                               ]
+                       ]
+               ];
+       }
+
+       protected function getTableClass() {
+               return parent::getTableClass() . ' mw-protectedpages';
+       }
+
+       function getIndexField() {
+               return 'pr_id';
+       }
+
+       function getDefaultSort() {
+               return 'pr_id';
+       }
+
+       function isFieldSortable( $field ) {
+               // no index for sorting exists
+               return false;
+       }
+}
index 12039aa..d599599 100644 (file)
@@ -164,7 +164,7 @@ class UsersPager extends AlphabeticPager {
         * @return string
         */
        function formatRow( $row ) {
-               if ( $row->user_id == 0 ) { # Bug 16487
+               if ( $row->user_id == 0 ) { # T18487
                        return '';
                }
 
index 8da1553..3467b49 100644 (file)
@@ -1824,7 +1824,7 @@ class Balancer {
         * Regex borrowed from Tim Starling's "remex-html" project.
         */
        const VALID_COMMENT_REGEX = "~ !--
-               (                             # 1. Comment match detector
+               (                           # 1. Comment match detector
                        > | -> | # Invalid short close
                        (                         # 2. Comment contents
                                (?:
@@ -1839,15 +1839,15 @@ class Balancer {
                        (                         # 3. Comment close
                                --> |   # Normal close
                                --!> |  # Comment end bang
-                               (                     # 4. Indicate matches requiring EOF
-                                       --! |   # EOF in comment end bang state
-                                       -- |    # EOF in comment end state
-                                       -  |    # EOF in comment end dash state
-                                               # EOF in comment state
+                               (                       # 4. Indicate matches requiring EOF
+                                       --! |                   # EOF in comment end bang state
+                                       -- |                    # EOF in comment end state
+                                       -  |                    # EOF in comment end dash state
+                                       (?#nothing)             # EOF in comment state
                                )
                        )
                )
-               ([^<]*) \z                    # 5. Non-tag text after the comment
+               ([^<]*) \z                  # 5. Non-tag text after the comment
                ~xs";
 
        /**
index 79166ef..733c4ff 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Upload
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * @defgroup Upload Upload related
@@ -297,7 +298,7 @@ abstract class UploadBase {
         * @param string $srcPath The source path
         * @return string|bool The real path if it was a virtual URL Returns false on failure
         */
-       function getRealPath( $srcPath ) {
+       public function getRealPath( $srcPath ) {
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        /** @todo Just make uploads work with storage paths UploadFromStash
@@ -560,7 +561,7 @@ abstract class UploadBase {
         *
         * @param array $entry
         */
-       function zipEntryCallback( $entry ) {
+       public function zipEntryCallback( $entry ) {
                $names = [ $entry['name'] ];
 
                // If there is a null character, cut off the name at it, because JDK's
@@ -895,7 +896,7 @@ abstract class UploadBase {
                        return $this->mTitle;
                }
 
-               // Windows may be broken with special characters, see bug 1780
+               // Windows may be broken with special characters, see T3780
                if ( !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() )
                        && !RepoGroup::singleton()->getLocalRepo()->backendSupportsUnicodePaths()
                ) {
@@ -1209,7 +1210,7 @@ abstract class UploadBase {
                }
 
                // Some browsers will interpret obscure xml encodings as UTF-8, while
-               // PHP/expat will interpret the given encoding in the xml declaration (bug 47304)
+               // PHP/expat will interpret the given encoding in the xml declaration (T49304)
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
                                return true;
@@ -1361,8 +1362,8 @@ abstract class UploadBase {
                        [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
                );
                if ( $check->wellFormed !== true ) {
-                       // Invalid xml (bug 58553)
-                       // But only when non-partial (bug 65724)
+                       // Invalid xml (T60553)
+                       // But only when non-partial (T67724)
                        return $partial ? false : [ 'uploadinvalidxml' ];
                } elseif ( $check->filterMatch ) {
                        if ( $this->mSVGNSError ) {
@@ -1382,7 +1383,7 @@ abstract class UploadBase {
         * @return bool (true if the filter identified something bad)
         */
        public static function checkSvgPICallback( $target, $data ) {
-               // Don't allow external stylesheets (bug 57550)
+               // Don't allow external stylesheets (T59550)
                if ( preg_match( '/xml-stylesheet/i', $target ) ) {
                        return [ 'upload-scripted-pi-callback' ];
                }
@@ -1401,7 +1402,7 @@ abstract class UploadBase {
                list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
 
                // We specifically don't include:
-               // http://www.w3.org/1999/xhtml (bug 60771)
+               // http://www.w3.org/1999/xhtml (T62771)
                static $validNamespaces = [
                        '',
                        'adobe:ns:meta/',
@@ -2083,7 +2084,7 @@ abstract class UploadBase {
        public static function getSessionStatus( User $user, $statusKey ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               return ObjectCache::getMainStashInstance()->get( $key );
+               return MediaWikiServices::getInstance()->getMainObjectStash()->get( $key );
        }
 
        /**
@@ -2099,7 +2100,7 @@ abstract class UploadBase {
        public static function setSessionStatus( User $user, $statusKey, $value ) {
                $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               $cache = ObjectCache::getMainStashInstance();
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
index c1aef22..4ee256c 100644 (file)
@@ -176,7 +176,7 @@ class PasswordReset implements LoggerAwareInterface {
                $firstUser = $users[0];
 
                if ( !$firstUser instanceof User || !$firstUser->getId() ) {
-                       // Don't parse username as wikitext (bug 65501)
+                       // Don't parse username as wikitext (T67501)
                        return StatusValue::newFatal( wfMessage( 'nosuchuser', wfEscapeWikiText( $username ) ) );
                }
 
@@ -192,7 +192,7 @@ class PasswordReset implements LoggerAwareInterface {
                                wfEscapeWikiText( $firstUser->getName() ) ) );
                }
 
-               // We need to have a valid IP address for the hook, but per bug 18347, we should
+               // We need to have a valid IP address for the hook, but per T20347, we should
                // send the user's name if they're logged in.
                $ip = $performingUser->getRequest()->getIP();
                if ( !$ip ) {
index 6804df2..0acdb55 100644 (file)
@@ -949,7 +949,7 @@ class User implements IDBAccessObject {
 
                // Ensure that the username isn't longer than 235 bytes, so that
                // (at least for the builtin skins) user javascript and css files
-               // will work. (bug 23080)
+               // will work. (T25080)
                if ( strlen( $name ) > 235 ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to length" );
@@ -1074,7 +1074,7 @@ class User implements IDBAccessObject {
                }
 
                // Clean up name according to title rules,
-               // but only when validation is requested (bug 12654)
+               // but only when validation is requested (T14654)
                $t = ( $validate !== false ) ?
                        Title::newFromText( $name, NS_USER ) : Title::makeTitle( NS_USER, $name );
                // Check for invalid titles
@@ -1637,29 +1637,9 @@ class User implements IDBAccessObject {
                // User/IP blocking
                $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
-               // If no block has been found, check for a cookie indicating that the user is blocked.
-               $blockCookieVal = (int)$this->getRequest()->getCookie( 'BlockID' );
-               if ( !$block instanceof Block && $blockCookieVal > 0 ) {
-                       // Load the Block from the ID in the cookie.
-                       $tmpBlock = Block::newFromID( $blockCookieVal );
-                       if ( $tmpBlock instanceof Block ) {
-                               // Check the validity of the block.
-                               $blockIsValid = $tmpBlock->getType() == Block::TYPE_USER
-                                       && !$tmpBlock->isExpired()
-                                       && $tmpBlock->isAutoblocking();
-                               $config = RequestContext::getMain()->getConfig();
-                               $useBlockCookie = ( $config->get( 'CookieSetOnAutoblock' ) === true );
-                               if ( $blockIsValid && $useBlockCookie ) {
-                                       // Use the block.
-                                       $block = $tmpBlock;
-                                       $this->blockTrigger = 'cookie-block';
-                               } else {
-                                       // If the block is not valid, clear the block cookie (but don't delete it,
-                                       // because it needs to be cleared from LocalStorage as well and an empty string
-                                       // value is checked for in the mediawiki.user.blockcookie module).
-                                       $tmpBlock->setCookie( $this->getRequest()->response(), true );
-                               }
-                       }
+               // Cookie blocking
+               if ( !$block instanceof Block ) {
+                       $block = $this->getBlockFromCookieValue( $this->getRequest()->getCookie( 'BlockID' ) );
                }
 
                // Proxy blocking
@@ -1684,7 +1664,7 @@ class User implements IDBAccessObject {
                        }
                }
 
-               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
                if ( !$block instanceof Block
                        && $wgApplyIpBlocksToXff
                        && $ip !== null
@@ -1738,6 +1718,43 @@ class User implements IDBAccessObject {
                Hooks::run( 'GetBlockedStatus', [ &$user ] );
        }
 
+       /**
+        * Try to load a Block from an ID given in a cookie value.
+        * @param string|null $blockCookieVal The cookie value to check.
+        * @return Block|bool The Block object, or false if none could be loaded.
+        */
+       protected function getBlockFromCookieValue( $blockCookieVal ) {
+               // Make sure there's something to check. The cookie value must start with a number.
+               if ( strlen( $blockCookieVal ) < 1 || !is_numeric( substr( $blockCookieVal, 0, 1 ) ) ) {
+                       return false;
+               }
+               // Load the Block from the ID in the cookie.
+               $blockCookieId = Block::getIdFromCookieValue( $blockCookieVal );
+               if ( $blockCookieId !== null ) {
+                       // An ID was found in the cookie.
+                       $tmpBlock = Block::newFromID( $blockCookieId );
+                       if ( $tmpBlock instanceof Block ) {
+                               // Check the validity of the block.
+                               $blockIsValid = $tmpBlock->getType() == Block::TYPE_USER
+                                       && !$tmpBlock->isExpired()
+                                       && $tmpBlock->isAutoblocking();
+                               $config = RequestContext::getMain()->getConfig();
+                               $useBlockCookie = ( $config->get( 'CookieSetOnAutoblock' ) === true );
+                               if ( $blockIsValid && $useBlockCookie ) {
+                                       // Use the block.
+                                       $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 );
+                               }
+                       }
+               }
+               return false;
+       }
+
        /**
         * Whether the given IP is in a DNS blacklist.
         *
@@ -1770,7 +1787,7 @@ class User implements IDBAccessObject {
                $found = false;
                // @todo FIXME: IPv6 ???  (https://bugs.php.net/bug.php?id=33170)
                if ( IP::isIPv4( $ip ) ) {
-                       // Reverse IP, bug 21255
+                       // Reverse IP, T23255
                        $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
 
                        foreach ( (array)$bases as $base ) {
@@ -1845,7 +1862,7 @@ class User implements IDBAccessObject {
         */
        public function isPingLimitable() {
                global $wgRateLimitsExcludedIPs;
-               if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
+               if ( IP::isInRanges( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
                        // No other good way currently to disable rate limits
                        // for specific IPs. :P
                        // But this is a crappy hack and should die.
@@ -3753,6 +3770,42 @@ class User implements IDBAccessObject {
                // user_talk page; it's cleared one page view later in WikiPage::doViewUpdates().
        }
 
+       /**
+        * Compute experienced level based on edit count and registration date.
+        *
+        * @return string 'newcomer', 'learner', or 'experienced'
+        */
+       public function getExperienceLevel() {
+               global $wgLearnerEdits,
+                       $wgExperiencedUserEdits,
+                       $wgLearnerMemberSince,
+                       $wgExperiencedUserMemberSince;
+
+               if ( $this->isAnon() ) {
+                       return false;
+               }
+
+               $editCount = $this->getEditCount();
+               $registration = $this->getRegistration();
+               $now = time();
+               $learnerRegistration = wfTimestamp( TS_MW, $now - $wgLearnerMemberSince * 86400 );
+               $experiencedRegistration = wfTimestamp( TS_MW, $now - $wgExperiencedUserMemberSince * 86400 );
+
+               if (
+                       $editCount < $wgLearnerEdits ||
+                       $registration > $learnerRegistration
+               ) {
+                       return 'newcomer';
+               } elseif (
+                       $editCount > $wgExperiencedUserEdits &&
+                       $registration <= $experiencedRegistration
+               ) {
+                       return 'experienced';
+               } else {
+                       return 'learner';
+               }
+       }
+
        /**
         * Set a cookie on the user's client. Wrapper for
         * WebResponse::setCookie
@@ -4072,7 +4125,7 @@ class User implements IDBAccessObject {
         *   }
         *   // do something with $user...
         *
-        * However, this was vulnerable to a race condition (bug 16020). By
+        * However, this was vulnerable to a race condition (T18020). By
         * initialising the user object if the user exists, we aim to support this
         * calling sequence as far as possible.
         *
@@ -4185,7 +4238,7 @@ class User implements IDBAccessObject {
                        return $this->mBlock;
                }
 
-               # bug 13611: if the IP address the user is trying to create an account from is
+               # T15611: if the IP address the user is trying to create an account from is
                # blocked with createaccount disabled, prevent new account creation there even
                # when the user is logged in
                if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
@@ -4478,7 +4531,7 @@ class User implements IDBAccessObject {
         * @note Since these URLs get dropped directly into emails, using the
         * short English names avoids insanely long URL-encoded links, which
         * also sometimes can get corrupted in some browsers/mailers
-        * (bug 6957 with Gmail and Internet Explorer).
+        * (T8957 with Gmail and Internet Explorer).
         *
         * @param string $page Special page
         * @param string $token Token
@@ -5338,7 +5391,7 @@ class User implements IDBAccessObject {
                # Note that the pattern requirement will always be satisfied if the
                # input is empty, so we need required in all cases.
 
-               # @todo FIXME: Bug 23769: This needs to not claim the password is required
+               # @todo FIXME: T25769: This needs to not claim the password is required
                # if e-mail confirmation is being used.  Since HTML5 input validation
                # is b0rked anyway in some browsers, just return nothing.  When it's
                # re-enabled, fix this code to not output required for e-mail
index dddc850..ab6683b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 abstract class UserArray implements Iterator {
        /**
         * @param ResultWrapper $res
@@ -38,7 +40,7 @@ abstract class UserArray implements Iterator {
 
        /**
         * @param array $ids
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromIDs( $ids ) {
                $ids = array_map( 'intval', (array)$ids ); // paranoia
@@ -59,7 +61,7 @@ abstract class UserArray implements Iterator {
        /**
         * @since 1.25
         * @param array $names
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromNames( $names ) {
                $names = array_map( 'strval', (array)$names ); // paranoia
index fb533d0..527df7f 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class UserArrayFromResult extends UserArray implements Countable {
        /** @var ResultWrapper */
        public $res;
@@ -27,7 +29,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        /** @var int */
        public $key;
 
-       /** @var bool|stdClass */
+       /** @var bool|User */
        public $current;
 
        /**
index bb0b7d2..59ca31c 100644 (file)
@@ -313,7 +313,7 @@ class UserGroupMembership {
         * @param IDatabase|null $db Optional database connection
         * @return array Associative array of (group name => UserGroupMembership object)
         */
-       public static function getMembershipsForUser( $userId, $db = null ) {
+       public static function getMembershipsForUser( $userId, IDatabase $db = null ) {
                if ( !$db ) {
                        $db = wfGetDB( DB_REPLICA );
                }
index 23c2177..d801fa0 100644 (file)
@@ -198,15 +198,7 @@ class UserRightsProxy {
         * @return array
         */
        function getGroups() {
-               $res = $this->db->select( 'user_groups',
-                       [ 'ug_group' ],
-                       [ 'ug_user' => $this->id ],
-                       __METHOD__ );
-               $groups = [];
-               foreach ( $res as $row ) {
-                       $groups[] = $row->ug_group;
-               }
-               return $groups;
+               return array_keys( self::getGroupMemberships() );
        }
 
        /**
@@ -216,15 +208,7 @@ class UserRightsProxy {
         * @since 1.29
         */
        function getGroupMemberships() {
-               $res = $this->db->select( 'user_groups',
-                       UserGroupMembership::selectFields(),
-                       [ 'ug_user' => $this->id ],
-                       __METHOD__ );
-               $ugms = [];
-               foreach ( $res as $row ) {
-                       $ugms[$row->ug_group] = UserGroupMembership::newFromRow( $row );
-               }
-               return $ugms;
+               return UserGroupMembership::getMembershipsForUser( $this->id, $this->db );
        }
 
        /**
index 319b5d4..1dac0b1 100644 (file)
@@ -152,7 +152,7 @@ class AutoloadGenerator {
                ksort( $json[$key] );
 
                // Return the whole JSON file
-               return FormatJson::encode( $json, true ) . "\n";
+               return FormatJson::encode( $json, "\t", FormatJson::ALL_OK ) . "\n";
        }
 
        /**
@@ -291,10 +291,6 @@ EOD;
                foreach ( glob( $this->basepath . '/*.php' ) as $file ) {
                        $this->readFile( $file );
                }
-
-               // Legacy aliases
-               $this->forceClassPath( 'DatabaseBase',
-                       $this->basepath . '/includes/libs/rdbms/database/Database.php' );
        }
 }
 
@@ -323,6 +319,11 @@ class ClassCollector {
         */
        protected $tokens;
 
+       /**
+        * @var array Class alias with target/name fields
+        */
+       protected $alias;
+
        /**
         * @var string $code PHP code (including <?php) to detect class names from
         * @return array List of FQCN detected within the tokens
@@ -331,6 +332,7 @@ class ClassCollector {
                $this->namespace = '';
                $this->classes = [];
                $this->startToken = null;
+               $this->alias = null;
                $this->tokens = [];
 
                foreach ( token_get_all( $code ) as $token ) {
@@ -353,6 +355,8 @@ class ClassCollector {
                if ( is_string( $token ) ) {
                        return;
                }
+               // Note: When changing class name discovery logic,
+               // AutoLoaderTest.php may also need to be updated.
                switch ( $token[0] ) {
                case T_NAMESPACE:
                case T_CLASS:
@@ -360,6 +364,12 @@ class ClassCollector {
                case T_TRAIT:
                case T_DOUBLE_COLON:
                        $this->startToken = $token;
+                       break;
+               case T_STRING:
+                       if ( $token[1] === 'class_alias' ) {
+                               $this->startToken = $token;
+                               $this->alias = [];
+                       }
                }
        }
 
@@ -383,6 +393,58 @@ class ClassCollector {
                        }
                        break;
 
+               case T_STRING:
+                       if ( $this->alias !== null ) {
+                               // Flow 1 - Two string literals:
+                               // - T_STRING  class_alias
+                               // - '('
+                               // - T_CONSTANT_ENCAPSED_STRING 'TargetClass'
+                               // - ','
+                               // - T_WHITESPACE
+                               // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
+                               // - ')'
+                               // Flow 2 - Use of ::class syntax for first parameter
+                               // - T_STRING  class_alias
+                               // - '('
+                               // - T_STRING TargetClass
+                               // - T_DOUBLE_COLON ::
+                               // - T_CLASS class
+                               // - ','
+                               // - T_WHITESPACE
+                               // - T_CONSTANT_ENCAPSED_STRING 'AliasName'
+                               // - ')'
+                               if ( $token === '(' ) {
+                                       // Start of a function call to class_alias()
+                                       $this->alias = [ 'target' => false, 'name' => false ];
+                               } elseif ( $token === ',' ) {
+                                       // Record that we're past the first parameter
+                                       if ( $this->alias['target'] === false ) {
+                                               $this->alias['target'] = true;
+                                       }
+                               } elseif ( is_array( $token ) && $token[0] === T_CONSTANT_ENCAPSED_STRING ) {
+                                       if ( $this->alias['target'] === true ) {
+                                               // We already saw a first argument, this must be the second.
+                                               // Strip quotes from the string literal.
+                                               $this->alias['name'] = substr( $token[1], 1, -1 );
+                                       }
+                               } elseif ( $token === ')' ) {
+                                       // End of function call
+                                       $this->classes[] = $this->alias['name'];
+                                       $this->alias = null;
+                                       $this->startToken = null;
+                               } elseif ( !is_array( $token ) || (
+                                       $token[0] !== T_STRING &&
+                                       $token[0] !== T_DOUBLE_COLON &&
+                                       $token[0] !== T_CLASS &&
+                                       $token[0] !== T_WHITESPACE
+                               ) ) {
+                                       // Ignore this call to class_alias() - compat/Timestamp.php
+                                       $this->alias = null;
+                                       $this->startToken = null;
+                               }
+                       }
+                       break;
+
                case T_CLASS:
                case T_INTERFACE:
                case T_TRAIT:
index ef2c14a..43bccba 100644 (file)
@@ -230,7 +230,7 @@ class BatchRowIterator implements RecursiveIterator {
         * `=` conditions while the final key uses a `>` condition
         *
         * Example output:
-        *        [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
+        *     [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
         *
         * @return array The SQL conditions necessary to select the next set
         *  of rows in the batched query
index 3bddd77..1c8d486 100644 (file)
@@ -47,11 +47,11 @@ class MWCryptHKDF {
         * From http://eprint.iacr.org/2010/264.pdf:
         *
         * The scheme HKDF is specifed as:
-        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        *   HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
         * where the values K(i) are defined as follows:
-        *      PRK = HMAC(XTS, SKM)
-        *      K(1) = HMAC(PRK, CTXinfo || 0);
-        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        *   PRK = HMAC(XTS, SKM)
+        *   K(1) = HMAC(PRK, CTXinfo || 0);
+        *   K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
         * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
         * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
         * Note that the length of the HMAC output is the same as its key length and therefore
index f011f0b..507dab6 100644 (file)
@@ -19,6 +19,7 @@ class DateInputWidget extends \OOUI\TextInputWidget {
 
        protected $inputFormat = null;
        protected $displayFormat = null;
+       protected $longDisplayFormat = null;
        protected $placeholderLabel = null;
        protected $placeholderDateFormat = null;
        protected $precision = null;
@@ -36,6 +37,9 @@ class DateInputWidget extends \OOUI\TextInputWidget {
         *   while the widget is inactive. Should be as unambiguous as possible (for example, prefer
         *   to spell out the month, rather than rely on the order), even if that makes it longer.
         *   Applicable only if the widget is infused. (default: language-specific)
+        * @param string $config['longDisplayFormat'] If a custom displayFormat is not specified, use
+        *   unabbreviated day of the week and month names in the default language-specific
+        *   displayFormat. (default: false)
         * @param string $config['placeholderLabel'] Placeholder text shown when the widget is not
         *   selected. Applicable only if the widget is infused. (default: taken from message
         *   `mw-widgets-dateinput-no-date`)
@@ -58,6 +62,7 @@ class DateInputWidget extends \OOUI\TextInputWidget {
                $config = array_merge( [
                        // Default config values
                        'precision' => 'day',
+                       'longDisplayFormat' => false,
                ], $config );
 
                // Properties
@@ -79,6 +84,9 @@ class DateInputWidget extends \OOUI\TextInputWidget {
                if ( isset( $config['displayFormat'] ) ) {
                        $this->displayFormat = $config['displayFormat'];
                }
+               if ( isset( $config['longDisplayFormat'] ) ) {
+                       $this->longDisplayFormat = $config['longDisplayFormat'];
+               }
                if ( isset( $config['placeholderLabel'] ) ) {
                        $this->placeholderLabel = $config['placeholderLabel'];
                }
@@ -134,6 +142,9 @@ class DateInputWidget extends \OOUI\TextInputWidget {
                if ( $this->displayFormat !== null ) {
                        $config['displayFormat'] = $this->displayFormat;
                }
+               if ( $this->longDisplayFormat !== null ) {
+                       $config['longDisplayFormat'] = $this->longDisplayFormat;
+               }
                if ( $this->placeholderLabel !== null ) {
                        $config['placeholderLabel'] = $this->placeholderLabel;
                }
diff --git a/includes/widget/UsersMultiselectWidget.php b/includes/widget/UsersMultiselectWidget.php
new file mode 100644 (file)
index 0000000..d24ab7b
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * MediaWiki Widgets – UsersMultiselectWidget class.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+use \OOUI\TextInputWidget;
+
+/**
+ * Widget to select multiple users.
+ */
+class UsersMultiselectWidget extends \OOUI\Widget {
+
+       protected $usersArray = [];
+       protected $inputName = null;
+       protected $inputPlaceholder = null;
+
+       /**
+        * @param array $config Configuration options
+        * @param array $config['users'] Array of usernames to use as preset data
+        * @param array $config['placeholder'] Placeholder message for input
+        * @param array $config['name'] Name attribute (used in forms)
+        */
+       public function __construct( array $config = [] ) {
+               parent::__construct( $config );
+
+               // Properties
+               if ( isset( $config['default'] ) ) {
+                       $this->usersArray = $config['default'];
+               }
+               if ( isset( $config['name'] ) ) {
+                       $this->inputName = $config['name'];
+               }
+               if ( isset( $config['placeholder'] ) ) {
+                       $this->inputPlaceholder = $config['placeholder'];
+               }
+
+               $textarea = new TextInputWidget( [
+                       'name' => $this->inputName,
+                       'multiline' => true,
+                       'value' => implode( "\n", $this->usersArray ),
+                       'rows' => 25,
+               ] );
+               $this->prependContent( $textarea );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.UsersMultiselectWidget';
+       }
+
+       public function getConfig( &$config ) {
+               if ( $this->usersArray !== null ) {
+                       $config['data'] = $this->usersArray;
+               }
+               if ( $this->inputName !== null ) {
+                       $config['name'] = $this->inputName;
+               }
+               if ( $this->inputPlaceholder !== null ) {
+                       $config['placeholder'] = $this->inputPlaceholder;
+               }
+
+               return parent::getConfig( $config );
+       }
+
+}
index 2c31bd2..07094af 100644 (file)
@@ -22,7 +22,7 @@ class BasicSearchResultSetWidget {
        public function __construct(
                SpecialSearch $specialPage,
                SearchResultWidget $resultWidget,
-               InterwikiSearchResultSetWidget $sidebarWidget
+               SearchResultSetWidget $sidebarWidget
        ) {
                $this->specialPage = $specialPage;
                $this->resultWidget = $resultWidget;
index c738483..76b9b01 100644 (file)
@@ -7,13 +7,14 @@ use MediaWiki\Linker\LinkRenderer;
 use SearchResultSet;
 use SpecialSearch;
 use Title;
+use Html;
 
 /**
  * Renders one or more SearchResultSets into a sidebar grouped by
  * interwiki prefix. Includes a per-wiki header indicating where
  * the results are from.
  */
-class InterwikiSearchResultSetWidget {
+class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
        /** @var SpecialSearch */
        protected $specialSearch;
        /** @var SearchResultWidget */
@@ -24,6 +25,10 @@ class InterwikiSearchResultSetWidget {
        protected $linkRenderer;
        /** @var InterwikiLookup */
        protected $iwLookup;
+       /** @var $output */
+       protected $output;
+       /** @var $iwPrefixDisplayTypes */
+       protected $iwPrefixDisplayTypes;
 
        public function __construct(
                SpecialSearch $specialSearch,
@@ -35,8 +40,11 @@ class InterwikiSearchResultSetWidget {
                $this->resultWidget = $resultWidget;
                $this->linkRenderer = $linkRenderer;
                $this->iwLookup = $iwLookup;
+               $this->output = $specialSearch->getOutput();
+               $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get(
+                       'InterwikiPrefixDisplayTypes'
+               );
        }
-
        /**
         * @param string $term User provided search term
         * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
@@ -50,6 +58,9 @@ class InterwikiSearchResultSetWidget {
 
                $this->loadCustomCaptions();
 
+               $this->output->addModules( 'mediawiki.special.search.commonsInterwikiWidget' );
+               $this->output->addModuleStyles( 'mediawiki.special.search.interwikiwidget.styles' );
+
                $iwResults = [];
                foreach ( $resultSets as $resultSet ) {
                        $result = $resultSet->next();
@@ -61,56 +72,99 @@ class InterwikiSearchResultSetWidget {
                        }
                }
 
-               $out = '';
+               $iwResultSetPos = 1;
+               $iwResultListOutput = '';
+
                foreach ( $iwResults as $iwPrefix => $results ) {
-                       $out .= $this->headerHtml( $iwPrefix, $term );
-                       $out .= "<ul class='mw-search-iwresults'>";
                        // TODO: Assumes interwiki results are never paginated
                        $position = 0;
+                       $iwResultItemOutput = '';
+
+                       $iwDisplayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] )
+                               ? $this->iwPrefixDisplayTypes[$iwPrefix]
+                               : "";
+
                        foreach ( $results as $result ) {
-                               $out .= $this->resultWidget->render( $result, $term, $position++ );
+                               $iwResultItemOutput .= $this->resultWidget->render( $result, $term, $position++ );
                        }
-                       $out .= "</ul>";
+
+                       $headerHtml = $this->headerHtml( $term, $iwPrefix );
+                       $footerHtml = $this->footerHtml( $term, $iwPrefix );
+                       $iwResultListOutput .= Html::rawElement( 'li',
+                               [
+                                       'class' => 'iw-resultset iw-resultset--' . $iwDisplayType,
+                                       'data-iw-resultset-pos' => $iwResultSetPos
+                               ],
+                               $headerHtml .
+                               $iwResultItemOutput .
+                               $footerHtml
+                       );
+
+                       $iwResultSetPos++;
                }
 
-               return
-                       "<div id='mw-search-interwiki'>" .
-                               "<div id='mw-search-interwiki-caption'>" .
-                                       $this->specialSearch->msg( 'search-interwiki-caption' )->text() .
-                               '</div>' .
-                               $out .
-                       "</div>";
+               return Html::rawElement(
+                       'div',
+                       [ 'id' => 'mw-interwiki-results' ],
+                       Html::rawElement(
+                               'p',
+                               [ 'class' => 'iw-headline' ],
+                               $this->specialSearch->msg( 'search-interwiki-caption' )->parse()
+                       ) .
+                       Html::rawElement(
+                               'ul', [ 'class' => 'iw-results', ], $iwResultListOutput
+                       )
+               );
        }
 
        /**
         * Generates an appropriate HTML header for the given interwiki prefix
         *
-        * @param string $iwPrefix Interwiki prefix of wiki to show header for
         * @param string $term User provided search term
+        * @param string $iwPrefix Interwiki prefix of wiki to show header for
         * @return string HTML
         */
-       protected function headerHtml( $iwPrefix, $term ) {
+       protected function headerHtml( $term, $iwPrefix ) {
+
+               $iwDisplayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] )
+                       ? $this->iwPrefixDisplayTypes[$iwPrefix]
+                       : "";
+
                if ( isset( $this->customCaptions[$iwPrefix] ) ) {
+                       /* customCaptions composed by loadCustomCaptions() with pre-escaped content.*/
                        $caption = $this->customCaptions[$iwPrefix];
                } else {
                        $interwiki = $this->iwLookup->fetch( $iwPrefix );
                        $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
-                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->text();
+                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped();
                }
-               $searchLink = $this->linkRenderer->makeLink(
-                       Title::newFromText( "$iwPrefix:Special:Search" ),
-                       $this->specialSearch->msg( 'search-interwiki-more' )->text(),
-                       [],
-                       [
-                               'search' => $term,
-                               'fulltext' => 1,
-                       ]
+
+               return Html::rawElement( 'div', [ 'class' => 'iw-result__header' ],
+                       Html::rawElement( 'span', [ 'class' => 'iw-result__icon iw-result__icon--' . $iwDisplayType ] )
+                       . $caption
                );
-               return
-                       "<div class='mw-search-interwiki-project'>" .
-                               "<span class='mw-search-interwiki-more'>{$searchLink}</span>" .
-                               $caption .
-               "</div>";
+       }
+
+       /**
+        * Generates an HTML footer for the given interwiki prefix
+        *
+        * @param string $term User provided search term
+        * @param string $iwPrefix Interwiki prefix of wiki to show footer for
+        * @return string HTML
+        */
+       protected function footerHtml( $term, $iwPrefix ) {
+
+               $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL(
+                       [ 'search' => $term, 'fulltext' => 1 ]
+               );
+
+               $searchLink = Html::rawElement(
+                       'a',
+                       [ 'href' => $href ],
+                       $this->specialSearch->msg( 'search-interwiki-more' )->escaped()
+               );
+
+               return Html::rawElement( 'div', [ 'class' => 'iw-result__footer' ], $searchLink );
        }
 
        protected function loadCustomCaptions() {
@@ -119,7 +173,7 @@ class InterwikiSearchResultSetWidget {
                }
 
                $this->customCaptions = [];
-               $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->text() );
+               $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() );
                foreach ( $customLines as $line ) {
                        $parts = explode( ':', $line, 2 );
                        if ( count( $parts ) === 2 ) {
diff --git a/includes/widget/search/InterwikiSearchResultWidget.php b/includes/widget/search/InterwikiSearchResultWidget.php
new file mode 100644 (file)
index 0000000..6b51db5
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use HtmlArmor;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResult;
+use SpecialSearch;
+use Title;
+use Html;
+
+/**
+ * Renders an enhanced interwiki result
+ */
+class InterwikiSearchResultWidget implements SearchResultWidget {
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+       /** @var $iwPrefixDisplayTypes */
+       protected $iwPrefixDisplayTypes;
+
+       public function __construct( SpecialSearch $specialSearch, LinkRenderer $linkRenderer ) {
+               $this->specialSearch = $specialSearch;
+               $this->linkRenderer = $linkRenderer;
+               $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get( 'InterwikiPrefixDisplayTypes' );
+       }
+
+       /**
+        * @param SearchResult $result The result to render
+        * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet)
+        * @param int $position The result position, including offset
+        * @return string HTML
+        */
+       public function render( SearchResult $result, $terms, $position ) {
+
+               $title = $result->getTitle();
+               $iwPrefix = $result->getTitle()->getInterwiki();
+               $titleSnippet = $result->getTitleSnippet();
+               $snippet = $result->getTextSnippet( $terms );
+               $displayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] )
+                       ? $this->iwPrefixDisplayTypes[$iwPrefix]
+                       : "";
+
+               if ( $titleSnippet ) {
+                       $titleSnippet = new HtmlArmor( $titleSnippet );
+               } else {
+                       $titleSnippet = null;
+               }
+
+               $link = $this->linkRenderer->makeLink( $title, $titleSnippet );
+
+               $redirectTitle = $result->getRedirectTitle();
+               $redirect = '';
+               if ( $redirectTitle !== null ) {
+
+                       $redirectText = $result->getRedirectSnippet();
+
+                       if ( $redirectText ) {
+                               $redirectText = new HtmlArmor( $redirectText );
+                       } else {
+                               $redirectText = null;
+                       }
+
+                       $redirect = Html::rawElement( 'span', [ 'class' => 'iw-result__redirect' ],
+                               $this->specialSearch->msg( 'search-redirect' )->rawParams(
+                                       $this->linkRenderer->makeLink( $redirectTitle, $redirectText )
+                               )->escaped()
+                       );
+               }
+
+               switch ( $displayType ) {
+                       case 'definition':
+                               return "<div class='iw-result__content'>" .
+                                       "<span class='iw-result__title'>{$link} {$redirect}: </span>" .
+                                       $snippet .
+                               "</div>";
+                       case 'quotation':
+                               return "<div class='iw-result__content'>{$snippet}</div>" .
+                                       "<div class='iw-result__title'>{$link} {$redirect}</div>";
+                       default:
+                               return "<div class='iw-result__title'>{$link} {$redirect}</div>" .
+                                       "<div class='iw-result__content'>{$snippet}</div>";
+               }
+       }
+}
index e223b95..a7407a0 100644 (file)
@@ -79,6 +79,8 @@ class SearchFormWidget {
         * @return string HTML
         */
        protected function shortDialogHtml( $profile, $term, $numResults, $totalResults, $offset ) {
+               $html = '';
+
                $searchWidget = new SearchInputWidget( [
                        'id' => 'searchText',
                        'name' => 'search',
@@ -96,11 +98,7 @@ class SearchFormWidget {
                        'align' => 'top',
                ] );
 
-               $html =
-                       Html::hidden( 'title', $this->specialSearch->getPageTitle()->getPrefixedText() ) .
-                       Html::hidden( 'profile', $profile ) .
-                       Html::hidden( 'fulltext', '1' ) .
-                       $layout;
+               $html .= $layout;
 
                if ( $totalResults > 0 && $offset < $totalResults ) {
                        $html .= Xml::tags(
@@ -113,6 +111,11 @@ class SearchFormWidget {
                        );
                }
 
+               $html .=
+                       Html::hidden( 'title', $this->specialSearch->getPageTitle()->getPrefixedText() ) .
+                       Html::hidden( 'profile', $profile ) .
+                       Html::hidden( 'fulltext', '1' );
+
                return $html;
        }
 
@@ -203,16 +206,13 @@ class SearchFormWidget {
         */
        protected function optionsHtml( $term, $isPowerSearch, $profile ) {
                $html = '';
-               $opts = [
-                       'profile' => $profile,
-               ];
 
                if ( $isPowerSearch ) {
-                       $html .= $this->powerSearchBox( $term, $opts );
+                       $html .= $this->powerSearchBox( $term, [] );
                } else {
                        $form = '';
                        Hooks::run( 'SpecialSearchProfileForm', [
-                               $this->specialSearch, &$form, $profile, $term, $opts
+                               $this->specialSearch, &$form, $profile, $term, []
                        ] );
                        $html .= $form;
                }
@@ -297,7 +297,7 @@ class SearchFormWidget {
                return
                        "<fieldset id='mw-searchoptions'>" .
                                "<legend>" . $this->specialSearch->msg( 'powersearch-legend' )->escaped() . '</legend>' .
-                               "<h4>" . $this->specialSearch->msg( 'powersearch-ns' )->escaped() . '</h4>' .
+                               "<h4>" . $this->specialSearch->msg( 'powersearch-ns' )->parse() . '</h4>' .
                                // populated by js if available
                                "<div id='mw-search-togglebox'></div>" .
                                $divider .
diff --git a/includes/widget/search/SearchResultSetWidget.php b/includes/widget/search/SearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..6df6e65
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use SearchResultSet;
+
+/**
+ * Renders a set of search results to HTML
+ */
+interface SearchResultSetWidget {
+       /**
+        * @param string $term User provided search term
+        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        *  results to render.
+        * @return string HTML
+        */
+       public function render( $term, $resultSets );
+}
diff --git a/includes/widget/search/SimpleSearchResultSetWidget.php b/includes/widget/search/SimpleSearchResultSetWidget.php
new file mode 100644 (file)
index 0000000..04e1e21
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use SearchResultSet;
+use SpecialSearch;
+use Title;
+use Html;
+
+/**
+ * Renders one or more SearchResultSets into a sidebar grouped by
+ * interwiki prefix. Includes a per-wiki header indicating where
+ * the results are from.
+ */
+class SimpleSearchResultSetWidget implements SearchResultSetWidget{
+       /** @var SpecialSearch */
+       protected $specialSearch;
+       /** @var SearchResultWidget */
+       protected $resultWidget;
+       /** @var string[]|null */
+       protected $customCaptions;
+       /** @var LinkRenderer */
+       protected $linkRenderer;
+       /** @var InterwikiLookup */
+       protected $iwLookup;
+
+       public function __construct(
+               SpecialSearch $specialSearch,
+               SearchResultWidget $resultWidget,
+               LinkRenderer $linkRenderer,
+               InterwikiLookup $iwLookup
+       ) {
+               $this->specialSearch = $specialSearch;
+               $this->resultWidget = $resultWidget;
+               $this->linkRenderer = $linkRenderer;
+               $this->iwLookup = $iwLookup;
+       }
+
+       /**
+        * @param string $term User provided search term
+        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        *  results to render.
+        * @return string HTML
+        */
+       public function render( $term, $resultSets ) {
+               if ( !is_array( $resultSets ) ) {
+                       $resultSets = [ $resultSets ];
+               }
+
+               $this->loadCustomCaptions();
+
+               $iwResults = [];
+               foreach ( $resultSets as $resultSet ) {
+                       $result = $resultSet->next();
+                       while ( $result ) {
+                               if ( !$result->isBrokenTitle() ) {
+                                       $iwResults[$result->getTitle()->getInterwiki()][] = $result;
+                               }
+                               $result = $resultSet->next();
+                       }
+               }
+
+               $out = '';
+               foreach ( $iwResults as $iwPrefix => $results ) {
+                       $out .= $this->headerHtml( $iwPrefix, $term );
+                       $out .= "<ul class='mw-search-iwresults'>";
+                       // TODO: Assumes interwiki results are never paginated
+                       $position = 0;
+                       foreach ( $results as $result ) {
+                               $out .= $this->resultWidget->render( $result, $term, $position++ );
+                       }
+                       $out .= "</ul>";
+               }
+
+               return
+                       "<div id='mw-search-interwiki'>" .
+                               "<div id='mw-search-interwiki-caption'>" .
+                                       $this->specialSearch->msg( 'search-interwiki-caption' )->parse() .
+                               '</div>' .
+                               $out .
+                       "</div>";
+       }
+
+       /**
+        * Generates an appropriate HTML header for the given interwiki prefix
+        *
+        * @param string $iwPrefix Interwiki prefix of wiki to show header for
+        * @param string $term User provided search term
+        * @return string HTML
+        */
+       protected function headerHtml( $iwPrefix, $term ) {
+               if ( isset( $this->customCaptions[$iwPrefix] ) ) {
+                       $caption = $this->customCaptions[$iwPrefix];
+               } else {
+                       $interwiki = $this->iwLookup->fetch( $iwPrefix );
+                       $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
+                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped();
+               }
+
+               $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL(
+                       [ 'search' => $term, 'fulltext' => 1 ]
+               );
+               $searchLink = Html::rawElement(
+                       'a',
+                       [ 'href' => $href ],
+                       $this->specialSearch->msg( 'search-interwiki-more' )->escaped()
+               );
+
+               return
+                       "<div class='mw-search-interwiki-project'>" .
+                               "<span class='mw-search-interwiki-more'>{$searchLink}</span>" .
+                               $caption .
+               "</div>";
+       }
+
+       protected function loadCustomCaptions() {
+               if ( $this->customCaptions !== null ) {
+                       return;
+               }
+
+               $this->customCaptions = [];
+               $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() );
+               foreach ( $customLines as $line ) {
+                       $parts = explode( ':', $line, 2 );
+                       if ( count( $parts ) === 2 ) {
+                               $this->customCaptions[$parts[0]] = $parts[1];
+                       }
+               }
+       }
+}
index 68727bb..2ec2d54 100644 (file)
@@ -2158,12 +2158,10 @@ class Language {
         * the date preference they're supposed to use, it should be used in
         * all children.
         *
-        *<code>
-        * function timeanddate([...], $format = true) {
-        *      $datePreference = $this->dateFormat($format);
-        * [...]
-        * }
-        *</code>
+        *     function timeanddate([...], $format = true) {
+        *       $datePreference = $this->dateFormat($format);
+        *       [...]
+        *     }
         *
         * @param int|string|bool $usePrefs If true, the user's preference is used
         *   if false, the site/language default is used
@@ -3286,14 +3284,14 @@ class Language {
        public function parseFormattedNumber( $number ) {
                $s = $this->digitTransformTable();
                if ( $s ) {
-                       // eliminate empty array values such as ''. (bug 64347)
+                       // eliminate empty array values such as ''. (T66347)
                        $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
                $s = $this->separatorTransformTable();
                if ( $s ) {
-                       // eliminate empty array values such as ''. (bug 64347)
+                       // eliminate empty array values such as ''. (T66347)
                        $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
@@ -3497,7 +3495,7 @@ class Language {
                                $string = $ellipsis . $string;
                        }
                }
-               # Do not truncate if the ellipsis makes the string longer/equal (bug 22181).
+               # Do not truncate if the ellipsis makes the string longer/equal (T24181).
                # This check is *not* redundant if $adjustLength, due to the single case where
                # LEN($ellipsis) > ABS($limit arg); $stringOriginal could be shorter than $string.
                if ( strlen( $string ) < strlen( $stringOriginal ) ) {
@@ -4508,7 +4506,7 @@ class Language {
                # such as action=raw much more expensive than they need to be.
                # This will hopefully cover most cases.
                $talk = preg_replace_callback( '/{{grammar:(.*?)\|(.*?)}}/i',
-                       [ &$this, 'replaceGrammarInNamespace' ], $talk );
+                       [ $this, 'replaceGrammarInNamespace' ], $talk );
                return str_replace( ' ', '_', $talk );
        }
 
index 06fec44..6a426e5 100644 (file)
@@ -99,13 +99,13 @@ class LanguageConverter {
                        // '+' add rules for alltext
                        // 'E' the gave flags is error
                        // these flags above are reserved for program
-                       'A' => 'A',       // add rule for convert code (all text convert)
-                       'T' => 'T',       // title convert
-                       'R' => 'R',       // raw content
-                       'D' => 'D',       // convert description (subclass implement)
-                       '-' => '-',       // remove convert (not implement)
-                       'H' => 'H',       // add rule for convert code (but no display in placed code)
-                       'N' => 'N'        // current variant name
+                       'A' => 'A',   // add rule for convert code (all text convert)
+                       'T' => 'T',   // title convert
+                       'R' => 'R',   // raw content
+                       'D' => 'D',   // convert description (subclass implement)
+                       '-' => '-',   // remove convert (not implement)
+                       'H' => 'H',   // add rule for convert code (but no display in placed code)
+                       'N' => 'N',   // current variant name
                ];
                $this->mFlags = array_merge( $defaultflags, $flags );
                foreach ( $this->mVariants as $v ) {
@@ -357,10 +357,10 @@ class LanguageConverter {
                }
 
                /* we convert everything except:
-                  1. HTML markups (anything between < and >)
-                  2. HTML entities
-                  3. placeholders created by the parser
-               */
+                * 1. HTML markups (anything between < and >)
+                * 2. HTML entities
+                * 3. placeholders created by the parser
+                */
                $marker = '|' . Parser::MARKER_PREFIX . '[\-a-zA-Z0-9]+';
 
                // this one is needed when the text is inside an HTML markup
@@ -380,6 +380,7 @@ class LanguageConverter {
                $literalBlob = '';
 
                // Guard against delimiter nulls in the input
+               // (should never happen: see T159174)
                $text = str_replace( "\000", '', $text );
 
                $markupMatches = null;
@@ -489,7 +490,7 @@ class LanguageConverter {
        protected function applyManualConv( $convRule ) {
                // Use syntax -{T|zh-cn:TitleCN; zh-tw:TitleTw}- to custom
                // title conversion.
-               // Bug 24072: $mConvRuleTitle was overwritten by other manual
+               // T26072: $mConvRuleTitle was overwritten by other manual
                // rule(s) not for title, this breaks the title conversion.
                $newConvRuleTitle = $convRule->getTitle();
                if ( $newConvRuleTitle ) {
@@ -1085,12 +1086,12 @@ class LanguageConverter {
                        // text should be splited by ";" only if a valid variant
                        // name exist after the markup, for example:
                        //  -{zh-hans:<span style="font-size:120%;">xxx</span>;zh-hant:\
-                       //      <span style="font-size:120%;">yyy</span>;}-
+                       //  <span style="font-size:120%;">yyy</span>;}-
                        // we should split it as:
                        //  [
-                       //        [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
-                       //        [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
-                       //        [2] => ''
+                       //    [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
+                       //    [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
+                       //    [2] => ''
                        //  ]
                        $pat = '/;\s*(?=';
                        foreach ( $this->mVariants as $variant ) {
index 858a7be..90e3751 100644 (file)
@@ -30,7 +30,7 @@
 class LanguageAr extends Language {
 
        /**
-        * Temporary hack for bug 9413: replace Arabic presentation forms with their
+        * Temporary hack for T11413: replace Arabic presentation forms with their
         * standard equivalents.
         *
         * @todo FIXME: This is language-specific for now only to avoid the negative
index 76568c2..9ef53e5 100644 (file)
@@ -63,13 +63,11 @@ class LanguageKsh extends Language {
         *
         * Possible values for the type of genitive are:
         *      Sing, Iehr            prepositioned genitive = possessive dative
-        *      Vun, Fon, -omitted-   postpositioned genitive
-        *                                     = preposition "vun" with dative
+        *      Vun, Fon, -omitted-   postpositioned genitive = preposition "vun" with dative
         *
         * Values of case overrides & prepositions, in the order of preceedence:
         *      Sing, Iehr            possessive dative = prepositioned genitive
-        *      Vun, Fon              preposition "vun" with dative
-        *                                           = postpositioned genitive
+        *      Vun, Fon              preposition "vun" with dative = postpositioned genitive
         *      En, em                preposition "en" with dative
         *
         * Values for object gender specifiers of the possessive dative, or
index d1963e1..f4082af 100644 (file)
@@ -50,12 +50,12 @@ class LanguageLa extends Language {
                case 'genitive':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                               '/a$/',                         # 1st declension singular
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                               '/a$/',                              # 1st declension singular
                                '/libri$/', '/nuntii$/', '/datae$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'i',
@@ -69,12 +69,12 @@ class LanguageLa extends Language {
                case 'accusative':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/a$/',                         # 1st declension singular
-                               '/ommuniam$/',              # 3rd declension neuter plural (partly)
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/a$/',                              # 1st declension singular
+                               '/ommuniam$/',                       # 3rd declension neuter plural (partly)
                                '/libri$/', '/nuntii$/', '/datam$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'um',
@@ -88,12 +88,12 @@ class LanguageLa extends Language {
                case 'ablative':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                               '/a$/',                         # 1st declension singular
-                               '/libri$/', '/nuntii$/', '/data$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                               '/a$/',                              # 1st declension singular
+                               '/libri$/', '/nuntii$/', '/data$/',  # 2nd declension plural (partly)
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'o',
index cd39378..df894a1 100644 (file)
@@ -31,8 +31,8 @@ class LanguageMl extends Language {
         * Temporary hack for the issue described at
         * http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46396
         * Convert Unicode 5.0 style Malayalam input to Unicode 5.1. Similar to
-        * bug 9413. Also fixes miscellaneous problems due to mishandling of ZWJ,
-        * e.g. bug 11162.
+        * T11413. Also fixes miscellaneous problems due to mishandling of ZWJ,
+        * e.g. T13162.
         *
         * @todo FIXME: This is language-specific for now only to avoid the negative
         * performance impact of enabling it for all languages.
index 42ee44d..49ee88a 100644 (file)
@@ -27,8 +27,7 @@
  * Turkish has two different i, one with a dot and another without a dot. They
  * are totally different letters in this language, so we have to override the
  * ucfirst and lcfirst methods.
- * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I
- * and @bug 28040
+ * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I and T30040
  * @ingroup Language
  */
 class LanguageTr extends Language {
index 0557455..1c350d0 100644 (file)
@@ -60,7 +60,7 @@ class Names {
                'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
                'am' => 'አማርኛ', # Amharic
                'an' => 'aragonés', # Aragonese
-               'ang' => 'Ænglisc', # Old English, bug 23283
+               'ang' => 'Ænglisc', # Old English, T25283
                'anp' => 'अङ्गिका', # Angika
                'ar' => 'العربية', # Arabic
                'arc' => 'ܐܪܡܝܐ', # Aramaic
@@ -274,7 +274,7 @@ class Names {
                'lus' => 'Mizo ţawng', # Mizo/Lushai
                'luz' => 'لئری دوٙمینی', # Southern Luri
                'lv' => 'latviešu', # Latvian
-               'lzh' => '文言', # Literary Chinese, bug 8217
+               'lzh' => '文言', # Literary Chinese, T10217
                'lzz' => 'Lazuri', # Laz
                'mai' => 'मैथिली', # Maithili
                'map-bms' => 'Basa Banyumasan', # Banyumasan
@@ -299,8 +299,8 @@ class Names {
                'mzn' => 'مازِرونی', # Mazanderani
                'na' => 'Dorerin Naoero', # Nauruan
                'nah' => 'Nāhuatl', # Nahuatl (not in ISO 639-3)
-               'nan' => 'Bân-lâm-gú', # Min-nan, bug 8217
-               'nap' => 'Napulitano', # Neapolitan, bug 43793
+               'nan' => 'Bân-lâm-gú', # Min-nan, T10217
+               'nap' => 'Napulitano', # Neapolitan, T45793
                'nb' => 'norsk bokmål', # Norwegian (Bokmal)
                'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
                'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
@@ -321,7 +321,7 @@ class Names {
                'olo' => 'Livvinkarjala', # Livvi-Karelian
                'om' => 'Oromoo', # Oromo
                'or' => 'ଓଡ଼ିଆ', # Oriya
-               'os' => 'Ирон', # Ossetic, bug 29091
+               'os' => 'Ирон', # Ossetic, T31091
                'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
                'pag' => 'Pangasinan', # Pangasinan
                'pam' => 'Kapampangan', # Pampanga
@@ -456,17 +456,17 @@ class Names {
                'za' => 'Vahcuengh', # Zhuang
                'zea' => 'Zeêuws', # Zeeuws/Zeaws
                'zh' => '中文', # (Zhōng Wén) - Chinese
-               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
+               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see T10217)
                'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
                'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
                'zh-hant' => "中文(繁體)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
                'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
-               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
+               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see T10217)
                'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
                'zh-my' => "中文(马来西亚)\xE2\x80\x8E", # Chinese (Malaysia)
                'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
                'zh-tw' => "中文(台灣)\xE2\x80\x8E", # Chinese (Taiwan)
-               'zh-yue' => '粵語', # Cantonese -- (see bug 8217)
+               'zh-yue' => '粵語', # Cantonese -- (see T10217)
                'zu' => 'isiZulu' # Zulu
        ];
 }
index 4594385..55813ae 100644 (file)
@@ -542,7 +542,6 @@ public static $zh2Hant = [
 '帼' => '幗',
 '幂' => '冪',
 '并' => '並',
-'幺' => '么',
 '广' => '廣',
 '庄' => '莊',
 '庆' => '慶',
@@ -3009,7 +3008,6 @@ public static $zh2Hant = [
 '0只支援' => '0只支援',
 '0周后' => '0周後',
 '0天后' => '0天後',
-'0年' => '0年',
 '0只' => '0隻',
 '0余' => '0餘',
 '0出' => '0齣',
@@ -3017,63 +3015,54 @@ public static $zh2Hant = [
 '1只支援' => '1只支援',
 '1周后' => '1周後',
 '1天后' => '1天後',
-'1年' => '1年',
 '1只' => '1隻',
 '1余' => '1餘',
 '2只支持' => '2只支持',
 '2只支援' => '2只支援',
 '2周后' => '2周後',
 '2天后' => '2天後',
-'2年' => '2年',
 '2只' => '2隻',
 '2余' => '2餘',
 '3只支持' => '3只支持',
 '3只支援' => '3只支援',
 '3周后' => '3周後',
 '3天后' => '3天後',
-'3年' => '3年',
 '3只' => '3隻',
 '3余' => '3餘',
 '4只支持' => '4只支持',
 '4只支援' => '4只支援',
 '4周后' => '4周後',
 '4天后' => '4天後',
-'4年' => '4年',
 '4只' => '4隻',
 '4余' => '4餘',
 '5只支持' => '5只支持',
 '5只支援' => '5只支援',
 '5周后' => '5周後',
 '5天后' => '5天後',
-'5年' => '5年',
 '5只' => '5隻',
 '5余' => '5餘',
 '6只支持' => '6只支持',
 '6只支援' => '6只支援',
 '6周后' => '6周後',
 '6天后' => '6天後',
-'6年' => '6年',
 '6只' => '6隻',
 '6余' => '6餘',
 '7只支持' => '7只支持',
 '7只支援' => '7只支援',
 '7周后' => '7周後',
 '7天后' => '7天後',
-'7年' => '7年',
 '7只' => '7隻',
 '7余' => '7餘',
 '8只支持' => '8只支持',
 '8只支援' => '8只支援',
 '8周后' => '8周後',
 '8天后' => '8天後',
-'8年' => '8年',
 '8只' => '8隻',
 '8余' => '8餘',
 '9只支持' => '9只支持',
 '9只支援' => '9只支援',
 '9周后' => '9周後',
 '9天后' => '9天後',
-'9年' => '9年',
 '9只' => '9隻',
 '9余' => '9餘',
 '·范' => '·范',
@@ -3081,7 +3070,6 @@ public static $zh2Hant = [
 '、面点' => '、麵點',
 '。个中' => '。箇中',
 '〇周后' => '〇周後',
-'〇年' => '〇年',
 '〇只' => '〇隻',
 '〇余' => '〇餘',
 '“' => '「',
@@ -3108,8 +3096,6 @@ public static $zh2Hant = [
 '一干弟兄' => '一干弟兄',
 '一干弟子' => '一干弟子',
 '一干部下' => '一干部下',
-'一年' => '一年',
-'一年里' => '一年裡',
 '一斗斗' => '一斗斗',
 '一树百获' => '一樹百穫',
 '一准' => '一準',
@@ -3138,7 +3124,6 @@ public static $zh2Hant = [
 '七个' => '七個',
 '七周后' => '七周後',
 '七天后' => '七天後',
-'七年' => '七年',
 '七情六欲' => '七情六慾',
 '七扎' => '七紮',
 '七只' => '七隻',
@@ -3148,7 +3133,6 @@ public static $zh2Hant = [
 '三个' => '三個',
 '三周后' => '三周後',
 '三天后' => '三天後',
-'三年' => '三年',
 '三征七辟' => '三徵七辟',
 '三准' => '三準',
 '三扎' => '三紮',
@@ -3161,6 +3145,7 @@ public static $zh2Hant = [
 '上梁山' => '上梁山',
 '上梁' => '上樑',
 '上台面' => '上檯面',
+'上签了' => '上簽了',
 '上签名' => '上簽名',
 '上签字' => '上簽字',
 '上签定' => '上簽定',
@@ -3175,9 +3160,9 @@ public static $zh2Hant = [
 '上课钟' => '上課鐘',
 '上面糊' => '上面糊',
 '下文里' => '下文裡',
-'下于' => '下於',
 '下梁' => '下樑',
 '下注解' => '下注解',
+'下签了' => '下簽了',
 '下签名' => '下簽名',
 '下签字' => '下簽字',
 '下签定' => '下簽定',
@@ -3230,7 +3215,6 @@ public static $zh2Hant = [
 '丑月' => '丑月',
 '丑表功' => '丑表功',
 '丑角' => '丑角',
-'且于' => '且於',
 '世界杯' => '世界盃',
 '世纪里' => '世紀裡',
 '世纪钟' => '世紀鐘',
@@ -3253,7 +3237,7 @@ public static $zh2Hant = [
 '中岳' => '中嶽',
 '中庄子' => '中庄子',
 '中文里' => '中文裡',
-'中于' => '中於',
+'中签了' => '中簽了',
 '中签名' => '中簽名',
 '中签字' => '中簽字',
 '中签定' => '中簽定',
@@ -3286,20 +3270,34 @@ public static $zh2Hant = [
 '主钟差' => '主鐘差',
 '主钟曲线' => '主鐘曲線',
 '乃系' => '乃係',
-'么么唱唱' => '么么唱唱',
 '么九' => '么九',
-'么儿' => '么兒',
+'么二三' => '么二三',
+'么元' => '么元',
+'么兒' => '么兒',
 '么半' => '么半',
+'么叔' => '么叔',
 '么喝' => '么喝',
 '么女' => '么女',
 '么妹' => '么妹',
+'么姓' => '么姓',
+'么姨' => '么姨',
+'么娘' => '么娘',
+'么媽' => '么媽',
+'么孃' => '么孃',
 '么子' => '么子',
+'么小' => '么小',
 '么弟' => '么弟',
 '么正' => '么正',
-'么爷' => '么爺',
+'么氏' => '么氏',
+'么爸' => '么爸',
+'么爹' => '么爹',
+'么爺' => '么爺',
+'么篇' => '么篇',
+'么舅' => '么舅',
+'么蛾子' => '么蛾子',
 '么雞' => '么雞',
-'么么小丑' => '么麼小丑',
-'么麼小丑' => '么麼小丑',
+'么鳳' => '么鳳',
+'么麼' => '么麼',
 '之一只' => '之一只',
 '之二只' => '之二只',
 '之八九只' => '之八九只',
@@ -3313,7 +3311,6 @@ public static $zh2Hant = [
 '九个' => '九個',
 '九周后' => '九周後',
 '九天后' => '九天後',
-'九年' => '九年',
 '九谷' => '九穀',
 '九扎' => '九紮',
 '九只' => '九隻',
@@ -3486,7 +3483,6 @@ public static $zh2Hant = [
 '二只得' => '二只得',
 '二周后' => '二周後',
 '二天后' => '二天後',
-'二年' => '二年',
 '二缶钟惑' => '二缶鐘惑',
 '二老板' => '二老板',
 '二虎相斗' => '二虎相鬥',
@@ -3712,7 +3708,6 @@ public static $zh2Hant = [
 '五天后' => '五天後',
 '五峰县' => '五峯縣',
 '五岳' => '五嶽',
-'五年' => '五年',
 '五谷' => '五穀',
 '五扎' => '五紮',
 '五脏' => '五臟',
@@ -3723,7 +3718,6 @@ public static $zh2Hant = [
 '五余' => '五餘',
 '井干' => '井幹',
 '井里' => '井裡',
-'亚于' => '亞於',
 '交托' => '交託',
 '交游' => '交遊',
 '交哄' => '交鬨',
@@ -3758,8 +3752,6 @@ public static $zh2Hant = [
 '价川' => '价川',
 '任何钟' => '任何鐘',
 '任何钟表' => '任何鐘錶',
-'任教于' => '任教於',
-'任于' => '任於',
 '仿制' => '仿製',
 '伊于湖底' => '伊于湖底',
 '伊府面' => '伊府麵',
@@ -3781,9 +3773,7 @@ public static $zh2Hant = [
 '休征' => '休徵',
 '伙头' => '伙頭',
 '伴游' => '伴遊',
-'似于' => '似於',
 '但云' => '但云',
-'位于' => '位於',
 '位准' => '位準',
 '低洼' => '低洼',
 '住扎' => '住紮',
@@ -3836,13 +3826,11 @@ public static $zh2Hant = [
 '并购' => '併購',
 '并骨' => '併骨',
 '使其斗' => '使其鬥',
-'来于' => '來於',
 '侍仆' => '侍僕',
 '依依不舍' => '依依不捨',
 '依托' => '依託',
 '侵并' => '侵併',
 '局促' => '侷促',
-'便于' => '便於',
 '系数' => '係數',
 '系为' => '係為',
 '保险柜' => '保險柜',
@@ -3882,7 +3870,6 @@ public static $zh2Hant = [
 '傲霜斗雪' => '傲霜鬥雪',
 '传位于四太子' => '傳位于四太子',
 '傳位于四太子' => '傳位于四太子',
-'传于' => '傳於',
 '债累累' => '債纍纍',
 '傻里傻气' => '傻裡傻氣',
 '仅余' => '僅餘',
@@ -3919,7 +3906,6 @@ public static $zh2Hant = [
 '亿个' => '億個',
 '亿周后' => '億周後',
 '亿天后' => '億天後',
-'亿年' => '億年',
 '亿只' => '億隻',
 '亿余' => '億餘',
 '俭仆' => '儉僕',
@@ -3941,7 +3927,6 @@ public static $zh2Hant = [
 '尽自' => '儘自',
 '尽速' => '儘速',
 '尽量' => '儘量',
-'优于' => '優於',
 '优游' => '優遊',
 '兀术' => '兀朮',
 '元凶' => '元兇',
@@ -3989,7 +3974,6 @@ public static $zh2Hant = [
 '两个' => '兩個',
 '两周后' => '兩周後',
 '两天后' => '兩天後',
-'两年' => '兩年',
 '两杆' => '兩桿',
 '两扎' => '兩紮',
 '两虎共斗' => '兩虎共鬥',
@@ -4001,7 +3985,6 @@ public static $zh2Hant = [
 '八周后' => '八周後',
 '八天后' => '八天後',
 '八字胡' => '八字鬍',
-'八年' => '八年',
 '八扎' => '八紮',
 '八蜡' => '八蜡',
 '八只' => '八隻',
@@ -4020,7 +4003,6 @@ public static $zh2Hant = [
 '六个' => '六個',
 '六周后' => '六周後',
 '六天后' => '六天後',
-'六年' => '六年',
 '六楼后座' => '六樓后座',
 '六樓后座' => '六樓后座',
 '六谷' => '六穀',
@@ -4072,7 +4054,6 @@ public static $zh2Hant = [
 '出乖弄丑' => '出乖弄醜',
 '出乖露丑' => '出乖露醜',
 '出征收' => '出征收',
-'出于' => '出於',
 '出游' => '出遊',
 '出丑' => '出醜',
 '函数里' => '函數裡',
@@ -4081,7 +4062,6 @@ public static $zh2Hant = [
 '分多钟' => '分多鐘',
 '分子钟' => '分子鐘',
 '分子云' => '分子雲',
-'分布于' => '分布於',
 '分钟' => '分鐘',
 '分钟里' => '分鐘裡',
 '刑余' => '刑餘',
@@ -4127,8 +4107,6 @@ public static $zh2Hant = [
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
-'利于' => '利於',
-'刮来刮去' => '刮來刮去',
 '刮起来' => '刮起來',
 '刮胡' => '刮鬍',
 '到山里' => '到山裡',
@@ -4177,11 +4155,8 @@ public static $zh2Hant = [
 '力争上游' => '力爭上遊',
 '功勋' => '功勳',
 '加氢精制' => '加氫精制',
-'劣于' => '劣於',
-'助于' => '助於',
 '劫余' => '劫餘',
 '勃郁' => '勃鬱',
-'胜于' => '勝於',
 '勤仆' => '勤僕',
 '勤朴' => '勤樸',
 '勋劳' => '勳勞',
@@ -4203,7 +4178,6 @@ public static $zh2Hant = [
 '北回线' => '北迴線',
 '北回铁路' => '北迴鐵路',
 '匪干' => '匪幹',
-'匿于' => '匿於',
 '区里有' => '區裡有',
 '区里的' => '區裡的',
 '十个' => '十個',
@@ -4214,7 +4188,6 @@ public static $zh2Hant = [
 '十出头' => '十出頭',
 '十周后' => '十周後',
 '十天后' => '十天後',
-'十年' => '十年',
 '十扎' => '十紮',
 '十只' => '十隻',
 '十余' => '十餘',
@@ -4229,7 +4202,6 @@ public static $zh2Hant = [
 '千只足夠' => '千只足夠',
 '千周后' => '千周後',
 '千天后' => '千天後',
-'千年' => '千年',
 '千扎' => '千紮',
 '千回百折' => '千迴百折',
 '千回百转' => '千迴百轉',
@@ -4240,7 +4212,6 @@ public static $zh2Hant = [
 '半制品' => '半制品',
 '半只可' => '半只可',
 '半只够' => '半只夠',
-'半于' => '半於',
 '半只' => '半隻',
 '协防' => '協防',
 '南京钟' => '南京鐘',
@@ -4260,7 +4231,6 @@ public static $zh2Hant = [
 '印累绶若' => '印纍綬若',
 '印制' => '印製',
 '印鉴' => '印鑑',
-'危于' => '危於',
 '卵与石斗' => '卵與石鬥',
 '卷须' => '卷鬚',
 '厂部' => '厂部',
@@ -4279,7 +4249,6 @@ public static $zh2Hant = [
 '反复' => '反覆',
 '反覆' => '反覆',
 '取舍' => '取捨',
-'取决于' => '取決於',
 '受雇' => '受僱',
 '受托' => '受託',
 '丛林里' => '叢林裡',
@@ -4385,7 +4354,6 @@ public static $zh2Hant = [
 '吊钟' => '吊鐘',
 '同人志' => '同人誌',
 '同伙' => '同夥',
-'同于' => '同於',
 '同余' => '同餘',
 '名单于' => '名單於',
 '后冠' => '后冠',
@@ -4483,7 +4451,6 @@ public static $zh2Hant = [
 '喂喲' => '喂喲',
 '喂!' => '喂!',
 '喂,' => '喂,',
-'善于' => '善於',
 '喜欢表' => '喜歡錶',
 '喜欢钟' => '喜歡鐘',
 '喜欢钟表' => '喜歡鐘錶',
@@ -4517,7 +4484,6 @@ public static $zh2Hant = [
 '向迩' => '嚮邇',
 '严云农' => '嚴云農',
 '嚴云農' => '嚴云農',
-'严于' => '嚴於',
 '嚼谷' => '嚼穀',
 '啰啰苏苏' => '囉囉囌囌',
 '啰苏' => '囉囌',
@@ -4529,7 +4495,6 @@ public static $zh2Hant = [
 '四分历史' => '四分歷史',
 '四周后' => '四周後',
 '四天后' => '四天後',
-'四年' => '四年',
 '四舍五入' => '四捨五入',
 '四舍六入' => '四捨六入',
 '四杆铁笔' => '四桿鐵筆',
@@ -4551,19 +4516,15 @@ public static $zh2Hant = [
 '回复邮件' => '回覆郵件',
 '回复:' => '回覆:',
 '回游' => '回遊',
-'因于' => '因於',
 '困倦起来' => '困倦起來',
-'困于' => '困於',
 '困兽之斗' => '困獸之鬥',
 '困兽犹斗' => '困獸猶鬥',
 '困斗' => '困鬥',
 '固定制' => '固定制',
 '固征' => '固徵',
-'囿于' => '囿於',
 '圈梁' => '圈樑',
 '圈里' => '圈裡',
 '国之桢干' => '國之楨榦',
-'国于' => '國於',
 '国历' => '國曆',
 '国历代' => '國歷代',
 '国历任' => '國歷任',
@@ -4582,22 +4543,21 @@ public static $zh2Hant = [
 '土制' => '土製',
 '在制品' => '在制品',
 '在山里' => '在山裡',
-'在于' => '在於',
 '地图里' => '地圖裡',
 '地心历表' => '地心曆表',
 '地志' => '地誌',
 '地丑德齐' => '地醜德齊',
-'å\9d\8fäº\8e' => 'å\9d\8fæ\96¼',
-'å\9d\8fæ\96¼' => 'å\9d\8fæ\96¼',
+'å\9d\90å\8f°é\90µ' => 'å\9d\90å\8f°é\90µ',
+'å\9d\90å\8f°é\93\81' => 'å\9d\90å\8f°é\90µ',
 '坐如钟' => '坐如鐘',
 '坐台' => '坐檯',
 '坐钟' => '坐鐘',
+'坑口里' => '坑口里',
 '坑里' => '坑裡',
 '坤范' => '坤範',
 '坦荡' => '坦蕩',
 '坦荡荡' => '坦蕩蕩',
 '坱郁' => '坱鬱',
-'垂于' => '垂於',
 '垂范' => '垂範',
 '垂发' => '垂髮',
 '型范' => '型範',
@@ -4611,7 +4571,6 @@ public static $zh2Hant = [
 '埔里社' => '埔裏社',
 '域里' => '域裡',
 '基干' => '基幹',
-'基于' => '基於',
 '基准' => '基準',
 '坚致' => '堅緻',
 '堙淀' => '堙澱',
@@ -4663,7 +4622,6 @@ public static $zh2Hant = [
 '多只须' => '多只須',
 '多周后' => '多周後',
 '多天后' => '多天後',
-'多于' => '多於',
 '多冲' => '多衝',
 '多丑' => '多醜',
 '多只' => '多隻',
@@ -4766,7 +4724,6 @@ public static $zh2Hant = [
 '好斗胆' => '好斗膽',
 '好斗膽' => '好斗膽',
 '好斗蓬' => '好斗蓬',
-'好于' => '好於',
 '好困' => '好睏',
 '好签' => '好籤',
 '好丑' => '好醜',
@@ -4776,7 +4733,7 @@ public static $zh2Hant = [
 '妖后' => '妖后',
 '妖气冲天' => '妖氣衝天',
 '妆台' => '妝檯',
-'å§\8bäº\8e' => 'å§\8bæ\96¼',
+'å§\93ä¹\88' => 'å§\93ä¹\88',
 '委托' => '委託',
 '委托书' => '委託書',
 '奸夫' => '姦夫',
@@ -4787,7 +4744,6 @@ public static $zh2Hant = [
 '奸淫' => '姦淫',
 '威棱' => '威稜',
 '婢仆' => '婢僕',
-'嫁祸于' => '嫁禍於',
 '嫌凶' => '嫌兇',
 '嫌好道丑' => '嫌好道醜',
 '嫩姜' => '嫩薑',
@@ -4803,7 +4759,6 @@ public static $zh2Hant = [
 '字码表' => '字碼表',
 '字里行间' => '字裡行間',
 '存折' => '存摺',
-'存于' => '存於',
 '孛里海' => '孛里海',
 '孝惠后' => '孝惠后',
 '孙杰' => '孫杰',
@@ -4811,7 +4766,6 @@ public static $zh2Hant = [
 '学家' => '學家',
 '学里' => '學裡',
 '宇宙志' => '宇宙誌',
-'安于' => '安於',
 '安沈铁路' => '安瀋鐵路',
 '宋王台' => '宋王臺',
 '宗周钟' => '宗周鐘',
@@ -4819,19 +4773,16 @@ public static $zh2Hant = [
 '官地为采' => '官地為寀',
 '官历' => '官曆',
 '官历史' => '官歷史',
-'定于' => '定於',
 '定准' => '定準',
 '定制' => '定製',
 '宜云' => '宜云',
 '宣泄' => '宣洩',
 '宦游' => '宦遊',
 '宫里' => '宮裡',
-'害于' => '害於',
 '宴游' => '宴遊',
 '家仆' => '家僕',
 '家里' => '家裡',
 '家丑' => '家醜',
-'容于' => '容於',
 '容范' => '容範',
 '宿舍' => '宿舍',
 '寄托在' => '寄托在',
@@ -4841,14 +4792,12 @@ public static $zh2Hant = [
 '寇仇' => '寇讎',
 '富余' => '富餘',
 '寒栗' => '寒慄',
-'寒于' => '寒於',
-'寓于' => '寓於',
+'寓禁于征' => '寓禁於徵',
 '寡欲' => '寡慾',
 '实干' => '實幹',
 '实累累' => '實纍纍',
 '实验里' => '實驗裡',
 '写字台' => '寫字檯',
-'宽于' => '寬於',
 '宽余' => '寬餘',
 '宽松' => '寬鬆',
 '宽松松' => '寬鬆鬆',
@@ -4870,7 +4819,6 @@ public static $zh2Hant = [
 '尊后' => '尊后',
 '对不准' => '對不準',
 '对折' => '對摺',
-'对于' => '對於',
 '对准' => '對準',
 '对准表' => '對準錶',
 '对准钟' => '對準鐘',
@@ -4930,9 +4878,7 @@ public static $zh2Hant = [
 '屋梁' => '屋樑',
 '屋里' => '屋裡',
 '屏风后' => '屏風後',
-'屑于' => '屑於',
 '屡顾尔仆' => '屢顧爾僕',
-'属于' => '屬於',
 '属托' => '屬託',
 '屯扎' => '屯紮',
 '屯里' => '屯裡',
@@ -4982,11 +4928,11 @@ public static $zh2Hant = [
 '巧历史' => '巧歷史',
 '巨制' => '巨製',
 '差之毫厘' => '差之毫厘',
-'差于' => '差於',
 '己丑' => '己丑',
 '已占卜' => '已占卜',
 '已占算' => '已占算',
 '巴尔干' => '巴爾幹',
+'巴而术' => '巴而朮',
 '巷里' => '巷裡',
 '市里的' => '市裡的',
 '布谷' => '布穀',
@@ -5018,8 +4964,6 @@ public static $zh2Hant = [
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
-'幸免于难' => '幸免於難',
-'幸于' => '幸於',
 '幸运胡' => '幸運鬍',
 '干上' => '幹上',
 '干下去' => '幹下去',
@@ -5106,7 +5050,6 @@ public static $zh2Hant = [
 '广舍' => '廣捨',
 '广播里' => '廣播裡',
 '延历' => '延曆',
-'建于' => '建於',
 '建筑前' => '建築前',
 '建筑后' => '建築後',
 '弄干' => '弄乾',
@@ -5151,7 +5094,6 @@ public static $zh2Hant = [
 '引斗' => '引鬥',
 '弘历' => '弘曆',
 '弘历史' => '弘歷史',
-'弱于' => '弱於',
 '弱水三千只取一瓢' => '弱水三千只取一瓢',
 '张三丰' => '張三丰',
 '張三丰' => '張三丰',
@@ -5166,7 +5108,6 @@ public static $zh2Hant = [
 '强制作用' => '強制作用',
 '强奸' => '強姦',
 '强干' => '強幹',
-'强于' => '強於',
 '别扭' => '彆扭',
 '别拗' => '彆拗',
 '别气' => '彆氣',
@@ -5177,11 +5118,9 @@ public static $zh2Hant = [
 '汇纂' => '彙纂',
 '汇辑' => '彙輯',
 '形单影只' => '形單影隻',
-'形于' => '形於',
 '彭于晏' => '彭于晏',
 '影后' => '影后',
 '影相吊' => '影相弔',
-'役于' => '役於',
 '往复式' => '往復式',
 '往日无仇' => '往日無讎',
 '往里' => '往裡',
@@ -5205,7 +5144,6 @@ public static $zh2Hant = [
 '从仆' => '從僕',
 '从图里' => '從圖裡',
 '从山里' => '從山裡',
-'从于' => '從於',
 '从里到外' => '從裡到外',
 '从里向外' => '從裡向外',
 '御岳山' => '御嶽山',
@@ -5262,7 +5200,6 @@ public static $zh2Hant = [
 '征风召雨' => '徵風召雨',
 '征验' => '徵驗',
 '心愿' => '心愿',
-'心于' => '心於',
 '心理' => '心理',
 '心细如发' => '心細如髮',
 '心系一' => '心繫一',
@@ -5389,18 +5326,14 @@ public static $zh2Hant = [
 '忙里偷闲' => '忙裡偷閒',
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
-'忠于' => '忠於',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怎么干' => '怎麼幹',
-'怒于' => '怒於',
 '怒气冲天' => '怒氣衝天',
 '怒火冲天' => '怒火衝天',
 '怒发冲冠' => '怒髮衝冠',
 '怜奈' => '怜奈',
 '思如泉涌' => '思如泉湧',
-'怠于' => '怠於',
-'急于' => '急於',
 '急冲而下' => '急衝而下',
 '性别扭曲' => '性別扭曲',
 '性征' => '性徵',
@@ -5446,7 +5379,6 @@ public static $zh2Hant = [
 '愛河里花子' => '愛河里花子',
 '爱河里花子' => '愛河里花子',
 '爱困' => '愛睏',
-'感于' => '感於',
 '愿朴' => '愿樸',
 '愿樸' => '愿樸',
 '愿而恭' => '愿而恭',
@@ -5491,13 +5423,11 @@ public static $zh2Hant = [
 '悬钟' => '懸鐘',
 '懿范' => '懿範',
 '恋恋不舍' => '戀戀不捨',
-'成于' => '成於',
 '成于思' => '成於思',
 '戬谷' => '戩穀',
 '截发' => '截髮',
 '战天斗地' => '戰天鬥地',
 '战栗' => '戰慄',
-'战于' => '戰於',
 '战斗' => '戰鬥',
 '戏里' => '戲裡',
 '戲院里' => '戲院里',
@@ -5604,14 +5534,10 @@ public static $zh2Hant = [
 '拉面部' => '拉面部',
 '拉面' => '拉麵',
 '拌面' => '拌麵',
-'拒人于' => '拒人於',
-'拒于' => '拒於',
 '拓朴' => '拓樸',
 '拔发' => '拔髮',
 '拔须' => '拔鬚',
 '拗别' => '拗彆',
-'拘于' => '拘於',
-'拙于' => '拙於',
 '拙朴' => '拙樸',
 '拼却' => '拚卻',
 '拼命' => '拚命',
@@ -5794,10 +5720,8 @@ public static $zh2Hant = [
 '提心吊胆' => '提心弔膽',
 '提摩太后书' => '提摩太後書',
 '提高后' => '提高後',
-'插于' => '插於',
 '换签' => '換籤',
 '换只' => '換隻',
-'换发' => '換髮',
 '握发' => '握髮',
 '揩干' => '揩乾',
 '揪采' => '揪採',
@@ -5807,7 +5731,6 @@ public static $zh2Hant = [
 '挥手表' => '揮手表',
 '揮手表' => '揮手表',
 '搋面' => '搋麵',
-'损于' => '損於',
 '搏斗' => '搏鬥',
 '捣鬼吊白' => '搗鬼弔白',
 '扼肮' => '搤肮',
@@ -5841,7 +5764,6 @@ public static $zh2Hant = [
 '撤并' => '撤併',
 '拨谷' => '撥穀',
 '撩斗' => '撩鬥',
-'播于' => '播於',
 '扑冬' => '撲鼕',
 '扑咚' => '撲鼕',
 '扑咚咚' => '撲鼕鼕',
@@ -5869,16 +5791,12 @@ public static $zh2Hant = [
 '放松' => '放鬆',
 '政斗' => '政鬥',
 '故云' => '故云',
-'敏于' => '敏於',
-'败于' => '敗於',
 '教学钟' => '教學鐘',
-'教于' => '教於',
 '教范' => '教範',
 '敢干' => '敢幹',
 '敢情欲' => '敢情欲',
 '敢斗了胆' => '敢斗了膽',
 '散伙' => '散夥',
-'散于' => '散於',
 '散荡' => '散蕩',
 '敦朴' => '敦樸',
 '敬挽' => '敬輓',
@@ -5929,15 +5847,12 @@ public static $zh2Hant = [
 '方便面' => '方便麵',
 '方向' => '方向',
 '方法里' => '方法裡',
-'于后' => '於後',
-'于征' => '於徵',
 '于海上' => '於海上',
 '于海边' => '於海邊',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
 '施舍' => '施捨',
-'施于' => '施於',
 '施舍之道' => '施舍之道',
 '旁征博引' => '旁徵博引',
 '旁注' => '旁註',
@@ -5950,7 +5865,6 @@ public static $zh2Hant = [
 '日历史' => '日歷史',
 '日里' => '日裡',
 '日志' => '日誌',
-'早于' => '早於',
 '旱干' => '旱乾',
 '升州' => '昇州',
 '升平' => '昇平',
@@ -5961,7 +5875,6 @@ public static $zh2Hant = [
 '明窗净几' => '明窗淨几',
 '明范' => '明範',
 '明鉴' => '明鑑',
-'易于' => '易於',
 '昔人有云' => '昔人有云',
 '星历' => '星曆',
 '星期后' => '星期後',
@@ -5973,7 +5886,6 @@ public static $zh2Hant = [
 '时钟' => '時鐘',
 '时间不准' => '時間不準',
 '晃荡' => '晃蕩',
-'晚于' => '晚於',
 '晚钟' => '晚鐘',
 '晞发' => '晞髮',
 '晨钟' => '晨鐘',
@@ -6048,7 +5960,6 @@ public static $zh2Hant = [
 '有只' => '有隻',
 '有余' => '有餘',
 '有发头陀寺' => '有髮頭陀寺',
-'服于' => '服於',
 '望了望' => '望了望',
 '望后石' => '望后石',
 '朝乾夕惕' => '朝乾夕惕',
@@ -6069,6 +5980,7 @@ public static $zh2Hant = [
 '本庄' => '本庄',
 '本征' => '本徵',
 '本出戏' => '本齣戲',
+'术虎高' => '朮虎高',
 '术赤' => '朮赤',
 '朱庆余' => '朱慶餘',
 '朱理安历' => '朱理安曆',
@@ -6117,7 +6029,6 @@ public static $zh2Hant = [
 '枯干' => '枯乾',
 '架钟' => '架鐘',
 '某只' => '某隻',
-'染指于' => '染指於',
 '染殿后' => '染殿后',
 '染发' => '染髮',
 '柜上' => '柜上',
@@ -6132,7 +6043,6 @@ public static $zh2Hant = [
 '校准' => '校準',
 '校舍' => '校舍',
 '核准' => '核准',
-'格于' => '格於',
 '格范' => '格範',
 '格里历' => '格里曆',
 '格里高利历' => '格里高利曆',
@@ -6175,7 +6085,6 @@ public static $zh2Hant = [
 '杠杆' => '槓桿',
 '乐器钟' => '樂器鐘',
 '乐游原' => '樂遊原',
-'樊于期' => '樊於期',
 '梁上' => '樑上',
 '梁柱' => '樑柱',
 '樗里子' => '樗里子',
@@ -6240,7 +6149,6 @@ public static $zh2Hant = [
 '歌后' => '歌后',
 '歌钟' => '歌鐘',
 '欧游' => '歐遊',
-'止于' => '止於',
 '正官庄' => '正官庄',
 '正文里' => '正文裡',
 '正杰' => '正杰',
@@ -6251,10 +6159,8 @@ public static $zh2Hant = [
 '歲聿云暮' => '歲聿云暮',
 '历史里' => '歷史裡',
 '归并' => '歸併',
-'归于' => '歸於',
 '归余' => '歸餘',
 '歹斗' => '歹鬥',
-'死于' => '死於',
 '死里求生' => '死裡求生',
 '死里逃生' => '死裡逃生',
 '殖谷' => '殖穀',
@@ -6264,8 +6170,8 @@ public static $zh2Hant = [
 '殷师牛斗' => '殷師牛鬥',
 '殷鉴' => '殷鑑',
 '壳里' => '殼裡',
+'殿里' => '殿裡',
 '殿钟自鸣' => '殿鐘自鳴',
-'毁于' => '毀於',
 '毁钟为铎' => '毀鐘為鐸',
 '殴斗' => '毆鬥',
 '母后' => '母后',
@@ -6305,7 +6211,6 @@ public static $zh2Hant = [
 '污蔑' => '污衊',
 '汤卤' => '汤滷',
 '汤滷' => '汤滷',
-'汲于' => '汲於',
 '决斗' => '決鬥',
 '沈淀' => '沈澱',
 '沈郁' => '沈鬱',
@@ -6336,7 +6241,6 @@ public static $zh2Hant = [
 '泡面' => '泡麵',
 '波棱菜' => '波稜菜',
 '波发藻' => '波髮藻',
-'泥于' => '泥於',
 '注云' => '注云',
 '注释' => '注釋',
 '泰山梁木' => '泰山梁木',
@@ -6361,7 +6265,6 @@ public static $zh2Hant = [
 '洪钟' => '洪鐘',
 '汹涌' => '洶湧',
 '流征' => '流徵',
-'流于' => '流於',
 '流荡' => '流蕩',
 '流风余俗' => '流風餘俗',
 '流风余韵' => '流風餘韻',
@@ -6369,7 +6272,6 @@ public static $zh2Hant = [
 '浩荡' => '浩蕩',
 '浪荡' => '浪蕩',
 '浪游' => '浪遊',
-'浮于' => '浮於',
 '浮荡' => '浮蕩',
 '浮夸' => '浮誇',
 '浮松' => '浮鬆',
@@ -6410,7 +6312,6 @@ public static $zh2Hant = [
 '淑范' => '淑範',
 '泪干' => '淚乾',
 '泪如泉涌' => '淚如泉湧',
-'淡于' => '淡於',
 '淡蒙蒙' => '淡濛濛',
 '净余' => '淨餘',
 '净发' => '淨髮',
@@ -6447,7 +6348,6 @@ public static $zh2Hant = [
 '汤下面' => '湯下麵',
 '汤团' => '湯糰',
 '汤面' => '湯麵',
-'源于' => '源於',
 '准不准' => '準不準',
 '准例' => '準例',
 '准保' => '準保',
@@ -6484,10 +6384,8 @@ public static $zh2Hant = [
 '沟大曲' => '溝大麯',
 '沟谷' => '溝谷',
 '溟蒙' => '溟濛',
-'溢于' => '溢於',
 '温洛克期' => '溫洛克期',
 '溲面' => '溲麵',
-'溺于' => '溺於',
 '滃郁' => '滃鬱',
 '滑借' => '滑藉',
 '汇丰' => '滙豐',
@@ -6530,7 +6428,6 @@ public static $zh2Hant = [
 '潜水钟表' => '潛水鐘錶',
 '潭里' => '潭裡',
 '潮涌' => '潮湧',
-'溃于' => '潰於',
 '涩谷区' => '澀谷區',
 '澄江县' => '澂江縣',
 '澄澹精致' => '澄澹精致',
@@ -6671,10 +6568,8 @@ public static $zh2Hant = [
 '犖确' => '犖确',
 '荦确' => '犖确',
 '狂并潮' => '狂併潮',
-'狃于' => '狃於',
 '狄志杰' => '狄志杰',
 '狐借虎威' => '狐藉虎威',
-'猛于' => '猛於',
 '猛冲' => '猛衝',
 '猜三划五' => '猜三划五',
 '犹如表' => '猶如錶',
@@ -6699,7 +6594,6 @@ public static $zh2Hant = [
 '王余鱼' => '王餘魚',
 '珍肴异馔' => '珍肴異饌',
 '班里' => '班裡',
-'现于' => '現於',
 '球台' => '球檯',
 '理一个发' => '理一個髮',
 '理一次发' => '理一次髮',
@@ -6716,13 +6610,11 @@ public static $zh2Hant = [
 '瓷制' => '瓷製',
 '甄后' => '甄后',
 '瓮安' => '甕安',
-'甚于' => '甚於',
 '甜、咸' => '甜、鹹',
 '甜水面' => '甜水麵',
 '甜咸' => '甜鹹',
 '甜面酱' => '甜麵醬',
 '生力面' => '生力麵',
-'生于' => '生於',
 '生物钟' => '生物鐘',
 '生发生' => '生發生',
 '生华发' => '生華髮',
@@ -6730,26 +6622,22 @@ public static $zh2Hant = [
 '生锈' => '生鏽',
 '生发' => '生髮',
 '苏醒' => '甦醒',
-'用于' => '用於',
 '用法里' => '用法裡',
 '甩发' => '甩髮',
 '田子里' => '田子里',
 '田庄英雄' => '田庄英雄',
 '田里' => '田裡',
+'田里穗' => '田里穗',
 '由余' => '由余',
-'由于' => '由於',
 '甲胄' => '甲冑',
 '甲后路' => '甲后路',
 '男仆' => '男僕',
 '界里' => '界裡',
-'畏于' => '畏於',
 '留发展' => '留發展',
 '留发生' => '留發生',
 '留发行' => '留發行',
 '留长发' => '留長髮',
 '留发' => '留髮',
-'毕于' => '畢於',
-'毕业于' => '畢業於',
 '毕生发展' => '畢生發展',
 '画里' => '畫裡',
 '当准' => '當準',
@@ -6759,7 +6647,6 @@ public static $zh2Hant = [
 '疏松' => '疏鬆',
 '疑系' => '疑係',
 '疑凶' => '疑兇',
-'疲于' => '疲於',
 '疲困' => '疲睏',
 '病征' => '病徵',
 '病愈' => '病癒',
@@ -6801,7 +6688,6 @@ public static $zh2Hant = [
 '百周后' => '百周後',
 '百天后' => '百天後',
 '百子里' => '百子里',
-'百年' => '百年',
 '百拙千丑' => '百拙千醜',
 '百科里' => '百科裡',
 '百谷' => '百穀',
@@ -6837,7 +6723,6 @@ public static $zh2Hant = [
 '皱折' => '皺摺',
 '盆吊' => '盆弔',
 '盈余' => '盈餘',
-'益于' => '益於',
 '盒里' => '盒裡',
 '盛赞' => '盛讚',
 '盗采' => '盜採',
@@ -6848,14 +6733,12 @@ public static $zh2Hant = [
 '卢棱伽' => '盧稜伽',
 '荡气回肠' => '盪氣迴腸',
 '盲干' => '盲幹',
-'直于' => '直於',
 '直冲' => '直衝',
 '相并' => '相併',
 '相克制' => '相克制',
 '相克服' => '相克服',
 '相克' => '相剋',
 '相干' => '相干',
-'相于' => '相於',
 '相冲' => '相衝',
 '相斗' => '相鬥',
 '看法里' => '看法裡',
@@ -6871,8 +6754,6 @@ public static $zh2Hant = [
 '眼眶里' => '眼眶裡',
 '眼睛里' => '眼睛裡',
 '眼里' => '眼裡',
-'着眼于' => '着眼於',
-'着眼於' => '着眼於',
 '困乏' => '睏乏',
 '困倦' => '睏倦',
 '困觉' => '睏覺',
@@ -6895,7 +6776,6 @@ public static $zh2Hant = [
 '瞩托' => '矚託',
 '矜夸' => '矜誇',
 '短几' => '短几',
-'短于' => '短於',
 '短发生' => '短發生',
 '短发' => '短髮',
 '矮几' => '矮几',
@@ -6937,7 +6817,6 @@ public static $zh2Hant = [
 '祭吊' => '祭弔',
 '禁欲' => '禁慾',
 '禁欲主义' => '禁欲主義',
-'祸于' => '禍於',
 '御侮' => '禦侮',
 '御寇' => '禦寇',
 '御寒' => '禦寒',
@@ -6973,7 +6852,6 @@ public static $zh2Hant = [
 '秒钟' => '秒鐘',
 '秤杆' => '秤桿',
 '秦沈客运' => '秦瀋客運',
-'移祸于' => '移禍於',
 '稀松' => '稀鬆',
 '程十发' => '程十髮',
 '棱台' => '稜台',
@@ -7004,6 +6882,7 @@ public static $zh2Hant = [
 '谷旦' => '穀旦',
 '谷梁' => '穀梁',
 '谷壳' => '穀殼',
+'谷氨' => '穀氨',
 '谷物' => '穀物',
 '谷皮' => '穀皮',
 '谷神' => '穀神',
@@ -7011,6 +6890,7 @@ public static $zh2Hant = [
 '谷谷' => '穀穀',
 '谷米' => '穀米',
 '谷粒' => '穀粒',
+'谷胱' => '穀胱',
 '谷舱' => '穀艙',
 '谷苗' => '穀苗',
 '谷草' => '穀草',
@@ -7039,11 +6919,9 @@ public static $zh2Hant = [
 '窗帘' => '窗簾',
 '窝里' => '窩裡',
 '窝里斗' => '窩裡鬥',
-'穷于' => '窮於',
 '穷追不舍' => '窮追不捨',
 '穷发' => '窮髮',
 '窃钟掩耳' => '竊鐘掩耳',
-'立于' => '立於',
 '立范' => '立範',
 '童仆' => '童僕',
 '竞斗' => '競鬥',
@@ -7056,7 +6934,6 @@ public static $zh2Hant = [
 '笑里藏刀' => '笑裡藏刀',
 '笔杆' => '筆桿',
 '笔秃墨干' => '筆禿墨乾',
-'等于' => '等於',
 '笋干' => '筍乾',
 '筑前' => '筑前',
 '筑北' => '筑北',
@@ -7126,7 +7003,6 @@ public static $zh2Hant = [
 '精制住' => '精制住',
 '精制服' => '精制服',
 '精干' => '精幹',
-'精于' => '精於',
 '精准' => '精準',
 '精致' => '精緻',
 '精制' => '精製',
@@ -7179,17 +7055,14 @@ public static $zh2Hant = [
 '细如发' => '細如髮',
 '细致' => '細緻',
 '细炼' => '細鍊',
-'终于' => '終於',
 '组里' => '組裡',
 '结伴同游' => '結伴同遊',
 '结伙' => '結夥',
 '结扎' => '結紮',
 '结余' => '結餘',
 '结发' => '結髮',
-'绝于' => '絕於',
 '绞干' => '絞乾',
 '络腮胡' => '絡腮鬍',
-'给于' => '給於',
 '丝恩发怨' => '絲恩髮怨',
 '丝制' => '絲製',
 '丝发' => '絲髮',
@@ -7283,15 +7156,12 @@ public static $zh2Hant = [
 '坛子' => '罈子',
 '坛坛罐罐' => '罈罈罐罐',
 '坛騞' => '罈騞',
-'置于' => '置於',
 '置言成范' => '置言成範',
-'罢于' => '罷於',
 '罗马历' => '羅馬曆',
 '罗马历代' => '羅馬歷代',
 '罗马历史' => '羅馬歷史',
 '羁系' => '羈繫',
 '美容美发' => '美容美髮',
-'美于' => '美於',
 '美丑' => '美醜',
 '美发学' => '美髮學',
 '美发师' => '美髮師',
@@ -7313,7 +7183,6 @@ public static $zh2Hant = [
 '老仆' => '老僕',
 '老干部' => '老幹部',
 '老懞' => '老懞',
-'老于' => '老於',
 '老爷钟' => '老爺鐘',
 '老白干' => '老白乾',
 '老姜' => '老薑',
@@ -7324,7 +7193,7 @@ public static $zh2Hant = [
 '耍斗' => '耍鬥',
 '耕获' => '耕穫',
 '耳余' => '耳餘',
-'è\80¿äº\8e' => 'è\80¿æ\96¼',
+'è\80¶å¾\8bæ\9c¯ç\83\88' => 'è\80¶å¾\8bæ\9c®ç\83\88',
 '聊斋志异' => '聊齋志異',
 '圣人历' => '聖人曆',
 '圣后' => '聖后',
@@ -7336,7 +7205,6 @@ public static $zh2Hant = [
 '闻风后' => '聞風後',
 '联系' => '聯繫',
 '声母后' => '聲母後',
-'听于' => '聽於',
 '肉干' => '肉乾',
 '肉欲' => '肉慾',
 '肉丝面' => '肉絲麵',
@@ -7422,7 +7290,6 @@ public static $zh2Hant = [
 '自制服' => '自制服',
 '自制的能' => '自制的能',
 '自制能力' => '自制能力',
-'自于' => '自於',
 '自然数里' => '自然數裡',
 '自由钟' => '自由鐘',
 '自制' => '自製',
@@ -7431,11 +7298,8 @@ public static $zh2Hant = [
 '臭气冲天' => '臭氣衝天',
 '至多' => '至多',
 '至多只' => '至多只',
-'至于' => '至於',
-'致于' => '致於',
 '台佟' => '臺佟',
 '台静农' => '臺靜農',
-'臻于' => '臻於',
 '舂谷' => '舂穀',
 '举手表' => '舉手表',
 '舉手表' => '舉手表',
@@ -7474,7 +7338,6 @@ public static $zh2Hant = [
 '苑里' => '苑裡',
 '若干' => '若干',
 '苦干' => '苦幹',
-'苦于' => '苦於',
 '苦里' => '苦裡',
 '苦斗' => '苦鬥',
 '苧麻' => '苧麻',
@@ -7508,6 +7371,7 @@ public static $zh2Hant = [
 '庄里' => '莊裡',
 '茎干' => '莖幹',
 '莜面' => '莜麵',
+'莪术' => '莪朮',
 '莽荡' => '莽蕩',
 '菜干' => '菜乾',
 '菜坛' => '菜罈',
@@ -7520,8 +7384,6 @@ public static $zh2Hant = [
 '万个' => '萬個',
 '万周后' => '萬周後',
 '万天后' => '萬天後',
-'万年' => '萬年',
-'万年历' => '萬年曆',
 '万年历表' => '萬年曆錶',
 '万历' => '萬曆',
 '万历史' => '萬歷史',
@@ -7530,7 +7392,6 @@ public static $zh2Hant = [
 '万象' => '萬象',
 '万只' => '萬隻',
 '万余' => '萬餘',
-'落于' => '落於',
 '落腮胡' => '落腮鬍',
 '落发' => '落髮',
 '叶叶琴' => '葉叶琴',
@@ -7542,7 +7403,6 @@ public static $zh2Hant = [
 '葡萄干' => '葡萄乾',
 '董氏封发' => '董氏封髮',
 '葫芦里卖甚么药' => '葫蘆裡賣甚麼藥',
-'葬于' => '葬於',
 '蒙雾露' => '蒙霧露',
 '蒜发' => '蒜髮',
 '蒲席' => '蒲蓆',
@@ -7619,7 +7479,6 @@ public static $zh2Hant = [
 '借箸代筹' => '藉箸代籌',
 '借资' => '藉資',
 '蓝淀' => '藍澱',
-'藏于' => '藏於',
 '藏历' => '藏曆',
 '藏历史' => '藏歷史',
 '藏蒙歌儿' => '藏矇歌兒',
@@ -7637,7 +7496,6 @@ public static $zh2Hant = [
 '萝卜干' => '蘿蔔乾',
 '虎须' => '虎鬚',
 '虎斗' => '虎鬥',
-'处于' => '處於',
 '虚夸' => '虛誇',
 '号志' => '號誌',
 '虫部' => '虫部',
@@ -7666,7 +7524,6 @@ public static $zh2Hant = [
 '行事历史' => '行事歷史',
 '行凶' => '行兇',
 '行家里手' => '行家裡手',
-'行于' => '行於',
 '卫后庄公' => '衛後莊公',
 '卫星钟' => '衛星鐘',
 '冲上' => '衝上',
@@ -7720,7 +7577,6 @@ public static $zh2Hant = [
 '冲风' => '衝風',
 '衡鉴' => '衡鑑',
 '表面包' => '表面包',
-'衷于' => '衷於',
 '袋杆' => '袋桿',
 '袋里' => '袋裡',
 '袋表' => '袋錶',
@@ -7742,7 +7598,6 @@ public static $zh2Hant = [
 '里海' => '裏海',
 '里白' => '裏白',
 '里运河' => '裏運河',
-'补于' => '補於',
 '补注' => '補註',
 '装折' => '裝摺',
 '里勾外连' => '裡勾外連',
@@ -7859,12 +7714,10 @@ public static $zh2Hant = [
 '要冲' => '要衝',
 '复信' => '覆信',
 '复核' => '覆核',
-'见于' => '見於',
 '见棱见角' => '見稜見角',
 '见素抱朴' => '見素抱樸',
 '见钟不打' => '見鐘不打',
 '规范' => '規範',
-'视于' => '視於',
 '观采' => '觀採',
 '角抵' => '角牴',
 '角落发' => '角落發',
@@ -7934,7 +7787,6 @@ public static $zh2Hant = [
 '词干' => '詞幹',
 '词汇' => '詞彙',
 '词余' => '詞餘',
-'询于' => '詢於',
 '试制' => '試製',
 '詩云' => '詩云',
 '诗云' => '詩云',
@@ -8114,7 +7966,6 @@ public static $zh2Hant = [
 '趙惠后' => '趙惠后',
 '赵治勋' => '趙治勳',
 '趱干' => '趲幹',
-'足于' => '足於',
 '足球台' => '足球台',
 '跌扑' => '跌扑',
 '路图里' => '路圖裡',
@@ -8127,10 +7978,8 @@ public static $zh2Hant = [
 '踡局' => '踡跼',
 '逾闲' => '踰閑',
 '蹒局' => '蹣跼',
-'蹪于' => '蹪於',
 '蹭棱子' => '蹭稜子',
 '躁郁' => '躁鬱',
-'身于' => '身於',
 '身体发肤' => '身體髮膚',
 '躯干' => '軀幹',
 '车库里' => '車庫裡',
@@ -8139,7 +7988,6 @@ public static $zh2Hant = [
 '车里雅宾斯克' => '車里雅賓斯克',
 '轨范' => '軌範',
 '轩辟' => '軒闢',
-'较于' => '較於',
 '挽曲' => '輓曲',
 '挽歌' => '輓歌',
 '挽联' => '輓聯',
@@ -8148,7 +7996,6 @@ public static $zh2Hant = [
 '挽车' => '輓車',
 '挽输' => '輓輸',
 '挽辞' => '輓辭',
-'轻于' => '輕於',
 '轻松' => '輕鬆',
 '轻松松' => '輕鬆鬆',
 '轮奸' => '輪姦',
@@ -8173,7 +8020,6 @@ public static $zh2Hant = [
 '近日无仇' => '近日無讎',
 '返朴' => '返樸',
 '迥然回异' => '迥然迴異',
-'迫于' => '迫於',
 '回光返照' => '迴光返照',
 '回圈' => '迴圈',
 '回廊' => '迴廊',
@@ -8201,7 +8047,6 @@ public static $zh2Hant = [
 '回銮' => '迴鑾',
 '回响' => '迴響',
 '回风' => '迴風',
-'迷于' => '迷於',
 '迷蒙' => '迷濛',
 '追凶' => '追兇',
 '退伙' => '退夥',
@@ -8245,7 +8090,6 @@ public static $zh2Hant = [
 '这出' => '這齣',
 '通奸' => '通姦',
 '通心面' => '通心麵',
-'通于' => '通於',
 '通历' => '通曆',
 '通历史' => '通歷史',
 '通鉴' => '通鑑',
@@ -8314,17 +8158,13 @@ public static $zh2Hant = [
 '游错' => '遊錯',
 '游骑兵' => '遊騎兵',
 '游魂' => '遊魂',
-'过于' => '過於',
 '过水面' => '過水麵',
 '遏制' => '遏制',
 '道范' => '道範',
-'逊于' => '遜於',
 '递回' => '遞迴',
 '远游' => '遠遊',
 '遨游' => '遨遊',
-'适于' => '適於',
 '遮丑' => '遮醜',
-'迁于' => '遷於',
 '选手表明' => '選手表明',
 '选手表决' => '選手表決',
 '选手表现' => '選手表現',
@@ -8366,7 +8206,6 @@ public static $zh2Hant = [
 '部落发' => '部落發',
 '郭后' => '郭后',
 '都市里' => '都市裡',
-'都于' => '都於',
 '乡愿' => '鄉愿',
 '鄉愿' => '鄉愿',
 '郑凯云' => '鄭凱云',
@@ -8384,7 +8223,6 @@ public static $zh2Hant = [
 '酸姜' => '酸薑',
 '腌制' => '醃製',
 '醇朴' => '醇樸',
-'醉于' => '醉於',
 '醋坛' => '醋罈',
 '丑丫头' => '醜丫頭',
 '丑事' => '醜事',
@@ -8411,7 +8249,6 @@ public static $zh2Hant = [
 '丑恶' => '醜惡',
 '丑态' => '醜態',
 '丑毙了' => '醜斃了',
-'丑于' => '醜於',
 '丑末' => '醜末',
 '丑样' => '醜樣',
 '丑死' => '醜死',
@@ -8450,7 +8287,6 @@ public static $zh2Hant = [
 '里海茨' => '里海茨',
 '里铺' => '里舖',
 '重回' => '重回',
-'重于' => '重於',
 '重罗面' => '重羅麵',
 '重制' => '重製',
 '重复' => '重複',
@@ -8612,16 +8448,15 @@ public static $zh2Hant = [
 '鉴察' => '鑑察',
 '鉴往知来' => '鑑往知來',
 '鉴戒' => '鑑戒',
+'鉴于' => '鑑於',
 '鉴湖' => '鑑湖',
 '鉴藏' => '鑑藏',
 '鉴谅' => '鑑諒',
 '鉴证' => '鑑證',
 '鉴识' => '鑑識',
 '鉴赏' => '鑑賞',
-'鉴于' => '鑒於',
 '長几' => '長几',
 '长几' => '長几',
-'长于' => '長於',
 '长历' => '長曆',
 '长历史' => '長歷史',
 '长发公主' => '長髮公主',
@@ -8652,7 +8487,6 @@ public static $zh2Hant = [
 '闯荡' => '闖蕩',
 '闯炼' => '闖鍊',
 '关系' => '關係',
-'关于' => '關於',
 '辟佛' => '闢佛',
 '辟作' => '闢作',
 '辟划' => '闢劃',
@@ -8670,9 +8504,7 @@ public static $zh2Hant = [
 '防御' => '防禦',
 '防范' => '防範',
 '防锈' => '防鏽',
-'阻于' => '阻於',
 '阿里' => '阿里',
-'附于' => '附於',
 '附注' => '附註',
 '限制' => '限制',
 '院里' => '院裡',
@@ -8697,11 +8529,10 @@ public static $zh2Hant = [
 '阳谷' => '陽穀',
 '隆准许' => '隆准許',
 '隆准' => '隆準',
-'é\9a\8fäº\8e' => 'é\9a¨æ\96¼',
+'é\98\9fé\87\8c' => 'é\9a\8a裡',
 '隐占' => '隱佔',
 '隐几' => '隱几',
 '隱几' => '隱几',
-'隐于' => '隱於',
 '只字' => '隻字',
 '只影' => '隻影',
 '只手遮天' => '隻手遮天',
@@ -8712,7 +8543,6 @@ public static $zh2Hant = [
 '雅范' => '雅範',
 '集团' => '集團',
 '集数里' => '集數裡',
-'集于' => '集於',
 '集里' => '集裡',
 '集游法' => '集遊法',
 '雕梁画栋' => '雕樑畫棟',
@@ -8732,9 +8562,7 @@ public static $zh2Hant = [
 '鸡腿面' => '雞腿麵',
 '鸡蛋里挑骨头' => '雞蛋裡挑骨頭',
 '鸡只' => '雞隻',
-'离于' => '離於',
 '难舍' => '難捨',
-'难于' => '難於',
 '雨蒙蒙' => '雨濛濛',
 '雪窗萤几' => '雪窗螢几',
 '雪窗螢几' => '雪窗螢几',
@@ -8750,7 +8578,6 @@ public static $zh2Hant = [
 '零个' => '零個',
 '零周后' => '零周後',
 '零天后' => '零天後',
-'零年' => '零年',
 '零只' => '零隻',
 '零余' => '零餘',
 '电子表格' => '電子表格',
@@ -8821,7 +8648,6 @@ public static $zh2Hant = [
 '頂多' => '頂多',
 '顶多' => '頂多',
 '项链' => '項鍊',
-'顺于' => '順於',
 '顺钟向' => '順鐘向',
 '顺风后' => '順風後',
 '须根据' => '須根據',
@@ -8871,7 +8697,6 @@ public static $zh2Hant = [
 '台风后' => '颱風後',
 '刮了' => '颳了',
 '刮倒' => '颳倒',
-'刮去' => '颳去',
 '刮大风' => '颳大風',
 '刮得' => '颳得',
 '刮走' => '颳走',
@@ -9345,7 +9170,6 @@ public static $zh2Hant = [
 '盐卤' => '鹽滷',
 '盐余' => '鹽餘',
 '鹿場里' => '鹿場里',
-'丽于' => '麗於',
 '麟游' => '麟遊',
 '曲酒' => '麯酒',
 '曲尘' => '麴塵',
@@ -13447,7 +13271,6 @@ public static $zh2Hans = [
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '五箇山' => '五箇山',
-'什么' => '什么',
 '仇讎' => '仇雠',
 '以微知著' => '以微知著',
 '仰屋著書' => '仰屋著书',
@@ -13525,7 +13348,6 @@ public static $zh2Hans = [
 '覆核' => '复核',
 '覆检' => '复检',
 '復甦' => '复苏',
-'多么' => '多么',
 '大麴' => '大曲',
 '天道为乾' => '天道为乾',
 '天道為乾' => '天道为乾',
@@ -13556,13 +13378,12 @@ public static $zh2Hans = [
 '年陞' => '年升',
 '么九' => '幺九',
 '么二三' => '幺二三',
+'么兒' => '幺儿',
 '么元' => '幺元',
 '么鳳' => '幺凤',
 '么半' => '幺半',
-'么半群' => '幺半群',
-'么廝' => '幺厮',
-'幺厮' => '幺厮',
 '么叔' => '幺叔',
+'么喝' => '幺喝',
 '么女' => '幺女',
 '么媽' => '幺妈',
 '么妹' => '幺妹',
@@ -13570,22 +13391,20 @@ public static $zh2Hans = [
 '么姨' => '幺姨',
 '么娘' => '幺娘',
 '么孃' => '幺娘',
-'幺孃' => '幺娘',
 '么子' => '幺子',
 '么小' => '幺小',
 '么弟' => '幺弟',
 '么正' => '幺正',
 '么氏' => '幺氏',
+'么爺' => '幺爷',
 '么爸' => '幺爸',
 '么爹' => '幺爹',
 '么篇' => '幺篇',
 '么舅' => '幺舅',
 '么蛾子' => '幺蛾子',
-'么謙' => '幺谦',
+'么雞' => '幺鸡',
 '么麼' => '幺麽',
-'么麽' => '幺麽',
 '幺麽' => '幺麽',
-'么麽小丑' => '幺麽小丑',
 '慶餘' => '庆馀',
 '康乾' => '康乾',
 '张法乾' => '张法乾',
@@ -13594,7 +13413,6 @@ public static $zh2Hans = [
 '待覆' => '待复',
 '後姓' => '後姓',
 '慫慂' => '怂恿',
-'怎么' => '怎么',
 '恩威並著' => '恩威并著',
 '噁心' => '恶心',
 '情蒐' => '情搜',
@@ -13821,11 +13639,8 @@ public static $zh2Hans = [
 '躊躇滿志' => '踌躇滿志',
 '較著' => '较著',
 '近角聪信' => '近角聪信',
-'这么' => '这么',
 '造麴' => '造曲',
 '遺著' => '遗著',
-'那么' => '那么',
-'那麽' => '那麽',
 '郭子乾' => '郭子乾',
 '酒麴' => '酒曲',
 '醉瀋' => '醉渖',
@@ -13889,9 +13704,8 @@ public static $zh2Hans = [
 '鬱氏' => '鬱氏',
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
+'麼氏' => '麽氏',
 '麽氏' => '麽氏',
-'麼麼' => '麽麽',
-'麽麽' => '麽麽',
 '黃麴毒素' => '黄曲毒素',
 '黃潤乾' => '黄润乾',
 '黄润乾' => '黄润乾',
@@ -13940,6 +13754,7 @@ public static $zh2TW = [
 '落車' => '下車',
 '不來梅' => '不萊梅',
 '不来梅' => '不萊梅',
+'幺' => '么',
 '以太网' => '乙太網',
 '九杆' => '九桿',
 '了結他' => '了結他',
@@ -14133,8 +13948,6 @@ public static $zh2TW = [
 '发达国家' => '已開發國家',
 '巴塞罗那' => '巴塞隆納',
 '巴塞隆拿' => '巴塞隆納',
-'巴布亚新几内亚' => '巴布亞紐幾內亞',
-'巴布亞新畿內亞' => '巴布亞紐幾內亞',
 '巴士拉' => '巴斯拉',
 '巴巴多斯' => '巴貝多',
 '佈' => '布',
@@ -14155,7 +13968,6 @@ public static $zh2TW = [
 '账' => '帳',
 '干着急' => '干著急',
 '干着' => '幹著',
-'畿內亞' => '幾內亞',
 '几内亚比绍' => '幾內亞比索',
 '幾內亞比紹' => '幾內亞比索',
 '比利牛斯' => '庇里牛斯',
@@ -14218,6 +14030,8 @@ public static $zh2TW = [
 '數碼電視' => '數位電視',
 '調制解調器' => '數據機',
 '调制解调器' => '數據機',
+'斯堪的納維亞' => '斯堪地那維亞',
+'斯堪的纳维亚' => '斯堪地那維亞',
 '斯洛文尼亚' => '斯洛維尼亞',
 '斯洛文尼亞' => '斯洛維尼亞',
 '新罕布什尔' => '新罕布夏',
@@ -14376,6 +14190,7 @@ public static $zh2TW = [
 '新奥尔良' => '紐奧良',
 '新奧爾良' => '紐奧良',
 '新几内亚' => '紐幾內亞',
+'新幾內亞' => '紐幾內亞',
 '新西兰' => '紐西蘭',
 '新西蘭' => '紐西蘭',
 '紙煙' => '紙菸',
@@ -14697,7 +14512,6 @@ public static $zh2HK = [
 '·威尔士' => '·威爾士',
 '·威爾士' => '·威爾士',
 '一地里' => '一地裏',
-'一年里' => '一年裏',
 '三十六著' => '三十六着',
 '三極體' => '三極管',
 '旧金山' => '三藩市',
@@ -14723,6 +14537,7 @@ public static $zh2HK = [
 'C肝' => '丙肝',
 '并发布' => '並發佈',
 '中文里' => '中文裏',
+'幺' => '么',
 '乘著' => '乘着',
 '乘著作' => '乘著作',
 '乘著名' => '乘著名',
@@ -15387,6 +15202,7 @@ public static $zh2HK = [
 '地占' => '地佔',
 '地图里' => '地圖裏',
 '堪培拉' => '坎培拉',
+'坐台铁' => '坐台鐵',
 '坐台' => '坐枱',
 '坐著' => '坐着',
 '坐著作' => '坐著作',
@@ -15554,7 +15370,6 @@ public static $zh2HK = [
 '巴塞罗那' => '巴塞隆拿',
 '巴塞隆納' => '巴塞隆拿',
 '巴貝多' => '巴巴多斯',
-'巴布亞紐幾內亞' => '巴布亞新畿內亞',
 '巴士拉' => '巴斯拉',
 '巷里' => '巷裏',
 '市占' => '市佔',
@@ -15591,6 +15406,7 @@ public static $zh2HK = [
 '賓士' => '平治',
 '年代里' => '年代裏',
 '年里' => '年裏',
+'年里约' => '年里約',
 '干着' => '幹着',
 '幹著' => '幹着',
 '幹著名' => '幹著名',
@@ -16032,9 +15848,11 @@ public static $zh2HK = [
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '斥著錄' => '斥著錄',
+'斯堪地那維亞' => '斯堪的納維亞',
 '史瓦濟蘭' => '斯威士蘭',
 '斯洛維尼亞' => '斯洛文尼亞',
 '紐澳良' => '新奧爾良',
+'紐幾內亞' => '新幾內亞',
 '紐西蘭' => '新西蘭',
 '方法里' => '方法裏',
 '族里' => '族裏',
@@ -16211,6 +16029,7 @@ public static $zh2HK = [
 '殺著述' => '殺著述',
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
+'殿里' => '殿裏',
 '茅利塔尼亞' => '毛里塔尼亞',
 '模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
@@ -16500,8 +16319,6 @@ public static $zh2HK = [
 '過著述' => '當著述',
 '當著錄' => '當著錄',
 '過著錄' => '當著錄',
-'几内亚' => '畿內亞',
-'幾內亞' => '畿內亞',
 '迭代' => '疊代',
 '疑著' => '疑着',
 '疑著作' => '疑著作',
@@ -16589,7 +16406,7 @@ public static $zh2HK = [
 '著法' => '着法',
 '著涼' => '着涼',
 '著火' => '着火',
-'è\91\97ç\94\9a麽' => 'ç\9d\80ç\94\9a麽',
+'è\91\97ç\94\9a麼' => 'ç\9d\80ç\94\9a麼',
 '著眼' => '着眼',
 '著祂' => '着祂',
 '著筆' => '着筆',
@@ -17496,6 +17313,7 @@ public static $zh2HK = [
 '陪著述' => '陪著述',
 '陪著錄' => '陪著錄',
 '阴沟里翻船' => '陰溝裏翻船',
+'队里' => '隊裏',
 '隔著' => '隔着',
 '隔著作' => '隔著作',
 '隔著名' => '隔著名',
@@ -18071,7 +17889,6 @@ public static $zh2CN = [
 '涼著者' => '凉著者',
 '涼著述' => '凉著述',
 '湊合著' => '凑合着',
-'畿內亞' => '几内亚',
 '幾內亞比索' => '几内亚比绍',
 '凱薩琳' => '凯瑟琳',
 '嘉芙蓮' => '凯瑟琳',
@@ -18216,6 +18033,7 @@ public static $zh2CN = [
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
 '叫著述' => '叫著述',
+'台北韓' => '台北韩',
 '桌上型電腦' => '台式电脑',
 '撞球' => '台球',
 '台帳' => '台账',
@@ -18503,7 +18321,6 @@ public static $zh2CN = [
 '巴斯拉' => '巴士拉',
 '帕邁拉環礁' => '巴尔米拉环礁',
 '巴貝多' => '巴巴多斯',
-'巴布亞紐幾內亞' => '巴布亚新几内亚',
 '布殊' => '布什',
 '布吉納法索' => '布基纳法索',
 '布隆泉' => '布隆方丹',
@@ -18985,6 +18802,7 @@ public static $zh2CN = [
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '史丹福大學' => '斯坦福大学',
+'斯堪地那維亞' => '斯堪的纳维亚',
 '史達林' => '斯大林',
 '史瓦濟蘭' => '斯威士兰',
 '斯洛維尼亞' => '斯洛文尼亚',
@@ -19420,8 +19238,8 @@ public static $zh2CN = [
 '著絲' => '着丝',
 '著麼' => '着么',
 '著人' => '着人',
-'著什麼' => '着什么',
-'è\91\97ç\94\9a麽' => '着什么',
+'著什' => '着什',
+'è\91\97ç\94\9a麼' => '着什么',
 '著他' => '着他',
 '著令' => '着令',
 '著位' => '着位',
@@ -20066,6 +19884,7 @@ public static $zh2CN = [
 '軟體' => '软件',
 '軟體動物' => '软体动物',
 '軟體家具' => '软体家具',
+'軟體生物' => '软体生物',
 '軟碟機' => '软驱',
 '載著' => '载着',
 '載著書' => '载著书',
index 4f0b535..9d10b51 100644 (file)
        "passwordreset-emaildisabled": "Tanda e-surat ka geupeumaté lam wiki nyoë",
        "passwordreset-username": "Ureueng ngui:",
        "passwordreset-domain": "Domain",
-       "passwordreset-capture": "Eu hasé surat-e?",
-       "passwordreset-capture-help": "Meunyoë droëneuh neuceuë kutak nyoë, e-surat (ngon narit rahsia siat) ka geupeuleumah keudroëneuh ngon geukirém cit keu ureuëng ngui",
        "passwordreset-email": "Alamat surat-e:",
        "passwordreset-emailtitle": "Teuneurang nan ureueng ngui bak {{SITENAME}}",
        "passwordreset-emailelement": "Nan ureuëng ngui: \n$1\n\nLageuëm rahsia sijamong: \n$2",
        "searchprofile-advanced-tooltip": "Mita bak ruweuëng nan meupat-pat",
        "search-result-size": "$1 ({{PLURAL:$2|1 narit|$2 narit}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})",
-       "search-redirect": "(peuninah $1)",
+       "search-redirect": "(geupupinah nibak $1)",
        "search-section": "(bideuëng $1)",
        "search-suggest": "Kadang meukeusud Droëneuh nakeuh: $1",
        "search-interwiki-caption": "Buët la’én",
        "prefs-rendering": "Seuneudeuh",
        "saveprefs": "Keubah",
        "prefs-editing": "Neuandam",
-       "rows": "Baréh:",
        "searchresultshead": "Mita",
        "stub-threshold-disabled": "Geupeumaté",
        "timezoneuseoffset": "La'én (peuteuntèe bidajih)",
        "userrights-groupsmember": "Anggèeta nibak:",
        "userrights-reason": "Dalèh:",
        "userrights-no-interwiki": "Droeneuh hana izin keu neuubah khut ureueng ngui bak wiki la'én.",
-       "userrights-notallowed": "Droeneuh hana izin keu neutamah atawa neupeugadöh khut ureueng ngui.",
        "userrights-changeable-col": "Kawan nyang jeut neugantoe",
        "userrights-unchangeable-col": "Kawan nyang han jeut neugantoe",
        "group": "Kawan:",
        "rcnotefrom": "Di yup nyoë nakeuh neuubah yôh <strong>$2</strong> (geupeudeuh trôh ‘an <strong>$1</strong> neuubah).",
        "rclistfrom": "Peudeuih neuubah barô yôh $3 $2 kön",
        "rcshowhideminor": "$1 andam bacut",
+       "rcshowhideminor-show": "Peuleumah",
        "rcshowhideminor-hide": "Peusom",
        "rcshowhidebots": "$1 bot",
        "rcshowhidebots-show": "Peuleumah",
+       "rcshowhidebots-hide": "Peusom",
        "rcshowhideliu": "$1 ureuëng ngui tamöng",
        "rcshowhideliu-hide": "Peusom",
        "rcshowhideanons": "$1 ureuëng ngui hana nan",
+       "rcshowhideanons-show": "Peuleumah",
        "rcshowhideanons-hide": "Peusom",
        "rcshowhidepatr": "$1 andam teurunda",
        "rcshowhidemine": "$1 atra lôn andam",
+       "rcshowhidemine-show": "Peuleumah",
        "rcshowhidemine-hide": "Peusom",
        "rclinks": "Peudeuih $1 neuubah barô lam $2 uroë nyoë<br />$3",
        "diff": "bida",
        "deleteotherreason": "Nyang la’én/choë la’én:",
        "deletereasonotherlist": "Choë la’én",
        "rollbacklink": "pulang",
+       "rollbacklinkcount": "peuriwang $1 {{PLURAL:$1|neuandam}}",
        "protectlogpage": "Log lindông",
        "protectedarticle": "peulindông \"[[$1]]\"",
        "modifiedarticleprotection": "Ubah tingkat lindông \"[[$1]]\"",
        "contributions": "Beuneuri {{GENDER:$1|ureuëng ngui}}",
        "contributions-title": "Beuneuri ureuëng ngui keu $1",
        "mycontris": "Beuneuri",
+       "anoncontribs": "Beuneuri",
        "contribsub2": "Keu {{GENDER:$3|$1}} ($2)",
        "uctop": "(jinoë)",
        "month": "Mula phôn buleuën (ngön sigohlomjih)",
        "thumbnail-more": "Peurayek",
        "thumbnail_error": "Salah bak peugöt gamba cut: $1",
        "importlogpage": "Log impor",
-       "tooltip-pt-userpage": "Laman ureuëng ngui droëneuh",
+       "tooltip-pt-userpage": "Mieng {{GENDER:|ureueng ngui Droeneuh}}",
        "tooltip-pt-mytalk": "Laman marit droëneuh",
-       "tooltip-pt-preferences": "Geunalak",
+       "tooltip-pt-preferences": "Atô",
        "tooltip-pt-watchlist": "Dapeuta laman nyang lônkalön",
        "tooltip-pt-mycontris": "Dapeuta beuneuri Droëneuh",
        "tooltip-pt-login": "Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.",
        "exif-software": "Software geungui",
        "exif-exifversion": "Versi Exif",
        "exif-colorspace": "Ruweuëng wareuna",
+       "exif-datetimeoriginal": "Uroe buleuen ngön watèe peugöt data",
        "exif-datetimedigitized": "Uroë buleuën ngön watèë digital",
        "exif-orientation-1": "Biasa",
        "namespacesall": "ban dum",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|geusampôh}} miëng $3",
        "logentry-newusers-create": "$1 {{GENDER:$2|geupeugöt}} akun ureuëng ngui",
-       "searchsuggest-search": "Mita",
+       "logentry-upload-upload": "$1 {{GENDER:$2|geupasoe}} $3",
+       "searchsuggest-search": "Mita {{SITENAME}}",
        "duration-seconds": "{{PLURAL:$1|deutik}}",
        "duration-minutes": "{{PLURAL:$1|minèt}}",
        "duration-hours": "{{PLURAL:$1|jeum}}",
index 794eae2..90b5be8 100644 (file)
        "editfont-monospace": "خط ثابت العرض",
        "editfont-sansserif": "خط بلا زوائد",
        "editfont-serif": "خط بزوائد",
+       "sunday": "الأحد",
+       "tuesday": "الثلاث",
+       "wednesday": "الأربعا",
+       "thursday": "الخميس",
+       "friday": "الجمعة",
+       "saturday": "السبت",
+       "sun": "الأحد",
+       "mon": "الإثنين",
+       "tue": "الثلاث",
+       "wed": "الأربعا",
+       "thu": "الخميس",
+       "fri": "الجمعة",
+       "sat": "السبت",
+       "january": "جانفي",
+       "february": "فيڥري",
+       "march": "مارس",
+       "april": "أڥريل",
+       "may_long": "ماي",
+       "june": "جوان",
+       "july": "جويلية",
+       "august": "أوت",
+       "september": "سبتمبر",
+       "october": "أكتوبر",
+       "november": "نوڥمبر",
+       "december": "ديسمبر",
+       "january-gen": "جانفي",
+       "february-gen": "فيڥري",
+       "march-gen": "مارس",
+       "april-gen": "أڥريل",
+       "may-gen": "ماي",
+       "june-gen": "جوان",
+       "july-gen": "جويلية",
+       "august-gen": "أوت",
+       "september-gen": "سبتمبر",
+       "october-gen": "أكتوبر",
+       "november-gen": "نوڥمبر",
+       "december-gen": "ديسمبر",
+       "jan": "جانفي",
+       "feb": "فيڥري",
+       "mar": "مارس",
+       "apr": "أڥريل",
+       "may": "ماي",
+       "jun": "جوان",
+       "jul": "جويلية",
+       "aug": "أوت",
+       "sep": "سبتمبر",
+       "oct": "أكتوبر",
+       "nov": "نوڥمبر",
+       "dec": "ديسمبر",
        "category_header": "صفحات تصنيف \"$1\"",
        "subcategories": "التصنيفات الفرعية",
        "category-media-header": "الوسائط في التصنيف \"$1\"",
        "broken-file-category": "صفحات تحتوي وصلات ملفات معطوبة",
        "about": "عن",
        "article": "صفحة محتوى",
-       "newwindow": "(تفتح في نافذة جديدة)",
+       "newwindow": "(تتحلّ في شبّاك جديد)",
+       "cancel": "بطّل",
        "mypage": "صفحتي",
        "mytalk": "نقاشي",
+       "returnto": "إرجع لـ$1",
+       "tagline": "من {{SITENAME}}",
+       "help": "معاونة",
+       "search": "لوّج",
+       "searchbutton": "لوّج",
+       "searcharticle": "إمشي",
+       "history": "تاريخ الپاج",
+       "history_short": "التاريخ",
+       "view": "شوفة",
+       "view-foreign": "ورّي على $1",
+       "edit": "بدّل",
+       "talkpagelinktext": "پاج الحديث",
+       "talk": "حديث",
+       "views": "شوفات",
+       "otherlanguages": "في لغات أخرين",
+       "redirectto": "تحويل لـ:",
+       "lastmodifiedat": "آخر تبديل لهذي الپاج كان نهار $1 في $2.",
+       "jumpto": "إمشي لـ:",
+       "jumptosearch": "لوّج",
+       "aboutsite": "على {{SITENAME}}",
        "copyright": "المحتوى متوفر تحت $1.",
+       "edithelp": "معاونة باش تبدّل پاج",
+       "mainpage": "الپاج الأولانيّة",
+       "mainpage-description": "الپاج الأولانيّة",
        "badaccess": "خطأ في السماح",
        "badaccess-group0": "ليس من المسموح لك تنفيذ الفعل الذي طلبته.",
        "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
        "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
        "youhavenewmessages": "توجد لديك $1 ($2).",
        "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
+       "editsection": "بدّل",
+       "editlink": "بدّل",
+       "viewsourcelink": "شوف المصدر",
+       "editsectionhint": "بدّل الطرف: $1",
        "viewdeleted": "أأعرض $1؟",
        "restorelink": "{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديلا محذوفا}}",
        "feedlinks": "التغذية:",
        "site-rss-feed": "$1 تلقيم أر إس إس",
        "page-rss-feed": "\"$1\" تلقيم أر إس إس",
        "page-atom-feed": "$1 تلقيم أتوم",
+       "red-link-title": "$1 (الپاج ما فمّاش)",
        "sort-descending": "ترتيب تنازلي",
        "sort-ascending": "ترتيب تصاعدي",
+       "nstab-main": "الپاج",
        "nstab-user": "صفحة مستخدم",
        "nstab-media": "صفحة وسيط",
-       "nstab-project": "صفحة مشروع",
+       "nstab-project": "پاج مشروع",
+       "nstab-image": "فيشياي",
        "nstab-template": "قالب",
        "nstab-help": "صفحة مساعدة",
        "nstab-category": "تصنيف",
+       "mainpage-nstab": "الپاج الأولانيّة",
        "nosuchaction": "لا يوجد فعل كهذا",
        "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.\nهذا ربما يشير أيضا إلى علة في {{SITENAME}}.",
        "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
        "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nتستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
        "yourname": "اسم المستخدم:",
        "yourpassword": "كلمة السر:",
+       "userlogin-yourpassword-ph": "دخّل كلمة السر",
+       "createacct-yourpassword-ph": "دخّل كلمة السر",
        "yourpasswordagain": "أعد كتابة كلمة السر:",
+       "createacct-yourpasswordagain-ph": "دخّل كلمة السر مرة أخرى",
        "yourdomainname": "نطاقك:",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "ادخل",
        "gotaccount": "تمتلك حسابا بالفعل؟ '''$1'''.",
        "gotaccountlink": "ادخل",
        "userlogin-resetlink": "أنسيت بيانات الولوج؟",
+       "createacct-emailoptional": "الإيمايل (إختياري)",
+       "createacct-email-ph": "دخّل الإيمايل متاعك",
        "createaccountmail": "بواسطة البريد الإلكتروني",
        "createaccountreason": "السبب:",
+       "createacct-submit": "أعمل الحساب",
+       "createacct-benefit-heading": "{{SITENAME}} إتّعمل بعباد كيفك.",
+       "createacct-benefit-body3": "آخر {{PLURAL:$1|مساهم|مساهمين}}",
        "badretype": "كلمات السر التي أدخلتها لا تتطابق.",
        "userexists": "اسم المستخدم الذي تم إدخاله مستعمل بالفعل.\nالرجاء اختيار اسم مختلف.",
        "loginerror": "خطأ في الدخول",
        "login-abort-generic": "لم ينجح ولوجك - إجهاض",
        "loginlanguagelabel": "اللغة: $1",
        "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
-       "pt-login": "Odkul",
+       "pt-login": "أدخل",
+       "pt-createaccount": "أعمل حساب",
+       "pt-userlogout": "أخرج",
        "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
        "user-mail-no-addy": "لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.",
        "resetpass_announce": "تم تسجيل دخولك بكلمة سر مؤقتة.\nللدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:",
        "resetpass-submit-loggedin": "تغيير كلمة السر",
        "resetpass-wrong-oldpass": "كلمة سر حالية أو مؤقتة غير صحيحة.\nربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.",
        "resetpass-temp-password": "كلمة سر مؤقتة:",
-       "passwordreset": "إعادة Ø¶Ø¨Ø· كلمة السر",
+       "passwordreset": "تبدÙ\8aÙ\84 كلمة السر",
        "passwordreset-disabled": "عُطّلت إعادة تعيين كلمة السر على هذه الويكي.",
        "passwordreset-username": "اسم المستخدم:",
        "passwordreset-domain": "النطاق:",
-       "passwordreset-capture": "أأعرض البريد الإلكتروني الناتج؟",
-       "passwordreset-capture-help": "إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.",
        "passwordreset-email": "عنوان البريد الإلكتروني:",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "passwordreset-emailtext-ip": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
        "savearticle": "احفظ الصفحة",
        "preview": "معاينة",
        "showpreview": "أظهر معاينة",
-       "showdiff": "أظهر التغييرات",
+       "showdiff": "ورّي التبديلات",
        "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
        "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.'''",
        "token_suffix_mismatch": "'''تعديلك تم رفضه لأن عميلك أخطأ في علامات الترقيم\nفي نص التعديل. تم رفض التعديل لمنع فساد نص المقالة.\nهذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
        "edit_form_incomplete": "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
-       "editing": "تحرÙ\8aر $1",
-       "creating": "Ø¥Ù\86شاء «$1»",
-       "editingsection": "تحرÙ\8aر $1 (Ù\82سÙ\85)",
+       "editing": "تبدÙ\8aÙ\84 $1",
+       "creating": "عÙ\85Ù\84اÙ\86 «$1»",
+       "editingsection": "تبدÙ\8aÙ\84 $1 (طرÙ\81)",
        "editingcomment": "تعديل $1 (قسم جديد)",
        "editconflict": "تضارب في التحرير: $1",
        "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nوالتغييرات التي قمت أنت بها موجودة في الصندوق في أسفل الصفحة.\nيجب أن تقوم بدمج تغييراتك في النص الموجود حاليا.\n'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
        "semiprotectedpagewarning": "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "cascadeprotectedwarning": "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
        "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "templatesused": "{{PLURAL:$1||اÙ\84Ù\82اÙ\84ب Ø§Ù\84Ù\85ستخدÙ\85|اÙ\84Ù\82اÙ\84باÙ\86 Ø§Ù\84Ù\85ستخدÙ\85اÙ\86|اÙ\84Ù\82Ù\88اÙ\84ب Ø§Ù\84Ù\85ستخدÙ\85Ø©}} Ù\81Ù\8a Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة:",
+       "templatesused": "{{PLURAL:$1||اÙ\84Ù\82اÙ\84ب Ø§Ù\84Ù\85ستعÙ\85Ù\84Ø©|اÙ\84Ù\82Ù\88اÙ\84ب Ø§Ù\84Ù\85ستعÙ\85Ù\84Ø©}} Ù\81Ù\8a Ù\87Ø°Ù\8a Ø§Ù\84پاج:",
        "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
        "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
+       "template-protected": "(محمي)",
        "template-semiprotected": "(حماية جزئية)",
        "hiddencategories": "{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:",
        "nocreatetext": "قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.\nيمكنك العودة وتحرير صفحة موجودة بالفعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].",
        "sectioneditnotsupported-text": "تعديل الأقسام غير مدعوم في هذه الصفحة",
        "permissionserrors": "أخطاء السماحات",
        "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
-       "permissionserrorstext-withaction": "Ù\84ا ØªÙ\85Ù\84Ù\83 Ø§Ù\84صÙ\84احÙ\8aات Ù\84$2Ø\8c Ù\84Ù\84{{PLURAL:$1||سبب Ø§Ù\84تاÙ\84Ù\8a|سببÙ\8aÙ\86 Ø§Ù\84تاÙ\84Ù\8aÙ\8aÙ\86|أسباب Ø§Ù\84تاÙ\84Ù\8aØ©}}:",
+       "permissionserrorstext-withaction": "Ù\85ا Ø¹Ù\86دÙ\83Ø´ Ø§Ù\84Ø­Ù\82 Ø¨Ø´ $2Ø\8c Ø¹Ù\84Ù\89 Ø®Ø§Ø·Ø±{{PLURAL:$1||Ù\87ا Ø§Ù\84سبب|Ù\87ا Ø§Ù\84أسباب}}:",
        "recreate-moveddeleted-warn": "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
-       "moveddeleted-notice": "Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة ØªÙ\85 Ø­Ø°Ù\81Ù\87ا.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
+       "moveddeleted-notice": "Ù\87ا Ø§Ù\84پاج ØªÙ\81سخت.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
        "log-fulllog": "أظهر السجل الكامل",
        "edit-hook-aborted": "التعديل تم تركه بواسطة الخطاف.\nلم يعط تفسيرا.",
        "edit-gone-missing": "لم يمكن تحديث الصفحة.\nيبدو أنه تم حذفها.",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
        "revision-info": "مراجعة $1 بواسطة $2",
        "previousrevision": "→ مراجعة أقدم",
-       "nextrevision": "Ù\85راجعة Ø£Ø­Ø¯Ø« ←",
+       "nextrevision": "Ù\85راجعة Ø£Ø¬Ø¯Ø¯ ←",
        "currentrevisionlink": "المراجعة الحالية",
        "cur": "الحالي",
        "next": "التالي",
        "rev-suppressed-unhide-diff": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
        "rev-deleted-diff-view": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-diff-view": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-delundel": "أظÙ\87ر/أخÙ\81",
+       "rev-delundel": "ظÙ\87Ù\91ر/خبÙ\91Ù\8a",
        "rev-showdeleted": "أظهر",
        "revisiondelete": "حذف/استرجاع المراجعات",
        "revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
        "revertmerge": "إلغاء الدمج",
        "mergelogpagetext": "بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.",
        "history-title": " «$1»: تاريخ المراجعة",
-       "difference-title": "«$1»: الفرق بين المراجعتين",
+       "difference-title": "«$1»: الفرق بينات المراجعتين",
        "difference-title-multipage": "«$1» و«$2»: الفرق بين الصفحتين",
        "difference-multipage": "(الفرق بين الصفحتين)",
-       "lineno": "Sţar $1:",
+       "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
+       "editundo": "نحّي",
        "diff-multi-manyusers": "({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)",
-       "prevn": "{{PLURAL:$1|$1}} السابقة",
-       "nextn": "{{PLURAL:$1|$1}} التالية",
+       "searchresults": "نتايج التلويج",
+       "prevn": "{{PLURAL:$1|$1}} الفايتة",
+       "nextn": "{{PLURAL:$1|$1}} الجاية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "searchmenu-new": "'''أنشئ الصفحة \"[[:$1]]\" في هذا الويكي!'''",
+       "searchprofile-everything": "كلّ شي",
+       "searchprofile-articles-tooltip": "لوّج في $1",
+       "searchprofile-images-tooltip": "لوّج عالتصاور",
        "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})",
        "search-redirect": "(تحويلة $1)",
-       "search-suggest": "Ù\87Ù\84 كنت تقصد: $1",
+       "search-suggest": "Ù\8aاخÙ\8a كنت تقصد: $1",
        "searchrelated": "مرتبطة",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "mypreferences": "تفضيلاتي",
        "prefs-help-email-others": "يمكنك أيضا اختيار للسماح للآخرين الاتصال بك عن طريق صفحة المستخدم أو نقاش المستخدم الخاص بك دون الحاجة إلى الكشف عن الهوية الخاصة بك.",
        "newuserlogpage": "سجل إنشاء المستخدمين",
        "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
+       "enhancedrc-history": "تاريخ",
+       "recentchanges": "التبديلات الجدد",
        "recentchanges-legend": "خيارات أحدث التغييرات",
        "recentchanges-summary": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
        "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
-       "recentchanges-label-newpage": "Ø£Ù\86شأ Ù\87ذا Ø§Ù\84تعدÙ\8aÙ\84 ØµÙ\81حة جديدة",
-       "recentchanges-label-minor": "Ù\87ذا ØªØ¹Ø¯Ù\8aÙ\84 Ø·Ù\81Ù\8aÙ\81",
-       "recentchanges-label-bot": "أجرÙ\89 Ù\87ذا Ø§Ù\84تعديل بوت",
+       "recentchanges-label-newpage": "عÙ\85Ù\84 Ù\87ذا Ø§Ù\84تبدÙ\8aÙ\84 Ù¾Ø§Ø¬ جديدة",
+       "recentchanges-label-minor": "Ù\87ذا ØªØ¨Ø¯Ù\8aÙ\84 ØµØºÙ\8aر",
+       "recentchanges-label-bot": "عÙ\85Ù\84 Ù\87ذا Ø§Ù\84تبديل بوت",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف زادة [[Special:NewPages|ليستة الپاجات الجدد]])",
        "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-       "rclistfrom": "أظهر التغييرات بدءا من $3 $2",
+       "rclistfrom": "ورّي التبديلات بدءا من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
+       "rcshowhideminor-hide": "خبّي",
        "rcshowhidebots": "$1 البوتات",
+       "rcshowhidebots-show": "ورّي",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
+       "rcshowhideliu-hide": "خبّي",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
+       "rcshowhideanons-hide": "خبّي",
        "rcshowhidepatr": "$1 التعديلات المراجعة",
        "rcshowhidemine": "$1 تعديلاتي",
+       "rcshowhidemine-hide": "خبّي",
        "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
+       "hist": "تاريخ",
        "hide": "أخف",
-       "show": "اعرض",
+       "show": "ورّي",
+       "minoreditletter": "ص",
+       "newpageletter": "ج‌",
+       "boteditletter": "ب",
+       "rc-change-size-new": "$1 {{PLURAL:$1|أوكتاي|أوكتاي}} بعد التبديل",
        "rc-enhanced-expand": "عرض التفاصيل (يتطلب جافاسكريبت)",
        "rc-enhanced-hide": "أخفِ التفاصيل",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
-       "recentchangeslinked-summary": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø§Ù\84تغÙ\8aÙ\8aرات Ø§Ù\84تÙ\8a ØªÙ\85ت Ø­Ø¯Ù\8aثاÙ\8b Ù\84Ù\84صÙ\81حات Ø§Ù\84Ù\85Ù\88صÙ\88Ù\84Ø© Ù\85Ù\86 ØµÙ\81حة Ù\85عÙ\8aÙ\86Ø© (Ø£Ù\88 Ø¥Ù\84Ù\89 Ø§Ù\84أعضاء Ø¶Ù\85Ù\86 ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84صÙ\81حات Ù\81Ù\8a [[Special:Watchlist|Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83]] '''عرÙ\8aضة'''",
-       "recentchangeslinked-page": "اسÙ\85 Ø§Ù\84صÙ\81حة:",
+       "recentchangeslinked-summary": "Ù\87Ø°Ù\8a Ù\84Ù\8aستة Ø¨Ø§Ù\84تبدÙ\8aÙ\84ات Ø¥Ù\84Ù\91Ù\8a ØµØ§Ø±Ù\88ا Ù\85ا ØµØ§Ø±Ù\84Ù\87Ù\85Ø´ Ø¨Ø±Ø´Ø§ Ù\84Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a Ù\85Ù\88جÙ\88د Ù\84Ù\8aاÙ\86 Ù\8aدÙ\91Ù\8a Ù\84Ù\8aÙ\87Ù\85 Ù\81Ù\8a Ù¾Ø§Ø¬ Ø¨Ø°Ø§ØªÙ\87ا (Ù\88Ù\84Ù\91ا Ù\81Ù\8a Ù¾Ø§Ø¬ Ù\85تاع ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84پاجات Ù\81Ù\8a [[Special:Watchlist|Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a ØªÙ\91بعÙ\87ا]] '''Ù\85Ù\83تÙ\88بÙ\8aÙ\86 Ø¨Ø§Ù\84غÙ\84Ù\8aظ'''",
+       "recentchangeslinked-page": "إسÙ\85 Ø§Ù\84پاج:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
+       "upload": "صبّ فشياي",
        "uploadlogpage": "سجل الرفع",
        "filedesc": "ملخص:",
        "license": "ترخيص:",
+       "file-anchor-link": "فيشياي",
+       "filehist": "تاريخ الپاج",
        "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
        "filehist-revert": "استرجع",
        "filehist-current": "حالي",
        "filehist-thumbtext": "تصغير للنسخة بتاريخ $1",
        "filehist-user": "مستخدم",
        "filehist-dimensions": "الأبعاد",
-       "imagelinks": "استخدام الملف",
+       "filehist-comment": "تعليق",
+       "imagelinks": "استعمال الدوسي",
        "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
        "nolinkstoimage": "لا توجد صفحات تصل لهذا الملف.",
        "sharedupload-desc-here": "هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.\nالوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.",
+       "upload-disallowed-here": "ما تنجّمش تبدّل هذي التصويرة.",
        "statistics": "إحصاءات",
-       "nmembers": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}",
+       "nmembers": "{{PLURAL:$1|حتى عضو|عضو واحد||زوز أعضاء|$1 عضو}}",
        "prefixindex": "كل الصفحات بالبادئة",
        "usercreated": "{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2",
+       "newpages": "پاجات جدد",
        "move": "انقل",
        "pager-newer-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "booksources": "مصادر كتاب",
-       "booksources-search-legend": "اÙ\84بحث Ø¹Ù\86 مصادر الكتب",
+       "booksources-search-legend": "اÙ\84تÙ\84Ù\88Ù\8aج Ø¹Ù\84Ù\89 مصادر الكتب",
        "log": "سجلات",
        "allpagessubmit": "اذهب",
        "categories": "تصنيفات",
        "listgrouprights-members": "(قائمة الأعضاء)",
        "emailuser": "إرسال رسالة لهذا المستخدم",
        "watchlist": "قائمة مراقبتي",
-       "mywatchlist": "Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\8a",
+       "mywatchlist": "Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a Ù\86تبÙ\91عÙ\87ا",
        "watchlistfor2": "ل$1 $2",
        "watch": "راقب",
        "unwatch": "أوقف المراقبة",
        "actioncomplete": "انتهاء العملية",
        "actionfailed": "الفعل فشل",
        "dellogpage": "سجل الحذف",
+       "rollbacklink": "رجّع",
        "protectlogpage": "سجل الحماية",
        "protectedarticle": "حمى \"[[$1]]\"",
        "undeletelink": "اعرض/استعد",
        "undeleteviewlink": "اعرض",
        "namespace": "النطاق",
        "invert": "اعكس الاختيار",
-       "contributions": "مساهماتي",
+       "blanknamespace": "(رئيسي)",
+       "contributions": "مساهمات {{GENDER:$1|المستعمل|المستعملة}}",
        "contributions-title": "مساهمات المستخدم $1",
        "mycontris": "مساهماتي",
+       "anoncontribs": "مساهمات",
        "contribsub2": "ل$1 ($2)",
-       "month": "Ù\85Ù\86 Ø³Ù\86Ø© (Ù\88أقدم):",
-       "year": "Ù\85Ù\86 Ø³Ù\86Ø© (Ù\88أقدم):",
+       "month": "Ù\85Ù\86 Ø´Ù\87ر (Ù\88 أقدم):",
+       "year": "Ù\85Ù\86 Ø¹Ø§Ù\85 (Ù\88 أقدم):",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
        "sp-contributions-blocklog": "سجل المنع",
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
+       "whatlinkshere-page": "الپاج:",
        "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
        "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
        "isredirect": "صفحة تحويل",
        "isimage": "وصلة ملف",
        "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
        "whatlinkshere-links": "← وصلات",
-       "whatlinkshere-hideredirs": "$1 Ø§Ù\84تحÙ\88Ù\8aÙ\84ات",
+       "whatlinkshere-hideredirs": "$1 تحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
-       "whatlinkshere-hidelinks": "$1 الوصلات",
+       "whatlinkshere-hidelinks": "$1 ليانات",
        "whatlinkshere-hideimages": "$1 وصلة صورة",
        "whatlinkshere-filters": "مرشحات",
        "ipboptions": "ساعتين:2 hours,يوم واحد:1 day,3 أيام:3 days,أسبوع واحد:1 week,أسبوعين:2 weeks,شهر واحد:1 month,3 أشهر:3 months,6 أشهر:6 months,سنة واحدة:1 year,دائم:infinite",
        "ipblocklist": "المستخدمون الممنوعون",
+       "blocklink": "بلوكي",
        "unblocklink": "ارفع المنع",
        "change-blocklink": "تغيير المنع",
        "blocklogpage": "سجل المنع",
        "blocklogentry": "منع \"[[$1]]\" لفترة زمنية مدتها $2 $3",
        "block-log-flags-nocreate": "إنشاء الحسابات ممنوع",
-       "movelogpage": "سجل النقل",
+       "movelogpage": "سجل التحويل",
        "revertmove": "استرجع",
        "export": "تصدير صفحات",
        "allmessagesname": "الاسم",
        "tooltip-pt-preferences": "تفضيلاتي",
        "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
        "tooltip-pt-mycontris": "قائمة مساهماتك",
+       "tooltip-pt-login": "ماذابيك لوكان تدخل للويكي، أما موش لازمك تعمل هكّا",
        "tooltip-pt-logout": "خروج",
+       "tooltip-pt-createaccount": "ماذابيك لوكان تعمل حساب و تدخل للويكي، أما موش لازمك تعمل هكّا",
+       "tooltip-ca-edit": "بدّل الپاج",
        "tooltip-ca-addsection": "ابدأ قسما جديدا",
+       "tooltip-ca-viewsource": "هذه الپاج محمية.\nتنجّم تشوف مصدرها.",
        "tooltip-ca-protect": "احم هذه الصفحة",
        "tooltip-ca-delete": "احذف هذه الصفحة",
-       "tooltip-ca-move": "عÙ\84Ù\85 Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة",
-       "tooltip-ca-watch": "أضÙ\81 Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ø¥Ù\84Ù\89 Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83",
+       "tooltip-ca-move": "Ø­Ù\88Ù\91Ù\84 Ù\87Ø°Ù\8a Ø§Ù\84پاج",
+       "tooltip-ca-watch": "زÙ\8aد Ù\87ا Ø§Ù\84پاج Ù\84Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a ØªÙ\91بعÙ\87ا",
        "tooltip-ca-unwatch": "أزل هذه الصفحة من قائمة مراقبتك",
+       "tooltip-search": "لوّج في {{SITENAME}}",
+       "tooltip-search-go": "إمشي للپاج إلّي عندها هذا الإسم بالضبط إذا هي موجودة",
+       "tooltip-p-logo": "شوف الپاج الأولانيّة",
+       "tooltip-n-mainpage": "شوف الپاج الأولانيّة",
+       "tooltip-n-mainpage-description": "شوف الپاج الأولانيّة",
+       "tooltip-n-randompage": "خرّج پاج بالزهر",
        "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
        "tooltip-t-contributions": "رؤية قائمة مساهمات هذا المستخدم",
        "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
+       "tooltip-t-upload": "صبّ فيشيايات",
        "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
-       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\84ا ØªØ³ØªØ·Ù\8aع Ø£Ù\86 ØªØ¹Ø¯Ù\84 Ø§Ù\84صÙ\81حة Ù\86Ù\81سÙ\87ا",
+       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\8a Ù¾Ø§Ø¬ Ø³Ù¾Ø§Ø³Ù\8aاÙ\84Ø\8c Ù\88 Ù\85ا ØªÙ\86جÙ\91Ù\85Ø´ ØªØ¨Ø¯Ù\91Ù\84 Ù\81Ù\8aÙ\87ا Ø´Ù\8a",
        "tooltip-ca-nstab-project": "رؤية صفحة المحتوى",
        "tooltip-ca-nstab-image": "رؤية صفحة الملف",
        "tooltip-ca-nstab-template": "رؤية القالب",
        "tooltip-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
        "tooltip-undo": "\"رجوع\" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.\n\"Annuler\" trajjeε eltabdila lekhra w tħel fenêtre mtaε  el tabdil mtaε elvue el msabqa. Tnajjem tqoul εlech f'ettalkhis.",
        "tooltip-summary": "أدخل ملخصا قصيرا",
-       "previousdiff": "â\86\92 Ø§Ù\84تعدÙ\8aÙ\84 Ø§Ù\84سابÙ\82",
-       "nextdiff": "اÙ\84تعدÙ\8aÙ\84 Ø§Ù\84Ù\84احÙ\82 ←",
+       "previousdiff": "â\86\92 Ø§Ù\84تبدÙ\8aÙ\84 Ø§Ù\84Ù\81اÙ\8aت",
+       "nextdiff": "اÙ\84تبدÙ\8aÙ\84 Ø§Ù\84جاÙ\8a ←",
        "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "file-nohires": "لا توجد دقة أعلى متوفرة.",
        "svg-long-desc": "ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3",
+       "show-big-image": "الفيشياي الأصلي",
        "metadata": "بيانات ميتا",
        "metadata-help": "هذا الملف يحتوي على معلومات إضافية، غالبا ما تكون أضيفت من قبل الكاميرا الرقمية أو الماسح الضوئي المستخدم في إنشاء الملف.\nإذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.",
        "metadata-fields": "حقول معطيات الميتا الموجودة في هذه الرسالة سوف تعرض في صفحة الصورة عندما يكون جدول معطيات الميتا مضغوطا.\nالحقول الأخرى ستكون مخفية افتراضيا.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-datetime": "نهار و وقت تبديل الفيشياي",
        "namespacesall": "الكل",
        "monthsall": "الكل",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|حديث]])",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
        "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
-       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:"
+       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:",
+       "logentry-newusers-create": "إتحلّ حساب {{GENDER:$2|المستعمل|المستعملة}} $1",
+       "searchsuggest-search": "لوّج في {{SITENAME}}"
 }
index e7415f5..894e452 100644 (file)
@@ -16,7 +16,8 @@
                        "Macofe",
                        "WhatamIdoing",
                        "Hogweard",
-                       "Amire80"
+                       "Amire80",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Mearc under hlencan:",
        "morenotlisted": "Þis getæl meaht bēon unfulfyled.",
        "mypage": "Mīn tramet",
        "mytalk": "Mīn mōtung",
-       "anontalk": "Þisses IP naman mōtung",
+       "anontalk": "Mōtung",
        "navigation": "Þurhfōr",
        "and": "&#32;and",
        "qbfind": "Findan",
        "searcharticle": "Gān",
        "history": "Trametes stǣr",
        "history_short": "Stǣr",
+       "history_small": "stǣr",
        "updatedmarker": "nīwod æfter mīnre lætestan sōcne",
        "printableversion": "Ūtmǣlendlicu fadung",
        "permalink": "Fæst hlenca",
        "nstab-template": "Bysen",
        "nstab-help": "Helpes tramet",
        "nstab-category": "Flocc",
+       "mainpage-nstab": "Hēafodtramet",
        "nosuchaction": "Swilc dǣd ne biþ nā",
        "nosuchactiontext": "Sēo þe se nettfrumfinded wile dōn nis genge.\nÞū wēninga miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.\nÞis mæg ēac tācnian wōh on þǣre weorcwrithyrste þe is gebrocen fram {{SITENAME}}.",
        "nosuchspecialpage": "Swilc syndrig tramet ne biþ nā",
        "missingarticle-rev": "(nīwung#: $1)",
        "internalerror": "Inweard wōh",
        "internalerror_info": "Inweard wōh: $1",
+       "internalerror-fatal-exception": "Wælgescead þæs cynn is \"$1\"",
        "filecopyerror": "Nē cūðe biwrītan þā ymelan \"$1\" tō \"$2\".",
        "filerenameerror": "Ne cūðe ednemnan ymelan \"$1\" tō \"$2\".",
        "filedeleteerror": "Ne cūðe forlēosan þā ymelan \"$1\".",
+       "directorycreateerror": "We ne mot scieppan ymbfeng \"$1\"",
        "filenotfound": "Ne cūðe findan ymelan \"$1\".",
        "formerror": "Wōh: ne cūðe cȳþþugewrit forþsendan.",
        "badarticleerror": "Þēos dǣd ne cann bēon gefremed on þissum tramete.",
        "oldpassword": "Eald þafungword:",
        "newpassword": "Nīwe þafungword:",
        "retypenew": "Wrīt nīwe þafungword eft:",
+       "botpasswords-label-create": "Scieppan",
+       "botpasswords-label-update": "Nīƿa",
        "resetpass-submit-loggedin": "Andwendan þafungword",
        "resetpass-submit-cancel": "Undōn",
        "passwordreset": "Settan þafungword eft",
        "searchprofile-everything-tooltip": "Sēcan geond ealla innunga (ēac mōtungum)",
        "searchprofile-advanced-tooltip": "Sēcan on mā namsteda",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
-       "search-redirect": "(edlǣded fram \"$1\")",
+       "search-redirect": "(edlǣded fram $1)",
        "search-section": "(dǣl $1)",
        "search-suggest": "Mǣnst þū: $1",
        "search-interwiki-caption": "Sweostorweorc",
        "prefs-rc": "Nīwa andwendunga",
        "prefs-watchlist": "Wæccgetæl",
        "saveprefs": "Hordian",
-       "rows": "Rǣwa:",
-       "columns": "Sȳla:",
        "searchresultshead": "Sōcn",
        "recentchangescount": "Hū mæniga adihtunga to īwenne gewunelīce:",
        "savedprefs": "Þīna foreberunga wurdon gehordod.",
        "contributions": "{{GENDER:$1|Brūcendes}} forðunga",
        "contributions-title": "Brūcendes forðunga for $1",
        "mycontris": "Mīna forðunga",
+       "anoncontribs": "forðunga",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "uctop": "(genge)",
        "month": "Fram mōnþe (and ǣr)",
        "logentry-move-move": "$1 {{GENDER:$2|wæg}} þone tramet $3 tō $4",
        "logentry-newusers-create": "Brūcendes grīma $1 wæs {{GENDER:$2|geworht}}",
        "revdelete-summary": "ādihtscortnes",
-       "searchsuggest-search": "Sēcan",
+       "searchsuggest-search": "Sēcan {{SITENAME}}",
        "special-characters-group-latin": "Lǣden",
        "special-characters-group-latinextended": "Ēacnod Lǣden",
        "special-characters-group-symbols": "Tācnu",
index c2befb1..26b5857 100644 (file)
@@ -69,7 +69,9 @@
                        "باسم",
                        "Moud hosny",
                        "ديفيد",
-                       "Super ninja2"
+                       "Super ninja2",
+                       "Mr. Ibrahem",
+                       "Aboulouei1"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "tog-enotifrevealaddr": "أظهر عنوان بريدي الإلكتروني في إشعارات البريد الإلكتروني",
        "tog-shownumberswatching": "اعرض عدد المستخدمين المراقبين",
        "tog-oldsig": "توقيعك الحالي:",
-       "tog-fancysig": "وضع الوصلة يدوياً واستعمال نص الويكي",
+       "tog-fancysig": "جعل التوقيع  مثل نص الويكي  (دون  وصلة تلقائية)",
        "tog-uselivepreview": "استعمال المعاينة المباشرة",
        "tog-forceeditsummary": "نبهني عند عدم إدخال ملخص تعديل",
        "tog-watchlisthideown": "أخف تعديلاتي من قائمة المراقبة",
        "tog-watchlisthidebots": "أخف تعديلات البوتات من قائمة المراقبة",
-       "tog-watchlisthideminor": "أخÙ\81 Ø§Ù\84تعدÙ\8aÙ\84ات Ø§Ù\84Ø·Ù\81Ù\8aÙ\81Ø© Ù\81Ù\8a قائمة المراقبة",
-       "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة",
+       "tog-watchlisthideminor": "أخÙ\81 Ø§Ù\84تعدÙ\8aÙ\84ات Ø§Ù\84Ø·Ù\81Ù\8aÙ\81Ø© Ù\85Ù\86 قائمة المراقبة",
+       "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة\n\n\nإخفاء التعديلات التي كتبها تسجيل الدخول للمستخدمين من قائمة المراقبة",
        "tog-watchlistreloadautomatically": "أعد تحميل قائمة المراقبة بصفة آلية حينما يتغير مرشح ما (يتطلب جافاسكربت)",
        "tog-watchlisthideanons": "أخف تعديلات المستخدمين المجهولين في قائمة المراقبة",
        "tog-watchlisthidepatrolled": "أخف التعديلات المراجعة في قائمة المراقبة",
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
-       "tog-norollbackdiff": "عدم إظهار الاختلافات بعد تنفيذ التراجع",
+       "tog-norollbackdiff": "لا تظهر الفروق بعد إجراء التراجع",
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "دائما استخدم اتصالا آمنا عند تسجيل الدخول",
        "underline-always": "دائما",
        "oct": "تشرين الأول",
        "nov": "تشرين الثاني",
        "dec": "كانون الأول",
-       "january-date": "Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a\8aÙ\86اÙ\8aر $1",
-       "february-date": "شباط/فبراير $1",
-       "march-date": "آذار/مارس $1",
-       "april-date": "نيسان/أبريل $1",
-       "may-date": "أيار/مايو $1",
-       "june-date": "حزيران/يونيو $1",
-       "july-date": "تموز/يوليو $1",
-       "august-date": "آب/أغسطس $1",
-       "september-date": "Ø£Ù\8aÙ\84Ù\88Ù\84/سبتÙ\85بر $1",
-       "october-date": "تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84/Ø£Ù\83تÙ\88بر $1",
-       "november-date": "تشرين الثاني/نوفمبر $1",
-       "december-date": "كانون الأول/ديسمبر $1",
+       "january-date": "Ù\8aÙ\86اÙ\8aر/Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a $1",
+       "february-date": "فبراير/شباط $1",
+       "march-date": "مارس/آذار $1",
+       "april-date": "أبريل/نيسان $1",
+       "may-date": "مايو/أيار $1",
+       "june-date": "يونيو/حزيران $1",
+       "july-date": "يوليو/تموز $1",
+       "august-date": "أغسطس/آب $1",
+       "september-date": "سبتÙ\85بر/Ø£Ù\8aÙ\84Ù\88Ù\84 $1",
+       "october-date": "Ø£Ù\83تÙ\88بر/تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84 $1",
+       "november-date": "نوفمبر/تشرين الثاني $1",
+       "december-date": "ديسمبر/كانون الأول $1",
        "period-am": "صباحًا",
        "period-pm": "مساءً",
        "pagecategories": "{{PLURAL:$1|بلا تصنيف|تصنيف|تصنيفان|تصنيفات}}",
        "go": "اذهب",
        "searcharticle": "اذهب",
        "history": "تاريخ الصفحة",
-       "history_short": "تاريخ",
+       "history_short": "اÙ\84تارÙ\8aØ®",
        "history_small": "تاريخ",
        "updatedmarker": "عدلت منذ زيارتي الأخيرة",
        "printableversion": "نسخة للطباعة",
        "aboutsite": "عن {{SITENAME}}",
        "aboutpage": "Project:عن",
        "copyright": "المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.",
-       "copyrightpage": "{{ns:project}}:حقوق النسخ",
+       "copyrightpage": "{{ns:project}}:حقوق التأليف و النشر",
        "currentevents": "الأحداث الجارية",
        "currentevents-url": "Project:الأحداث الجارية",
        "disclaimers": "إخلاء مسؤولية",
        "cannotcreateaccount-title": "لا يمكن إنشاء الحسابات",
        "cannotcreateaccount-text": "إنشاء الحسابات المباشر غير مفعل على هذه الويكي.",
        "yourdomainname": "نطاقك:",
-       "password-change-forbidden": "أنت لا يمكنك تغيير كلمات السر على هذا الويكي.",
+       "password-change-forbidden": "لا يمكنك تغيير كلمات السر على هذا الويكي.",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "تسجيل الدخول",
        "login-security": "توكيد هويتك",
        "userloginnocreate": "تسجيل الدخول",
        "logout": "تسجيل الخروج",
        "userlogout": "اخرج",
-       "notloggedin": "غير مسجل الدخول",
+       "notloggedin": "غير مسجل للدخول",
        "userlogin-noaccount": "ليس لديك حساب؟",
        "userlogin-joinproject": "انضم إلى {{SITENAME}}",
        "nologin": "ليس لديك حساب؟ '''$1'''.",
        "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «{{int:savearticle}}» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
        "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
-       "summary-preview": "معاينة الملخص:",
-       "subject-preview": "معاينة للموضوع/العنوان:",
+       "summary-preview": "معاينة ملخص تحرير",
+       "subject-preview": "معاينة الموضوع:",
        "previewerrortext": "حدث خطأ أثناء محاولة معاينة تغييراتك.",
        "blockedtitle": "المستخدم ممنوع",
        "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "search-interwiki-caption": "المشاريع الشقيقة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
+       "search-interwiki-more-results": "المزيد من النتائج",
        "search-relatedarticle": "مرتبطة",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
        "editusergroup": "تحميل مجموعات المستخدم",
        "editinguser": "تغيير صلاحيات {{GENDER:$1|المستخدم|المستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "عرض صلاحيات المستخدم {{GENDER:$1|للمستخدم|للمستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "تعديل مجموعات المستخدم",
-       "userrights-viewusergroup": "عرض مجموعات المستخدم",
+       "userrights-editusergroup": "تعديل مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
+       "userrights-viewusergroup": "عرض مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "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": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.",
        "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-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
+       "rcfilters-highlightbutton-title": "التعليم على النتائج",
+       "rcfilters-highlightmenu-title": "اختر لونًا",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
        "rcfilters-filtergroup-registration": "تسجيل المستخدم",
        "rcfilters-filter-registered-label": "مسجل",
        "uploaded-setting-handler-svg": "SVG الذي يضبط سمة \"handler\" مع خارجي/بيانات/سكريبت ممنوع. تم العثور على <code>$1=\"$2\"</code> في ملف SVG المرفوع.",
        "uploaded-remote-url-svg": "SVG الذي يضبط أي سمة شكل مع URL خارجي ممنوع. تم العثور على <code>$1=\"$2\"</code> في ملف SVG المرفوع.",
        "uploaded-image-filter-svg": "تم العثور على فلتر صورة مع URL: <code>&lt;$1 $2=\"$3\"&gt;</code> في ملف SVG المرفوع.",
-       "uploadscriptednamespace": "يحتوي ملف SVG هذا على اسم نطاق غير مشروع \" $1 \"",
+       "uploadscriptednamespace": "يحتوي ملف SVG هذا على اسم نطاق غير مشروع \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "تعذر تحليل XML في الملف المرفوع.",
        "uploadvirus": "الملف يحتوي على فيروس! التفاصيل: $1",
        "uploadjava": "يحتوي ملف ZIP هذا على ملفات جافا .class.\nلا يسمح برفع ملفات جافا لأنها تتيح تخطي القيود الأمنية.",
        "booksources-search": "بحث",
        "booksources-text": "توجد أدناه قائمة بوصلات لمواقع أخرى تبيع الكتب الجديدة والمستعملة، أيضا يمكنك أن تحصل على معلومات إضافية عن الكتب التي تبحث عنها من هناك:",
        "booksources-invalid-isbn": "رقم ISBN المعطى لا يبدو صحيحا؛ تحقق من أخطاء النسخ من المصدر الأصلي.",
-       "magiclink-tracking-rfc": "الصفحات التي تستخدم الوصلات السحرية لRFC",
+       "magiclink-tracking-rfc": "الصفحات التي تستخدم وصلات RFC السحرية",
        "magiclink-tracking-rfc-desc": "هذه الصفحة تستخدم الوصلات السحرية لRFC. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
-       "magiclink-tracking-pmid": "الصفحات التي تستخدم الوصلات السحرية لPMID",
+       "magiclink-tracking-pmid": "الصفحات التي تستخدم وصلات PMID السحرية",
        "magiclink-tracking-pmid-desc": "هذه الصفحة تستخدم الوصلات السحرية لPMID. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
-       "magiclink-tracking-isbn": "الصفحات التي تستخدم الوصلات السحرية لISBN",
+       "magiclink-tracking-isbn": "الصفحات التي تستخدم وصلات ISBN السحرية",
        "magiclink-tracking-isbn-desc": "هذه الصفحة تستخدم الوصلات السحرية لISBN. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
        "specialloguserlabel": "المؤدي:",
        "speciallogtitlelabel": "الهدف (عنوان أو {{ns:user}}:اسم المستخدم للمستخدم):",
        "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من فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
        "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": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
index 6a9ed15..44b0f68 100644 (file)
@@ -7,7 +7,8 @@
                        "Lin linao",
                        "Poquil",
                        "Remember the dot",
-                       "아라"
+                       "아라",
+                       "Angel sm"
                ]
        },
        "tog-underline": "Miñcewirilpe lasun",
        "disclaimers": "Tukuldungun ñi pin ley",
        "disclaimerpage": "Project:Katrütuwün ñi llowdüngun",
        "edithelp": "Kellun kümeelkünuam",
-       "mainpage": "Ñidol Wülngiñ",
+       "mainpage": "Ñizol Wvbgiñ",
        "mainpage-description": "Ñidol Wülngiñ",
        "portal": "Lofche ñi wülngiñ",
        "portal-url": "Project:Lofche ñi wülngiñ",
index 46722ee..f3b72c6 100644 (file)
        "selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «{{int:savearticle}}», crearáse la redireición de toles maneres.",
        "missingcommenttext": "Por favor, escribi un comentariu abaxo.",
        "missingcommentheader": "<strong>Recordatoriu:</strong> Nun conseñasti un asuntu pa esti comentariu.\nSi calques nuevamente «{{int:savearticle}}», la to edición guardaráse ensin nengunu.",
-       "summary-preview": "Vista previa del resume:",
+       "summary-preview": "Vista previa del resume d'edición:",
        "subject-preview": "Vista previa del asuntu:",
        "previewerrortext": "Hebo un error al intentar entever los cambios.",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "search-interwiki-caption": "Proyeutos hermanos",
        "search-interwiki-default": "Resultaos de $1:",
        "search-interwiki-more": "(más)",
+       "search-interwiki-more-results": "más resultaos",
        "search-relatedarticle": "Rellacionáu",
        "searchrelated": "rellacionáu",
        "searchall": "toos",
        "editusergroup": "Cargar los grupos d'usuariu",
        "editinguser": "Camudando los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Viendo los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar los grupos d'usuariu",
-       "userrights-viewusergroup": "Ver los grupos d'usuariu",
+       "userrights-editusergroup": "Editar los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
+       "userrights-viewusergroup": "Ver los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
        "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 eliminalu del grupu una vegada tea inxeríu, o viceversa.",
+       "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-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-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-highlightbutton-title": "Resaltar resultaos",
+       "rcfilters-highlightmenu-title": "Seleiciona un color",
        "rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
        "rcfilters-filtergroup-registration": "Rexistru del usuariu",
        "rcfilters-filter-registered-label": "Rexistraos",
        "uploaded-setting-handler-svg": "Tán bloquiaos los ficheros SVG que configuren l'atributu «handler» con remote/data/script. Alcontróse <code>$1=\"$2\"</code> nel ficheru SVG xubíu.",
        "uploaded-remote-url-svg": "Tán bloquiaos los ficheros SVG que configuren atributos d'estilu con URL remotes. Alcontróse <code>$1=\"$2\"</code> nel ficheru SVG xubíu.",
        "uploaded-image-filter-svg": "Alcontróse un filtru d'imaxe con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel ficheru SVG xubíu.",
-       "uploadscriptednamespace": "Esti ficheru SVG contien l'espaciu de nomes illegal «$1»",
+       "uploadscriptednamespace": "Esti ficheru SVG contien l'espaciu de nomes illegal «<nowiki>$1</nowiki>»",
        "uploadinvalidxml": "Nun pudo interpretase'l XML del ficheru cargáu.",
        "uploadvirus": "¡El ficheru tien un virus!\nDetalles: $1",
        "uploadjava": "El ficheru ye un archivu ZIP que contien un ficheru .class de Java.\nXubir ficheros Java nun ta permitío, porque puede facer que se salten les torgues de seguridá.",
        "editcomment": "El resume de la edición yera: <em>$1</em>.",
        "revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
        "revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
+       "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
        "sessionfailure-title": "Fallu de sesión",
        "sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
        "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
        "mw-widgets-titleinput-description-redirect": "redirixir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Amestar una categoría...",
+       "mw-widgets-usersmultiselect-placeholder": "Amestar más...",
        "sessionmanager-tie": "Nun puen combinase dellos tipos de solicitú d'identificación: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basaes en cookies",
index 96529ac..9e40aca 100644 (file)
        "passwordreset-emaildisabled": "इ विकि पे ई-मेल सुविधा अक्षम कई दीहा है।",
        "passwordreset-username": "सदस्यनाँव:",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-capture": "परिणामस्वरूप बनावल ई-मेल देखा जाय?",
-       "passwordreset-capture-help": "अगर आप इ चेकबॉक्स कय टिक करा जाइ तव ई-मेल (अस्थायी गुप्तकुंजी कय साथे) आप कय देखाई अव सदस्य कय भी भेजी जाइ।",
        "passwordreset-email": "ई-मेल ठाँव:",
        "passwordreset-emailtitle": "{{SITENAME}} पे खाता कय विवरण",
        "passwordreset-emailtext-ip": "केहु (शायद आप कय, $1 आइ॰पी ठहर से) {{SITENAME}} ($4) पे अपने {{PLURAL:$3|गुप्त कुंजी}} कय रीसेट करेक अनुरोध करे है। इ ई-मेल ठहर से निचे  कय{{PLURAL:$3|खाता जोड़ान् है}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्त कुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि। आप लॉग इन कई कय एकठु नँवा गुप्त कुंजी अभीनै चुन लुहा जाए। यदि इ अनुरोध केहु अउर करे है, या फिर आप कय आपन गुप्त कुंजी याद आइ गा है, औ आप {{PLURAL:$3|आपन}} गुप्त कुंजी नाइ बदलेक चाहा जात है तव आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कै सका जात है।",
        "saveprefs": "सहेजा जाय",
        "restoreprefs": "पहिलकय सेटिङ मिलावा जाय (कुल जगही में)",
        "prefs-editing": "संपादन",
-       "rows": "कताँर:",
-       "columns": "कॉलम:",
        "searchresultshead": "खोजा जाय",
        "stub-threshold": "<a href=\"#\" class=\"stub\">आधार कड़िन्</a> कय सबसे बडा आकार (बाइट):",
        "stub-threshold-disabled": "अक्षम करा है",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "आप कय अउर विकिन् पे सदस्य अधिकार बदले कय अनुमति नाइ है।",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नाइ है या फिर स्थानीय नाइ है।",
-       "userrights-nologin": "सदस्य अधिकार बदलेक खत्तिर  प्रबंधक खाता से [[Special:UserLogin|लॉग इन]] करेक परि।",
-       "userrights-notallowed": "आप कय लगे सदस्य अधिकार जोडेक या हटावेक अनुमति नाइ है।",
        "userrights-changeable-col": "गोल (ग्रुप) जवन आप बदलि सका जात है ।",
        "userrights-unchangeable-col": "गोल (ग्रुप) जवन आप नाइ बदलि सका जात है ।",
        "userrights-conflict": "सदस्य अधिकार बदलाव में अंतर्विरोध! कृपया आपन बदलाव जाँचा जाय और फिरसे सुनिश्चित करा जाय।",
-       "userrights-removed-self": "आप सफलतापूर्वक आपन अधिकार हटाए दिहा गए। इहिक नाते अब आप इ पन्ना नाइ देख सका जात है।",
        "group": "गोल:",
        "group-user": "सदस्य:",
        "group-autoconfirmed": "अपने आप बनल सदस्य",
        "right-siteadmin": "डाटाबेस कय ताला लगावा जाय या खोला जाय",
        "right-override-export-depth": "पन्ना निर्यात करा जाय, पाँच स्तर कय गहराई तक जुड़ल पन्ना लइकय",
        "right-sendemail": "अउर सदस्यन् कय ई-मेल पठवा जाय",
-       "right-passwordreset": "गुप्तकुंजी रीसेट ई-मेल देखा जाय",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "newuserlogpage": "सदस्य खाता बनावे कय लॉग",
        "newuserlogpagetext": "ई सदस्य खाता बनावे कय लॉग होय।",
        "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।",
        "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद है।\nकृपया file_uploads जमाव कय जाँच करा जाय।",
        "uploadscripted": "इ फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जवन वेब ब्राउज़र गलत पढि सकत है।",
-       "uploadscriptednamespace": "इ एस॰वी॰जी फ़ाइल में अमान्य नामजगह \"$1\" है।",
+       "uploadscriptednamespace": "इ एस॰वी॰जी फ़ाइल में अमान्य नामजगह \"<nowiki>$1</nowiki>\" है।",
        "uploadinvalidxml": "अपलोड करल फ़ाइल कय XML पार्स नाइ होई।",
        "uploadvirus": "इ फ़ाइल में भाईरस हैं!ढेर जानकारी: $1",
        "uploadjava": "ई फ़ाइल एकठु ज़िप फ़ाइल होय जवने मे एकठु जावा .class फ़ाइल है।\nजावा फ़ाइलन् कय अपलोड नाई कै सका जात है, काहेसे एकरे कारण सुरक्षा बाधा पार होइ जाई।",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
        "searchsuggest-search": "खोज",
        "searchsuggest-containing": "...से युक्त",
-       "api-error-badaccess-groups": "इ विकि मा आप कय फाइल अपलोड करेक अनुमति नाइ है",
        "api-error-badtoken": "आंतरिक त्रुटि: खराब टोकन।",
-       "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| अन्य फ़ाइल | रहे हैं कुछ अन्य फ़ाइलों}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था कुछ अन्य फ़ाइल|कुछ अन्य फ़ाइलें}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "api-error-empty-file": "आप कय दीहल फ़ाइल खाली रहा।",
        "api-error-emptypage": "नँवा अव खाली पन्ना बनावै कय अनुमति नाइ है",
-       "api-error-fetchfileerror": "आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।",
-       "api-error-fileexists-forbidden": "\"$1\" नाँव कय फाइल मौजुद है,एकरे उप्पर नाइ लिखि सका जात है",
-       "api-error-fileexists-shared-forbidden": "\"$1\" नाँव कय फाइल साझा फाइल भण्डार मा पहिलवे से मौजुद है अव एकरे उप्पर नाइ लिखि सका जात है ।",
-       "api-error-file-too-large": "आप कय दीहल फ़ाइल बहुत बडा रहा।",
-       "api-error-filename-tooshort": "फ़ाइल कय नाँव बहुत छोट है।",
-       "api-error-filetype-banned": "अइसन फ़ाइल प्रतिबन्धित है।",
-       "api-error-filetype-banned-type": "$1 फ़ाइल {{PLURAL:$4|प्रकार|प्रकारों}} की अनुमति नहीं है। फ़ाइल प्रकार {{PLURAL:$3|जिसकी|जिनकी}} अनुमति है: $2।",
-       "api-error-filetype-missing": "फाईल कय एक्सटेंशन लापता है ।",
-       "api-error-hookaborted": "आपके द्वारा प्रयासरत संशोधन किसी एक्स्टेंशन द्वारा निरस्त किया गया।",
-       "api-error-http": "आंतरिक त्रुटि: सर्वर से कनेक्ट करय में असमर्थ।",
-       "api-error-illegal-filename": "अइसन फ़ाइल कय इजाजत नाइ है।",
-       "api-error-internal-error": "आंतरिक त्रुटि: विकि पर अपने अपलोड प्रसंस्करण के साथ कुछ गलत हो गया था.",
-       "api-error-invalid-file-key": "आंतरिक त्रुटि: फ़ाइल अस्थायी भंडारण में नहीं पाया गया.",
-       "api-error-missingparam": "आंतरिक त्रुटि: अनुरोध पे  पैरामीटर लापता",
-       "api-error-missingresult": "आन्तरिक त्रुटि: इ प्रतिलिपि सफल निर्धारित नाइ होइ सका",
-       "api-error-mustbeloggedin": "फाइल अपलोड करेक आप कय लाग इन करेक परि",
-       "api-error-mustbeposted": "आंतरिक त्रुटि: HTTP POST अनुरोध कय आवश्यकता है.",
-       "api-error-noimageinfo": "अपलोड सफल, लेकिन सर्वर ने फ़ाइल के बारे में हमें कोई जानकारी नहीं दी.",
-       "api-error-nomodule": "आंतरिक त्रुटि: कवनो अपलोड मॉड्यूल सेट नाइ है",
-       "api-error-ok-but-empty": "आंतरिक त्रुटि: सर्वर से कवनो जवाब नाइ है।",
-       "api-error-overwrite": "मौजुदा फाइल कय उप्पर नाइ लिखि सका जात अहै ।",
-       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राखय मा सर्वर असफल रहा।",
        "api-error-publishfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राखय मा सर्वर असफल रहा।",
-       "api-error-timeout": "सर्वर ने अपेक्षित समय के भीतर जवाब नहीं दिया",
-       "api-error-unclassified": "अज्ञात त्रुटि आइ गवा।",
-       "api-error-unknown-code": "अज्ञात त्रुटि: \"$1\"",
-       "api-error-unknown-error": "आंतरिक त्रुटि: आप कय फ़ाइल अपलोड प्रयास करत समय कुछ गलत होइ गवा रहा।",
+       "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राखय मा सर्वर असफल रहा।",
        "api-error-unknown-warning": "अज्ञात चेतावनी: $1",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\"",
-       "api-error-uploaddisabled": "इ विकि मा अपलोड अक्षम है.",
-       "api-error-verification-error": "इ फाइल दुषित होइ सकत है या गलत एक्टेन्शन अहै ।",
        "duration-seconds": "$1 {{PLURAL:$1|सॅकेंड}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनट}}",
        "duration-hours": "$1 {{PLURAL:$1|घंटा|घंटा}}",
index b48c450..4aa597b 100644 (file)
@@ -28,7 +28,8 @@
                        "Sayginer",
                        "Şeyx Şamil",
                        "Serkanland",
-                       "Macofe"
+                       "Macofe",
+                       "Archaeodontosaurus"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "saveprefs": "Qeyd et",
        "restoreprefs": "Bütün nizamlamaları bərpa et (bütün bölmələrdə)",
        "prefs-editing": "Redaktə",
-       "rows": "Sıralar:",
-       "columns": "Sütunlar:",
        "searchresultshead": "Axtar",
        "stub-threshold": "Qaralama məqalələrə keçidlərin tərtibatını təyinetmə diapazonu ($1):",
        "stub-threshold-sample-link": "nümunə",
        "contributions": "{{GENDER:$1|İstifadəçinin}} fəaliyyəti",
        "contributions-title": "$1 istifadəçi fəaliyyətləri",
        "mycontris": "Fəaliyyətim",
+       "anoncontribs": "Fəaliyyətim",
        "contribsub2": "{{GENDER:$3|$1}} ($2) adlı istifadəçinin fəaliyyəti",
        "nocontribs": "Bu kriteriyaya uyğun redaktələr tapılmadı",
        "uctop": "(hal-hazırkı)",
        "feedback-subject": "Mövzu:",
        "feedback-thanks-title": "Təşəkkür!",
        "searchsuggest-search": "Axtar",
-       "api-error-filename-tooshort": "Fayl adı qısadır.",
-       "api-error-filetype-banned": "Bu tip fayllar qadağandır.",
-       "api-error-illegal-filename": "Fayl adına icazə yoxdur.",
-       "api-error-unknown-code": "Naməlum xəta: \"$1\".",
        "api-error-unknown-warning": "Naməlum xəbərdarlıq: \"$1\".",
        "api-error-unknownerror": "Naməlum xəta: \"$1\".",
-       "api-error-uploaddisabled": "Bu vikidə fayl yükləmə mümkün deyil.",
        "duration-seconds": "$1 {{PLURAL:$1|saniyə|saniyə}}",
        "duration-minutes": "$1 {{PLURAL:$1|dəqiqə|dəqiqə}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
index d06e28e..fa43219 100644 (file)
        "saveprefs": "ذخیره ائت",
        "restoreprefs": "بوتون ایلک ترجیح‌لری قایتار",
        "prefs-editing": "دَییشدیرمک‌ده",
-       "rows": "سطرلر:",
-       "columns": "سوتون‌لار",
        "searchresultshead": "آختار",
        "stub-threshold": "<a href=\"#\" class=\"stub\">باغلانتی‌سیز لینکی</a> دییشدیرمک اوچون حدود (بایت‌لارلا):",
        "stub-threshold-sample-link": "میثال",
        "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
        "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
        "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
-       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی ($1) واردیر.",
+       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی (<nowiki>$1</nowiki>) واردیر.",
        "uploadinvalidxml": "یۆکله‌نیلن فایل‌دا XML تحلیل اولونانمادی.",
        "uploadvirus": "فايلدا ویروس وار!  \nدئتاللار: $1",
        "uploadjava": "فایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ فایلی‌دیر.\nجاوا فایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.",
        "protectedpages-reason": "نَدَن‌لیگی",
        "protectedpages-unknown-timestamp": "بیلینمه‌ین",
        "protectedpages-unknown-performer": "بیلینمه‌ین ایستیفاده‌چی",
-       "protectedtitles": "Ù\85حاÙ\81ظÙ\87â\80\8cÙ\84Û\8c Ø¨Ø§Ø´â\80\8cÙ\84Û\8cÙ\82â\80\8cلار",
+       "protectedtitles": "Ù\82Ù\88Ù\92رÙ\88Ù\86اÙ\86 Ø¨Ø§Ø´Ù\84Û\8cÙ\82لار",
        "protectedtitles-summary": "بۇ صحیفه، ایندیکی یارانماق‌دان قوْرونان باشلیقلاری لیست ائدیر. ایندیکی قوْرونان موْجود اوْلان صحیفه‌لرین لیستینی گؤرمک اۆچون، [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]-ه باخین.",
        "protectedtitlesempty": "حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.",
        "listusers": "ایشلدن لیستی",
        "feedback-thanks-title": "تشکورلر!",
        "searchsuggest-search": "{{SITENAME}}-دا آختار",
        "searchsuggest-containing": "ساخلانیلیر...",
-       "api-error-badaccess-groups": "سیزین بو ویکی‌یه فایل یوکله‌مک ایجازه‌نیز یوخدور.",
        "api-error-badtoken": "ایچری خطاسی: پیس کود.",
-       "api-error-copyuploaddisabled": "بو خیدمتچی‌ده، اینترنت آدرسی‌له فایل یوکله‌مک یاساقلانیب‌دیر.",
-       "api-error-duplicate": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|فایل|فایل‌لار}} واردیر.",
-       "api-error-duplicate-archive": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|فایل|فایل‌لار}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
-       "api-error-empty-file": "سیز یول‌لادیغینیز فایل، بوش ایدی.",
        "api-error-emptypage": "یئنی بوش صحیفه یارادماغا ایجازه یوخدور.",
-       "api-error-fetchfileerror": "ایچری خطا: فایلی گتیرمک‌ده بیر ایشکال قاباغا گلدی.",
-       "api-error-fileexists-forbidden": "«$1» آدلا بیر فایل واردیر و اوستونه یازماق اولماز.",
-       "api-error-fileexists-shared-forbidden": "پایلاشمیش آنباردا «$1» آدلا بیر فایل واردیر و اوستونه یازماق اولماز.",
-       "api-error-file-too-large": "سیز یول‌لادیغینیز فایل، چوخ یئکه ایدی.",
-       "api-error-filename-tooshort": "فایل آدی چوخ قیسادی.",
-       "api-error-filetype-banned": "بوجور فایل یاساق‌لانیب‌دیر.",
-       "api-error-filetype-banned-type": "$1 فایل {{PLURAL:$4|نؤوعو ایجازه‌لی دئییل|نؤوعلری ایجازه‌لی دئییل‌لر}}. ایجازه‌لی فایل {{PLURAL:$3|نؤوعو بئله‌دیر|نؤوعلاری بئله‌دیرلر}}: $2.",
-       "api-error-filetype-missing": "فایل آدینین اوزانتیسی یوخدور.",
-       "api-error-hookaborted": "سیز وئردیگینیز دَییشیکلیکلرین قاباغی، بیر extension ایله قاباغی آلیندی.",
-       "api-error-http": "ایچری خطا: خیدمتچی‌یه باغلانماق اولونمادیر.",
-       "api-error-illegal-filename": "بو فایل آدینا ایجازه یوخدور.",
-       "api-error-internal-error": "ایچری خطا: سیزین فایلینیزی بو ویکی‌یه یوکله‌مک‌ده بیر ایشکال قاباغا گلدی.",
-       "api-error-invalid-file-key": "ایچری خطا: فایل، گئچرلی آنباردا تاپیلانمادی.",
-       "api-error-missingparam": "ایچری خطا: ایستک‌ده بعضی پارامترلر وئریلمه‌ییبلر.",
-       "api-error-missingresult": "ایچری خطا: کوپی‌نین باشاریلی اولدوغو بیلینمیر.",
-       "api-error-mustbeloggedin": "فایل یوکله‌مک اوچون، گیریش ائتمه‌لیسینیز.",
-       "api-error-mustbeposted": "ایچری خطا: بو ایستک اوچون HTTP POST لازیم‌دیر.",
-       "api-error-noimageinfo": "یوکله‌مک باشاریلی اولدور، اما خیدمت‌چی فایلا گؤره هئچ بیر بیلگیلر وئرمه‌دی.",
-       "api-error-nomodule": "ایچری خطا: هئچ بیر آپلود ماژولی یوخدور.",
-       "api-error-ok-but-empty": "ایچری خطا: خیدمتچی‌دن جاواب گلمه‌دی.",
-       "api-error-overwrite": "بیر اولان فایلین اوستونه یازماغا ایجازه یوخدور.",
-       "api-error-stashfailed": "ایچری خطا: خیدمتچی، گئچیجی فایلی ساخلایانمادی.",
        "api-error-publishfailed": "ایچری خطاسی: خیدمت‌چی، گئچیجی فایلی یایانمادی.",
-       "api-error-timeout": "خیدمتچی، گؤزله‌نیلن واخت‌دا جاواب وئرمه‌دی.",
-       "api-error-unclassified": "بیر تانینمامیش خطا قاباغا گلدی.",
-       "api-error-unknown-code": "تانینمامیش خطا: «$1».",
-       "api-error-unknown-error": "ایچری خطا: سیزین فایلینیزی یوکله‌مگه چالیشاندا بیر ایشکال قاباغا گلدی.",
+       "api-error-stashfailed": "ایچری خطا: خیدمتچی، گئچیجی فایلی ساخلایانمادی.",
        "api-error-unknown-warning": "تانینمامیش ایخطار: «$1».",
        "api-error-unknownerror": "تانینمامیش خطا: «$1».",
-       "api-error-uploaddisabled": "بو ویکی‌ده یوکله‌مک باغلانیب‌دیر.",
-       "api-error-verification-error": "فایل خاراب‌دیر یوخسا یانلیش اوزانتی‌سی واردیر.",
        "duration-seconds": "{{PLURAL:$1|بیر|$1}} ثانیه",
        "duration-minutes": "{{PLURAL:$1|بیر|$1}} دقیقه",
        "duration-hours": "{{PLURAL:$1|بیر|$1}} ساعات",
index 03531a6..5470783 100644 (file)
        "uploaded-setting-handler-svg": "SVG«handler» атрибутын өҫтәүсе SVG блокланды.Тейәлгән SVG-файлда  <code>$1=\"$2\"</code> конструкцияһы табылды.",
        "uploaded-remote-url-svg": "SVG«handler» атрибутын өҫтәүсе SVG блокланды.Тейәлгән SVG-файлда  <code>$1=\"$2\"</code> конструкцияһы табылды.",
        "uploaded-image-filter-svg": "Тейәлгән SVG-файлда рәсемдәр фильтры табылды URL-адресом <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": " SVG-файлында ярамаған исем бар '$1'",
+       "uploadscriptednamespace": " SVG-файлында ярамаған исем бар '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "Тейәлгән файлда анализлап булмай XML .",
        "uploadvirus": "Файлда вирус бар!\nТулыраҡ мәғлүмәт: $1",
        "uploadjava": "Был, эсендә Java .class файлы булған ZIP-архив.\nИменлек өсөн Java-файлдарын тейәү тыйылған.",
index 23b877e..0fec39a 100644 (file)
        "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
        "passwordreset-username": "کار زوروکی نام:",
        "passwordreset-domain": "دامین:",
-       "passwordreset-capture": "آسریگین ایمیل پیش دارگ بیت؟",
-       "passwordreset-capture-help": "اگان ائ گزینگ رء نشانیگ بهل ات، یک ایمیلء (گون موکتین پسوردء) شما رء پیش دارگ بیت ءُ هنچوش پر کاربرء راهیگ بیت انت.",
        "passwordreset-email": "ایمیل ادرس:",
        "passwordreset-emailtitle": "اکانتء جزئیات مان {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک شهسء (بلکین شما، گون آی‌پیء نشانیگ $1) شمئی پسوردء واترء {{SITENAME}} ($4) لوٹتگ انت. {{PLURAL:$3|اکانت|اکانتان}} گون ائ ایمیل ادرسء همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما پیکن انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان شمئی پگر انت که ادگر شهسء ائ لوٹء راهیگ کتگ یانکه وتی پیسریگین پسوردء هیال کت ات ءُ رندء نلوٹیت آئرا ٹگل دئیت، بیت که ائ پیگامء ناگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
        "saveprefs": "ذخیره",
        "restoreprefs": "پهکین پیش‌ پرزین تنظیمانء واتر بکن (مان پهکین بهران)",
        "prefs-editing": "اصلاح",
-       "rows": "ردیفآن«",
-       "columns": "ستون‌ان:",
        "searchresultshead": "گردگ",
        "stub-threshold": "سرحد په  <a href=\"#\" class=\"stub\">چنڈ لینک</a> فرمت (بایت):",
        "stub-threshold-disabled": "نافعال",
        "userrights-reason": "دلیل:",
        "userrights-no-interwiki": "شما را اجازت نیست دان حقوق کاربر ته دگ ویکی آن اصلاح کنیت.",
        "userrights-nodatabase": "دیتابیس $1  موجود نهنت یا محلی نهنت.",
-       "userrights-nologin": "شما باید [[Special:UserLogin|وارد بیت]]  گون حساب مدیریتی په مشخص کتن حقوق کاربر.",
-       "userrights-notallowed": "شما رء اجازت پر ادگر کاربرانی ایهتیاراتء هزپ یانکه ازاپ کتن نه انت.",
        "userrights-changeable-col": "گروهانی که شما تونیت عوض کنیت",
        "userrights-unchangeable-col": "گروهانی که شما نه نونیت عوض کنیت",
        "userrights-conflict": "تعارض مان کاربریگء دزرس! دزبندی انت بازگند ءُ رندء تغییراتء تایید بکن ات.",
-       "userrights-removed-self": "شما پر درستی وتی دزرسانء هزپ کت ات. پمیشکا شما رء انیگ پر ائ تاک دزرس نه انت.",
        "group": "گروه:",
        "group-user": "کابران",
        "group-autoconfirmed": "کابران تایید اتوماتیکی",
        "right-siteadmin": "کبل و پچ دیتابیس",
        "right-override-export-depth": "درگیزگ صفحات گون صفحاتی لینک بوتگین ته سطح ۵",
        "right-sendemail": "پر ادگران ایمیلء راهیگ بکن ات",
-       "right-passwordreset": "ایمیل پر پسوردء واترء بچار ات",
        "newuserlogpage": "ورود شرکتن کاربر",
        "newuserlogpagetext": ".شی یک ورودی چه شرکتن کاربر",
        "rightslog": "ورودان حقوق کاربر",
        "uploaddisabledtext": "آپلود فایل غیر فعال انت.",
        "php-uploaddisabledtext": "آپلود کتن فایل ته پی‌اچ‌پی فعال نهنت. تنظیم file_uploads کنترل کنیت.",
        "uploadscripted": "ای فایل شامل کد HTML یا اسکریپت انت که شاید گون وب بروزر اشتباهی وانگ بیت.",
-       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '<nowiki>$1</nowiki>' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "فایل یک ویروسی داریتن! جزییات: $1",
        "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
index f13bf53..a1cf8ed 100644 (file)
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
-       "changeemail-newemail-help": "Ð\9fоле Ñ\82Ñ\80Ñ\8dба Ð¿Ð°ÐºÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм, ÐºÐ°Ð»Ñ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
+       "changeemail-newemail-help": "Ð\9aалÑ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, Ð¿Ð°ÐºÑ\96нÑ\8cÑ\86е Ð³Ñ\8dÑ\82ае Ð¿Ð¾Ð»Ðµ Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
        "changeemail-submit": "Зьмяніць адрас электроннай пошты",
        "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
        "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
-       "summary-preview": "Папярэдні прагляд апісаньня:",
+       "summary-preview": "Папярэдні прагляд апісаньня зьменаў:",
        "subject-preview": "Папярэдні прагляд загалоўку:",
        "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.",
        "blockedtitle": "Удзельнік заблякаваны",
        "last": "папярэдняя",
        "page_first": "першая",
        "page_last": "апошняя",
-       "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце enter альбо кнопку ўнізе.<br />\nТлумачэньне: (цяп) = адрозьненьні ад цяперашняй вэрсіі, (папярэдняя) = адрозьненьні ад папярэдняй вэрсіі, д = дробная праўка.",
+       "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце «ўвод» альбо кнопку ўнізе.<br />\nТлумачэньне: <strong>({{int:cur}})</strong> = адрозьненьні ад цяперашняй вэрсіі, <strong>({{int:last}})</strong> = адрозьненьні ад папярэдняй вэрсіі, <strong>{{int:minoreditletter}}</strong> = дробная праўка.",
        "history-fieldset-title": "Пошук у гісторыі",
        "history-show-deleted": "Толькі выдаленыя",
        "histfirst": "найстарэйшыя",
-       "histlast": "найнавейшыя",
+       "histlast": "найноÑ\9eшыя",
        "historysize": "($1 {{PLURAL:$1|байт|байты|байтаў}})",
        "historyempty": "(пуста)",
        "history-feed-title": "Гісторыя зьменаў",
-       "history-feed-description": "Гісторыя зьменаў гэтай старонкі",
+       "history-feed-description": "Гісторыя зьменаў гэтай старонкі ў вікі",
        "history-feed-item-nocomment": "$1 у $2",
        "history-feed-empty": "Запатрабаванай старонкі не існуе.\nМагчыма, яна была выдаленая альбо яе перанесьлі.\nПаспрабуйце [[Special:Search|пашукаць]] падобныя старонкі.",
        "history-edit-tags": "Рэдагаваць меткі абраных вэрсіяў",
        "rev-deleted-user": "(імя ўдзельніка выдаленае)",
        "rev-deleted-event": "(падрабязнасьці выдаленыя з журнала падзеяў)",
        "rev-deleted-user-contribs": "[імя ўдзельніка альбо IP-адрас выдалены — рэдагаваньне схаванае з унёску]",
-       "rev-deleted-text-permission": "Гэтая вэрсія старонкі была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-deleted-text-permission": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\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-suppressed-text-unhide": "Гэтая вэрсія старонкі была '''схаваная'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
-       "rev-deleted-text-view": "Гэтая вэрсія старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
-       "rev-suppressed-text-view": "Гэтая вэрсія старонкі была '''схаваная'''.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
-       "rev-deleted-no-diff": "Вы ня можаце праглядаць гэтую розьніцу паміж вэрсіямі, таму што адна з вэрсіяў была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
-       "rev-suppressed-no-diff": "Вы ня можаце праглядзець гэтую розьніцу, таму што адна з вэрсіяў была '''выдаленая'''.",
-       "rev-deleted-unhide-diff": "Адна з вэрсіяў гэтай старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце праглядзець [$1 розьніцу паміж вэрсіямі], калі жадаеце.",
-       "rev-suppressed-unhide-diff": "Адна з вэрсіяў гэтага параўнаньня была '''схаваная'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 паглядзець гэту розьніцу], калі жадаеце.",
-       "rev-deleted-diff-view": "Адна з вэрсіяў гэтага параўнаньня была '''выдаленая'''.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі. Падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
-       "rev-suppressed-diff-view": "Адна з вэрсіяў гэтага параўнаньня была '''схаваная'''.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
+       "rev-deleted-text-unhide": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
+       "rev-suppressed-text-unhide": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
+       "rev-deleted-text-view": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nВы можаце праглядзець яе; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-suppressed-text-view": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
+       "rev-deleted-no-diff": "Вы ня можаце праглядаць гэтую розьніцу паміж вэрсіямі, таму што адна з вэрсіяў была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-suppressed-no-diff": "Вы ня можаце праглядзець гэтую розьніцу, таму што адна з вэрсіяў была <strong>выдаленая</strong>.",
+       "rev-deleted-unhide-diff": "Адна з вэрсіяў гэтай старонкі была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце праглядзець [$1 розьніцу паміж вэрсіямі], калі жадаеце.",
+       "rev-suppressed-unhide-diff": "Адна з вэрсіяў гэтага параўнаньня была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 паглядзець гэту розьніцу], калі жадаеце.",
+       "rev-deleted-diff-view": "Адна з вэрсіяў гэтага параўнаньня была <strong>выдаленая</strong>.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі. Падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+       "rev-suppressed-diff-view": "Адна з вэрсіяў гэтага параўнаньня была <strong>схаваная</strong>.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "rev-delundel": "паказаць/схаваць",
        "rev-showdeleted": "паказаць",
        "revisiondelete": "Выдаліць/аднавіць вэрсіі",
        "search-interwiki-caption": "Сумежныя праекты",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
+       "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Зьвязаны",
        "searchrelated": "зьвязаны",
        "searchall": "усе",
        "editusergroup": "Загрузіць групы ўдзельніка",
        "editinguser": "Зьмена правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Прагляд правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Рэдагаваць групы ўдзельнікаў і ўдзельніц",
-       "userrights-viewusergroup": "Прагляд групаў удзельніка",
+       "userrights-editusergroup": "Рэдагаваць групы {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
+       "userrights-viewusergroup": "Прагляд групаў {{GENDER:$1|удзельніка|удзельніцы}}",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}",
        "userrights-groupsmember": "Уваходзіць у:",
        "userrights-groupsmember-auto": "Няяўны чалец:",
-       "userrights-groups-help": "ТÑ\83Ñ\82 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b, Ð´Ð° Ñ\8fкÑ\96Ñ\85 Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\9eдзелÑ\8cнÑ\96к:\n* Ð\90дзнаÑ\87анае Ð¿Ð¾Ð»Ðµ Ð¿Ð¾Ð±Ð°Ñ\87 Ð· Ð½Ð°Ð·Ð²Ð°Ð¹ Ð³Ñ\80Ñ\83пÑ\8b Ð¿Ð°Ð·Ð½Ð°Ñ\87ае Ð¿Ñ\80Ñ\8bналежнаÑ\81Ñ\8cÑ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\9fÑ\83Ñ\81Ñ\82ое Ð¿Ð¾Ð»Ðµ Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ñ\9eдзелÑ\8cнÑ\96к Ð½Ðµ Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\97нак * Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ð\92Ñ\8b Ð½Ñ\8f Ð·Ð¼Ð¾Ð¶Ð°Ñ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð· Ð³Ñ\80Ñ\83пÑ\8b, ÐºÐ°Ð»Ñ\96 Ð´Ð°Ð´Ð°Ð´Ð·Ñ\96Ñ\86е Ñ\8fго Ð´Ð° Ñ\8fе, Ñ\96 Ð½Ð°Ð°Ð´Ð²Ð°Ñ\80оÑ\82.",
+       "userrights-groups-help": "ТÑ\83Ñ\82 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ñ\8cмÑ\8fнÑ\8fÑ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b, Ð´Ð° Ñ\8fкÑ\96Ñ\85 Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\9eдзелÑ\8cнÑ\96к:\n* Ð\90дзнаÑ\87анае Ð¿Ð¾Ð»Ðµ Ð¿Ð¾Ð±Ð°Ñ\87 Ð· Ð½Ð°Ð·Ð²Ð°Ð¹ Ð³Ñ\80Ñ\83пÑ\8b Ð¿Ð°Ð·Ð½Ð°Ñ\87ае Ð¿Ñ\80Ñ\8bналежнаÑ\81Ñ\8cÑ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\9fÑ\83Ñ\81Ñ\82ое Ð¿Ð¾Ð»Ðµ Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ñ\9eдзелÑ\8cнÑ\96к Ð½Ðµ Ð½Ð°Ð»ÐµÐ¶Ñ\8bÑ\86Ñ\8c Ð´Ð° Ð³Ñ\80Ñ\83пÑ\8b.\n* Ð\97нак * Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ð²Ñ\8b Ð½Ñ\8f Ð·Ð¼Ð¾Ð¶Ð°Ñ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96ка Ð· Ð³Ñ\80Ñ\83пÑ\8b, ÐºÐ°Ð»Ñ\96 Ð´Ð°Ð´Ð°Ð´Ð·Ñ\96Ñ\86е Ñ\8fго Ð´Ð° Ñ\8fе, Ñ\96 Ð½Ð°Ð°Ð´Ð²Ð°Ñ\80оÑ\82.\n* Ð\97нак # Ð°Ð·Ð½Ð°Ñ\87ае, Ñ\88Ñ\82о Ð²Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\82олÑ\8cкÑ\96 Ð·Ñ\8cменÑ\88Ñ\8bÑ\86Ñ\8c Ñ\87аÑ\81 Ñ\81канÑ\87Ñ\8dнÑ\8cнÑ\8f Ñ\82Ñ\8dÑ\80мÑ\96нÑ\83 Ð´Ð·ÐµÑ\8fнÑ\8cнÑ\8f Ð³Ñ\8dÑ\82ай Ð³Ñ\80Ñ\83пÑ\8b, Ð²Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿Ð°Ð²Ñ\8fлÑ\96Ñ\87Ñ\8bÑ\86Ñ\8c Ñ\8fго.",
        "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 дзень: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-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
+       "rcfilters-highlightbutton-title": "Вылучыць вынікі",
+       "rcfilters-highlightmenu-title": "Абярыце колер",
        "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
        "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
        "rcfilters-filter-registered-label": "Зарэгістраваныя",
        "rcfilters-filter-humans-label": "Чалавек (ня робат)",
        "rcfilters-filter-humans-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": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "uploaded-setting-handler-svg": "SVG, які выстаўляе атрыбут «handler» з дапамогай аддаленага адрасу/зьвестак/скрыпту, блякуецца. У загружаным SVG-файле знойдзена <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, які выстаўляе любы атрыбут з дапамогай аддаленага URL-адрасу, блякуецца. У загружаным SVG-файле знойдзена <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "У загружаным SVG-файле знойдзены фільтар выяваў з URL-адрасам: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»",
+       "uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «<nowiki>$1</nowiki>»",
        "uploadinvalidxml": "Не атрымалася прааналізаваць XML у загружаным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
        "uploadjava": "Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.\nЗагрузка Java-файлаў забароненая ў мэтах бясьпекі.",
        "statistics-users-active-desc": "Удзельнікі, якія выканалі нейкае дзеяньне цягам {{PLURAL:$1|апошняга $1 дня|апошніх $1 дзён|апошніх $1 дзён}}",
        "pageswithprop": "Старонкі з уласьцівасьцямі старонак",
        "pageswithprop-legend": "Старонкі з уласьцівасьцямі старонак",
-       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\8bÑ\8f Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\96 Ñ\81Ñ\82аÑ\80онак",
+       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\83Ñ\8e Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96.",
        "pageswithprop-prop": "Імя ўласьцівасьці:",
        "pageswithprop-submit": "Паказаць",
        "pageswithprop-prophidden-long": "доўгае тэкставае значэньне ўласьцівасьці схавана ($1)",
        "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 мс}}",
        "apisandbox-results-fixtoken": "Выпраўце токен і паўтарыце адпраўку",
        "apisandbox-results-fixtoken-fail": "Памылка пры атрыманьні токену «$1».",
        "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Калі ласка, націсьніце «назад» і перазагрузіце старонку, зь якой Вы прыйшлі, і паспрабуйце ізноў.",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|абнавіў|абнавіла}} цэтлікі на запісе журналу $5 старонкі $3 ({{PLURAL:$7|дададзена}} $6; {{PLURAL:$9|выдалена}} $8)",
        "rightsnone": "(няма)",
        "revdelete-summary": "кароткае апісаньне зьменаў",
+       "rightslogentry-temporary-group": "$1 (часова, да $2)",
        "feedback-adding": "Даданьне водгуку на старонку…",
        "feedback-back": "Назад",
        "feedback-bugcheck": "Выдатна! Толькі праверце, магчыма гэтыя памылкі ўжо [$1 вядомыя].",
        "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": "сэсіі на падставе файлаў-кукі",
        "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-realname-label": "Сапраўднае імя",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
index e9301d8..0f9d186 100644 (file)
        "jumpto": "Перайсці да:",
        "jumptonavigation": "рух",
        "jumptosearch": "знайсці",
-       "view-pool-error": "Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¼Ð¾Ð¼Ð°Ð½Ñ\82 Ñ\81еÑ\80веÑ\80Ñ\8b Ð¿ÐµÑ\80агÑ\80Ñ\83жанÑ\8b.\nÐ\97анадÑ\82а Ð¼Ð½Ð¾Ð³Ñ\96Ñ\8f Ñ\87Ñ\8bÑ\82аÑ\87Ñ\8b Ñ\81пÑ\80абÑ\83Ñ\8eÑ\86Ñ\8c адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
+       "view-pool-error": "Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¼Ð¾Ð¼Ð°Ð½Ñ\82 Ñ\81еÑ\80веÑ\80Ñ\8b Ð¿ÐµÑ\80агÑ\80Ñ\83жанÑ\8b.\nÐ\92елÑ\8cмÑ\96 Ñ\88маÑ\82 Ñ\87Ñ\8bÑ\82аÑ\87оÑ\9e Ñ\81пÑ\80абÑ\83е адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
        "generic-pool-error": "На жаль, у гэты момант серверы перагружаны.\nЗанадта многія карыстальнікі спрабуюць адкрыць гэты рэсурс.\nКалі ласка, трохі пачакайце, перш чым спрабаваць атрымаць доступ да гэтага рэсурсу ізноў.",
        "pool-timeout": "Выйшаў час чакання блакіроўкі",
        "pool-queuefull": "Чарга запытаў перапоўнена",
        "youremail": "Эл.пошта *",
        "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
        "prefs-memberingroups": "Уваходзіць у {{PLURAL:$1|групу|групы}}:",
+       "group-membership-link-with-expiry": "$1 (да $2)",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "yourlanguage": "Мова:",
        "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-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "action-reupload-shared": "запісваць паўзверх гэтага файла ў супольным сховішчы",
        "action-upload_by_url": "загрузіць гэты файл з адраса URL",
        "action-writeapi": "ужываць API запісвання",
-       "action-delete": "сціраць гэтую старонку",
+       "action-delete": "выдаліць гэтую старонку",
        "action-deleterevision": "сціраць версіі старонак",
        "action-deletelogentry": "выдаленне запісаў у журнале",
        "action-deletedhistory": "бачыць сцёртую гісторыю гэтай старонкі",
        "recentchanges-label-minor": "Дробная па значэнні праўка",
        "recentchanges-label-bot": "Праўка зроблена праграмай-робатам",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
-       "recentchanges-label-plusminus": "Ð\90б'Ñ\91м Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð¼Ñ\8fнÑ\96Ñ\9eÑ\81Ñ\8f Ð½Ð° Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ð»Ñ\96Ñ\87бÑ\83 байтаў",
+       "recentchanges-label-plusminus": "Ð\90б'Ñ\91м Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð¼Ñ\8fнÑ\96Ñ\9eÑ\81Ñ\8f Ð½Ð° Ð³Ñ\8dÑ\82Ñ\8b Ð»Ñ\96к байтаў",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
        "recentchanges-submit": "Паказаць",
        "rcfilters-filter-userExpLevel-learner-description": "Болей дзён актыўнасці і правак, чым у «навічкоў», але меней чым у «дасведчаных удзельнікаў».",
        "rcfilters-filter-userExpLevel-experienced-description": "Больш за 30 дзён актыўнасці і 500 правак.",
+       "rcfilters-filter-bots-label": "Бот",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "uploaded-setting-event-handler-svg": "Устаноўка атрыбутаў апрацоўкі падзей заблакавана, у ўкладзеным SVG-файле знойдзены код <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-href-svg": "Выкарыстанне тэга \"set\" для дадання атрыбута \"href\" у бацькоўскі элемент заблакавана.",
        "uploaded-wrong-setting-svg": "Ужыванне тэга \"set\" для задання ў якасці мэты аддаленага адраса/звестак/сцэнарыя для любога атрыбута заблакавана. У ўкладзеным SVG-файле знойдзены <code>&lt;set to=\"$1\"&gt;</code>.",
-       "uploadscriptednamespace": "Гэты файл SVG утрымлівае недапушчальную прастору імёнаў \"$1\".",
+       "uploadscriptednamespace": "Гэты файл SVG утрымлівае недапушчальную прастору імёнаў \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Немагчыма прааналізаваць XML ва ўкладзеным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасці: $1",
        "uploadjava": "Файл ўяўляе сабой ZIP-архіў, які змяшчае .class файл Java.",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дзеянне|дзеянні|дзеянняў}} за апошні{{PLURAL:$3| дзень|я $3 дні|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
-       "activeusers-groups": "Паказаць удзельнікаў, якія належаць да групаў:",
+       "activeusers-groups": "Паказаць удзельнікаў, якія належаць да груп:",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "cant-move-to-user-page": "Вам не дазволена пераносіць старонку ў старонку карыстальніка (не лічачы пад-старонак карыстальніка).",
        "cant-move-category-page": "Вам не дазволена пераносіць старонкі катэгорый.",
        "cant-move-to-category-page": "Вам не дазволена пераносіць старонку ў старонку катэгорыі.",
+       "cant-move-subpages": "Вам не дазволена пераносіць падстаронкі.",
+       "namespace-nosubpages": "Прастора назваў \"$1\" не дазваляе падстаронкі.",
        "newtitle": "Новая назва:",
        "move-watch": "Назіраць за старонкай",
        "movepagebtn": "Перанесці старонку",
        "movelogpagetext": "Ніжэй пададзены спіс пераносаў старонак.",
        "movesubpage": "{{PLURAL:$1|Пад-старонка|Пад-старонкі}}",
        "movesubpagetext": "Старонка мае $1 {{PLURAL:$1|пад-старонку, паказаную ніжэй|пад-старонкі, паказаныя ніжэй}}.",
+       "movesubpagetalktext": "Адпаведная старонка размоў мае $1 {{PLURAL:$1|падстаронку, паказаную|падстаронкі, паказаныя|падстаронак, паказаныя}} ніжэй.",
        "movenosubpage": "Старонка не мае пад-старонак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
-       "delete_and_move_text": "==Патрабуецца сціранне==\n\nУжо існуе артыкул з мэтавай назвай \"[[:$1]]\". Дык ці жадаеце сцерці яго, каб зрабіць месца для пераносу?",
+       "delete_and_move_text": "Ужо існуе артыкул з мэтавай назвай \"[[:$1]]\".\nХочаце сцерці яго, каб зрабіць месца для пераносу?",
        "delete_and_move_confirm": "Так, сцерці старонку",
        "delete_and_move_reason": "Сцёрта, каб зрабіць месца для пераносу \"[[$1]]\"",
        "selfmove": "Назвы вытока і мэты такія самыя; нельга пераносіць старонку саму на сябе.",
index 2ec3bc7..df6da1a 100644 (file)
        "qbpageoptions": "Тази страница",
        "qbmyoptions": "Моите страници",
        "faq": "ЧЗВ",
-       "faqpage": "Проект:ЧЗВ",
+       "faqpage": "Project:ЧЗВ",
        "actions": "Действия",
        "namespaces": "Именни пространства",
        "variants": "Варианти",
        "searcharticle": "Отваряне",
        "history": "История",
        "history_short": "История",
+       "history_small": "история",
        "updatedmarker": "има промяна (от последното ви влизане)",
        "printableversion": "Версия за печат",
        "permalink": "Постоянна препратка",
        "unprotectthispage": "Промяна на защитата на тази страница",
        "newpage": "Нова страница",
        "talkpage": "Дискусионна страница",
-       "talkpagelinktext": "Ð\91еседа",
+       "talkpagelinktext": "беседа",
        "specialpage": "Специална страница",
        "personaltools": "Лични инструменти",
        "articlepage": "Преглед на страница",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
        "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
-       "session_fail_preview_html": "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''\n\n''Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез Джаваскрипт.''\n\n'''Опитайте отново. Ако все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново.'''",
+       "session_fail_preview_html": "За съжаление редакцията ви не беше записана поради изтичането на сесията ви.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
        "token_suffix_mismatch": "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
        "edit_form_incomplete": "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
        "editing": "Редактиране на „$1“",
        "search-interwiki-caption": "Сродни проекти",
        "search-interwiki-default": "Резултати от $1:",
        "search-interwiki-more": "(още)",
+       "search-interwiki-more-results": "повече резултати",
        "search-relatedarticle": "Свързани",
        "searchrelated": "свързани",
        "searchall": "всички",
        "saveprefs": "Съхраняване",
        "restoreprefs": "Възстановяване на всички настройки по подразбиране (за всички раздели)",
        "prefs-editing": "Редактиране",
-       "rows": "Редове:",
-       "columns": "Колони:",
        "searchresultshead": "Търсене",
        "stub-threshold": "Праг за форматиране на препратки към мъничета ($1):",
        "stub-threshold-sample-link": "пример",
        "youremail": "Е-поща:",
        "username": "{{GENDER:$1|Потребителско име}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} на {{PLURAL:$1|група|групи}}:",
+       "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Регистрация:",
        "yourrealname": "Истинско име:",
        "yourlanguage": "Език:",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
        "userrights": "Управление на потребителските права",
-       "userrights-lookup-user": "УпÑ\80авлÑ\8fване Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е Ð³Ñ\80Ñ\83пи",
+       "userrights-lookup-user": "Ð\98збеÑ\80еÑ\82е Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ел",
        "userrights-user-editname": "Потребителско име:",
-       "editusergroup": "РедакÑ\82иÑ\80ане Ð½Ð° {{GENDER:$1|поÑ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е}} групи",
+       "editusergroup": "Ð\97аÑ\80еждане Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е групи",
        "editinguser": "Промяна на потребителските права на {{GENDER:$1|потребител }} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Редактиране на потребителските групи",
-       "saveusergroups": "Съхраняване на потребителските групи",
+       "userrights-editusergroup": "Редактиране на {{GENDER:$1|потребителските}} групи",
+       "userrights-viewusergroup": "Преглед на {{GENDER:$1|потребителските}} групи",
+       "saveusergroups": "Съхраняване на {{GENDER:$1|потребителските}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбиращ се член на:",
        "userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).",
        "userrights-nodatabase": "Базата данни $1 не съществува или не е на локалния сървър.",
        "userrights-changeable-col": "Групи, които можете да променяте",
        "userrights-unchangeable-col": "Групи, които не можете да променяте",
+       "userrights-expiry-current": "Изтича на $1",
+       "userrights-expiry": "Изтича на:",
+       "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": "Потребителска група:",
        "group-user": "Потребители",
        "group-autoconfirmed": "Автоматично одобрени потребители",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
        "grouppage-suppress": "{{ns:project}}:Ревизори",
        "right-read": "Четене на страници",
-       "right-edit": "редактиране на страници",
+       "right-edit": "Редактиране на страници",
        "right-createpage": "Създаване на страници (които не са беседи)",
        "right-createtalk": "Създаване на дискусионни страници",
        "right-createaccount": "Създаване на нови потребителски сметки",
        "right-reupload": "Презаписване на съществуващ файл",
        "right-reupload-own": "Презаписване на съществуващ файл, качен от същия потребител",
        "right-reupload-shared": "Предефиниране на едноименните файлове от общото мултимедийно хранилище с локални",
-       "right-upload_by_url": "качване на файл от URL адрес",
+       "right-upload_by_url": "Ð\9aачване на файл от URL адрес",
        "right-purge": "изчистване на складираното съдържание на страниците без показване на страница за потвърждение",
        "right-autoconfirmed": "Редактиране на полузащитени страници",
        "right-bot": "Третиране като автоматизиран процес",
        "right-suppressionlog": "Преглеждане на тайните дневници",
        "right-block": "спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
-       "right-hideuser": "блокиране и скриване на потребителско име",
-       "right-ipblock-exempt": "пренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
+       "right-hideuser": "Ð\91локиране и скриване на потребителско име",
+       "right-ipblock-exempt": "Ð\9fренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
        "right-unblockself": "Собствено отблокиране",
-       "right-protect": "пÑ\80оменÑ\8fне Ð½Ð° Ð½Ð¸Ð²Ð¾Ñ\82о Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° Ð·Ð°Ñ\89иÑ\82ени страници",
+       "right-protect": "Ð\9fÑ\80оменÑ\8fне Ð½Ð° Ð½Ð¸Ð²Ð¾Ñ\82о Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð¸ Ñ\80едакÑ\82иÑ\80ане Ð½Ð° ÐºÐ°Ñ\81кадно-заÑ\89иÑ\82ениÑ\82е страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
        "right-editinterface": "Редактиране на потребителския интерфейс",
        "right-editusercssjs": "редактиране на CSS и JS файловете на други потребители",
        "right-rollback": "Бърза отмяна на промените, направени от последния потребител, редактирал дадена страница",
        "right-markbotedits": "отбелязване на възвърнатите редакции като редакции на ботове",
        "right-noratelimit": "Пренебрегване на всякакви ограничения",
-       "right-import": "внасяне на страници от други уикита",
-       "right-importupload": "внасяне на страници от качен файл",
-       "right-patrol": "отбелязване на редакциите като проверени",
+       "right-import": "Ð\92насяне на страници от други уикита",
+       "right-importupload": "Ð\92насяне на страници от качен файл",
+       "right-patrol": "Ð\9eтбелязване на редакциите като проверени",
        "right-autopatrol": "Автоматично отбелязване на редакции като проверени",
        "right-patrolmarks": "Показване на отбелязаните като патрулирани последни промени",
        "right-unwatchedpages": "преглеждане на списъка с ненаблюдаваните страници",
        "right-mergehistory": "сливане на редакционни истории на страници",
-       "right-userrights": "редактиране на потребителските права",
+       "right-userrights": "Редактиране на потребителските права",
        "right-userrights-interwiki": "редактиране на потребителски права на потребители в други уикита",
        "right-siteadmin": "заключване и отключване на базата от данни",
        "right-override-export-depth": "Изнасяне на страници, включително свързаните с тях в дълбочина до пето ниво",
        "action-upload_by_url": "качване на този файл от URL адрес",
        "action-writeapi": "използване на API за писане",
        "action-delete": "изтриване на страницата",
-       "action-deleterevision": "изтриване на тази версия",
-       "action-deletedhistory": "преглеждане на изтритата история на тази страница",
+       "action-deleterevision": "изтриване на версии",
+       "action-deletelogentry": "изтриване на записи от дневника",
+       "action-deletedhistory": "преглед на изтритата история на тази страница",
        "action-browsearchive": "търсене на изтрити страници",
-       "action-undelete": "вÑ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а",
-       "action-suppressrevision": "пÑ\80еглеждане Ð¸ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\82ази Ñ\81кÑ\80иÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f",
+       "action-undelete": "вÑ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "action-suppressrevision": "пÑ\80еглеждане Ð¸ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ñ\81кÑ\80иÑ\82и Ð²ÐµÑ\80Ñ\81ии",
        "action-suppressionlog": "преглеждане на този поверителен дневник",
        "action-block": "блокиране на редакциите на този потребител",
        "action-protect": "променяне на нивото на защита на тази страница",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "recentchanges-submit": "Покажи",
+       "rcfilters-clear-all-filters": "Изчистване на всички филтри",
+       "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-noresults": "Не са намерени филтри",
+       "rcfilters-filtergroup-registration": "Регистрация на потребители",
+       "rcfilters-filter-unregistered-label": "Нерегистрирани",
+       "rcfilters-filter-editsbyself-label": "Ваши собствени редакции",
+       "rcfilters-filter-editsbyself-description": "Ваши редакции.",
+       "rcfilters-filter-editsbyother-label": "Чужди редакции",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Новодошли",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-humans-label": "Човек (не бот)",
+       "rcfilters-filter-minor-label": "Малки промени",
+       "rcfilters-filter-major-label": "Обикновени редакции",
+       "rcfilters-filtergroup-changetype": "Вид на промяната",
+       "rcfilters-filter-pageedits-label": "Редакции на страници",
+       "rcfilters-filter-newpages-label": "Създавания на страници",
+       "rcfilters-filter-categorization-label": "Промяна на категории",
        "rcnotefrom": "{{PLURAL:$5|Дадена е промяната|Дадени са промените}} от <strong>$3, $4</strong> (до <strong>$1</strong> показани).",
        "rclistfrom": "Показване на промени, като се започва от $3 $2",
        "rcshowhideminor": "$1 на малки промени",
        "uploaddisabledtext": "Качването на файлове е забранено.",
        "php-uploaddisabledtext": "Качванията на файлове са спрени през PHP. Проверете настройката file_uploads.",
        "uploadscripted": "Файлът съдържа HTML или скриптов код, който може да бъде погрешно  интерпретиран от браузъра.",
-       "uploadscriptednamespace": "Този SVG файл съдържа неправилно именно пространство „$1“",
+       "uploadscriptednamespace": "Този SVG файл съдържа неправилно именно пространство „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "XML-кода в качения файл не може да бъде анализиран.",
        "uploadvirus": "Файлът съдържа вирус! Подробности: $1",
        "uploadjava": "Файлът е ZIP файл, който съдържа Java .class файл.\nКачването на Java файлове не е позволено, тъй като могат да причинят заобикаляне на ограниченията за сигурност.",
        "uploadnewversion-linktext": "Качване на нова версия на файла",
        "shared-repo-from": "от $1",
        "shared-repo": "споделено хранилище",
+       "shared-repo-name-wikimediacommons": "Общомедия",
        "upload-disallowed-here": "Не можете да презапишете файла.",
        "filerevert": "Възвръщане на $1",
        "filerevert-legend": "Възвръщане на файла",
        "withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
        "withoutinterwiki-legend": "Представка",
        "withoutinterwiki-submit": "Показване",
-       "fewestrevisions": "Страници с най-малко версии",
+       "fewestrevisions": "Страници с най-малко редакции",
        "nbytes": "$1 {{PLURAL:$1|байт|байта}}",
        "ncategories": "$1 {{PLURAL:$1|категория|категории}}",
        "ninterwikis": "$1 {{PLURAL:$1|междууики|междууикита}}",
        "protectedpages-performer": "Защитаващ потребител",
        "protectedpages-params": "Параметри на защита",
        "protectedpages-reason": "Причина",
+       "protectedpages-submit": "Показване на страниците",
        "protectedpages-unknown-timestamp": "Неизвестни",
        "protectedpages-unknown-performer": "Неизвестен потребител",
        "protectedtitles": "Защитени заглавия",
        "protectedtitlesempty": "В момента няма заглавия, защитени с тези параметри.",
+       "protectedtitles-submit": "Показване на заглавията",
        "listusers": "Списък на потребителите",
        "listusers-editsonly": "Показване само на потребители с редакции",
        "listusers-creationsort": "Сортиране по дата на създаване",
        "nopagetext": "Посочената целева страница не съществува.",
        "pager-newer-n": "{{PLURAL:$1|по-нова 1|по-нови $1}}",
        "pager-older-n": "{{PLURAL:$1|по-стара 1|по-стари $1}}",
-       "suppress": "Премахване от публичния архив",
+       "suppress": "Подтискане",
        "querypage-disabled": "Тази специална страница е изключена, защото затруднява производителността на уикито.",
        "apihelp": "Помощ за API",
        "apihelp-no-such-module": "Модул \"$1\" не беше намерен.",
        "apisandbox-request-url-label": "URL-адрес на заявката:",
        "apisandbox-continue": "Продължаване",
        "apisandbox-continue-clear": "Изчистване",
+       "apisandbox-multivalue-all-namespaces": "$1 (Всички именни пространства)",
+       "apisandbox-multivalue-all-values": "$1 (Всички стойности)",
        "booksources": "Източници на книги",
        "booksources-search-legend": "Търсене на информация за книга",
        "booksources-search": "Търсене",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "activeusers-from": "Показване на потребителите, започвайки от:",
        "activeusers-noresult": "Няма намерени потребители.",
+       "activeusers-submit": "Показване на активните потребители",
        "listgrouprights": "Права по потребителски групи",
        "listgrouprights-summary": "По-долу на тази страница е показан списък на групите потребители в това уики и права им за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].",
-       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Ð\9fовеÑ\80ено право</span>\n* <span class=\"listgrouprights-revoked\">Отнето право</span>",
+       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Ð\94адено право</span>\n* <span class=\"listgrouprights-revoked\">Отнето право</span>",
        "listgrouprights-group": "Група",
        "listgrouprights-rights": "Права",
        "listgrouprights-helppage": "Help:Права на групите",
        "listgrouprights-removegroup-self-all": "Може да премахва всички групи от собствената сметка",
        "listgrouprights-namespaceprotection-header": "Ограничения на именните пространства",
        "listgrouprights-namespaceprotection-namespace": "Именно пространство",
+       "listgrants": "Разрешения",
+       "listgrants-grant": "Разрешение",
        "listgrants-rights": "Права",
        "trackingcategories": "Категории за проследяване",
        "trackingcategories-summary": "Тази страница съдържа списък на категории за проследяване, които се попълват автоматично от софтуера на МедияУики. Имената им могат да се променят чрез съответните системни съобщения в именното пространство {{ns:8}}.",
        "sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
        "changecontentmodel-title-label": "Заглавие на страницата",
        "changecontentmodel-reason-label": "Причина:",
+       "changecontentmodel-submit": "Променяне",
        "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
        "log-name-contentmodel": "Дневник на cъдържанието промяна модела",
        "log-description-contentmodel": "Събития, отнасящи се до модели на съдържанието на страницата",
        "undeletedrevisions": "{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}",
        "undeletedrevisions-files": "{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени",
        "undeletedfiles": "{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}",
-       "cannotundelete": "Ð\92Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð±ÐµÑ\88е Ð½ÐµÑ\83Ñ\81пеÑ\88но:\n$1",
+       "cannotundelete": "Ð\95дна Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ\87е Ð¾Ð¿ÐµÑ\80аÑ\86ии Ð¿Ð¾ Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ñ\81е Ð¿Ñ\80овалиÑ\85а:\n$1",
        "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
        "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
        "undelete-search-title": "Търсене на изтрити страници",
        "ipb-unblock": "Отблокиране на потребителско име IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
        "ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "{{PLURAL:$1|остава още $1|остават още $1}}",
        "unblockip": "Отблокиране на потребител",
        "unblockiptext": "Използвайте долния формуляр, за да възстановите правото на писане на по-рано блокиран IP-адрес или потребител.",
        "ipusubmit": "Сваляне на блокирането",
        "block-log-flags-hiddenname": "скрито потребителско име",
        "range_block_disabled": "Възможността на администраторите да задават интервали при IP-адресите е изключена.",
        "ipb_expiry_invalid": "Невалиден срок на изтичане.",
+       "ipb_expiry_old": "Срокът на изтичане е минал.",
        "ipb_expiry_temp": "Скритите потребителски имена трябва да се блокират безсрочно.",
        "ipb_hide_invalid": "Тази потребителска сметка не може да бъде прикрита; с нея са направени повече от {{PLURAL:$1|една редакция|$1 редакции}}.",
        "ipb_already_blocked": "„$1“ е вече блокиран",
        "lockdbsuccesstext": "Базата данни на {{SITENAME}} беше заключена.\n<br />Не забравяйте да я [[Special:UnlockDB|отключите]] когато привършите с работата по поддръжката.",
        "unlockdbsuccesstext": "Базата от данни на {{SITENAME}} беше отключена.",
        "lockfilenotwritable": "Няма права за писане върху файла за заключване на базата данни. За да заключи или отключи базата данни, уеб-сървърът трябва да има тези права.",
+       "databaselocked": "Базата от данни е вече заключена.",
        "databasenotlocked": "Базата от данни не е заключена.",
        "lockedbyandtime": "(от $1 на $2 в $3)",
        "move-page": "Преместване на $1",
        "pageinfo-category-pages": "Брой страници",
        "pageinfo-category-subcats": "Брой подкатегории",
        "pageinfo-category-files": "Брой файлове",
+       "pageinfo-user-id": "Потребителски номер",
        "markaspatrolleddiff": "Отбелязване като проверена редакция",
        "markaspatrolledtext": "Отбелязване на редакцията като проверена",
        "markaspatrolledtext-file": "Маркирай версията на файла като проверена",
        "exif-dc-rights": "Права",
        "exif-dc-source": "Източник медия",
        "exif-dc-type": "Вид медия",
+       "exif-rating-rejected": "Отхвърлен",
        "exif-isospeedratings-overflow": "По-голяма от 65535",
        "exif-iimcategory-ace": "Изкуствa, култура и забавление",
        "exif-iimcategory-clj": "Престъпност и право",
        "tags-edit-revision-selected": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
        "tags-edit-revision-legend": "Добавяне или премахване на етикети от {{PLURAL:$1|тази редакция|всичките $1 редакции}}",
        "tags-edit-existing-tags": "Съществуващи етикети:",
+       "tags-edit-existing-tags-none": "<em>Няма</em>",
        "tags-edit-new-tags": "Нови етикети:",
        "tags-edit-add": "Добавете тези етикети:",
        "tags-edit-remove": "Премахнете тези етикети:",
        "feedback-submit": "Изпращане",
        "feedback-thanks": "Благодарности! Вашата обратна информация е публикувана на страницата „[$2  $1]“.",
        "feedback-thanks-title": "Благодарим ви!",
+       "feedback-useragent": "Браузър:",
        "searchsuggest-search": "Търсене в {{SITENAME}}",
        "searchsuggest-containing": "съдържа...",
-       "api-error-autoblocked": "Вашият IP адрес е блокиран автоматично, тъй като е бил използван от блокиран потребител.",
-       "api-error-badaccess-groups": "Нямате необходимите права, за да качвате файлове в това уики.",
        "api-error-badtoken": "Вътрешна грешка: неправилен маркер.",
-       "api-error-blocked": "Блокирани сте да редактирате.",
-       "api-error-copyuploaddisabled": "Качването през URL е забранено на този сървър.",
-       "api-error-duplicate": "На сайта вече има {{PLURAL:$1|качен друг файл|качени други файлове}} с идентично съдържание.",
-       "api-error-duplicate-archive": "На сайта вече е имало {{PLURAL:$1|качен друг файл|качени други файла}} с идентично съдържание, {{PLURAL:$1|който е бил изтрит|които са били изтрити}}.",
-       "api-error-empty-file": "Заявеният за качване файл беше празен.",
        "api-error-emptypage": "Създаването на нови, празени страници, не е разрешено.",
-       "api-error-fetchfileerror": "Вътрешна грешка: Нещо се обърка при извличане на файла.",
-       "api-error-fileexists-forbidden": "Вече съществува файл с име „$1“ и той не може да бъде заменен.",
-       "api-error-fileexists-shared-forbidden": "В споделеното хранилище вече съществува файл с име „$1“ и той не може да бъде заменен.",
-       "api-error-file-too-large": "Заявеният за качване файл беше твърде голям.",
-       "api-error-filename-tooshort": "Името на файла е твърде кратко.",
-       "api-error-filetype-banned": "Този файлов тип не е позволен за качване.",
-       "api-error-filetype-banned-type": "$1 не {{PLURAL:$4|е позволен файлов формат|са позволени файлови формати}}. {{PLURAL:$3|Позволеният файлов формат е|Позволените файлови формати са}} $2.",
-       "api-error-filetype-missing": "Липсва разширение на файла.",
-       "api-error-hookaborted": "Промените, които опитахте да направите, бяха отменени от някое разширение.",
-       "api-error-http": "Вътрешна грешка: Грешка при свързането със сървъра.",
-       "api-error-illegal-filename": "Непозволено име на файл.",
-       "api-error-internal-error": "Вътрешна грешка: Нещо се обърка при обработката на качването в уикито.",
-       "api-error-invalid-file-key": "Вътрешна грешка: Файлът не беше открит във временното хранилище.",
-       "api-error-missingparam": "Вътрешна грешка: Липсващи параметри на заявката.",
-       "api-error-missingresult": "Вътрешна грешка: Не може да се определи дали копирането е успешно.",
-       "api-error-mustbeloggedin": "Трябва да сте влезли в системата, за да можете да качвате файлове.",
-       "api-error-mustbeposted": "Вътрешна грешка: Заявката изисква HTTP POST.",
-       "api-error-noimageinfo": "Качването беше успешно, но сървърът не подаде никаква информация за файла.",
-       "api-error-nomodule": "Вътрешна грешка: Липсва настроен модул за качвания.",
-       "api-error-ok-but-empty": "Вътрешна грешка: Няма отговор от сървъра.",
-       "api-error-overwrite": "Не е позволено презаписването върху съществуващ файл.",
-       "api-error-stashfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
        "api-error-publishfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
-       "api-error-stasherror": "Имаше грешка при качване на файла в хранилището.",
-       "api-error-stashedfilenotfound": "Скритият файл не беше открит при опита за качването му от временното хранилище.",
-       "api-error-stashfilestorage": "Имаше грешка при съхраняването на файла в хранилището.",
-       "api-error-stashnotloggedin": "Трябва да сте влезли в системата за да съхранявате файлове във временното хранилище.",
-       "api-error-timeout": "Сървърът не отговори в рамките на предвиденото време.",
-       "api-error-unclassified": "Възникна непозната грешка.",
-       "api-error-unknown-code": "Непозната грешка: „$1“",
-       "api-error-unknown-error": "Вътрешна грешка: Нещо се обърка по време на качването на файла ви.",
+       "api-error-stashfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
        "api-error-unknown-warning": "Непознато предупреждение: „$1“",
        "api-error-unknownerror": "Неизвестна грешка: „$1“.",
-       "api-error-uploaddisabled": "Достъпът за качване на файлове в това уики е прекратен.",
-       "api-error-verification-error": "Файлът може би е повреден или има грешно разширение.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунди}}",
        "duration-minutes": "$1 {{PLURAL:$1|минута|минути}}",
        "duration-hours": "$1 {{PLURAL:$1|час|часа}}",
        "pagelang-language": "Език",
        "pagelang-use-default": "Използване на езика по подразбиране",
        "pagelang-select-lang": "Избиране на език",
+       "pagelang-reason": "Причина",
        "pagelang-submit": "Изпращане",
        "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": "Ð\9cедиÑ\8f Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ики",
+       "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика Ð·Ð° Ñ\84айлове",
        "mediastatistics-table-mimetype": "MIME тип",
        "mediastatistics-table-extensions": "Възможни разширения",
        "mediastatistics-table-count": "Брой файлове",
index b288535..af8c1e1 100644 (file)
        "uploaddisabled": "بُرز کورتین غیر پئال اینت.",
        "copyuploaddisabled": "بُرز کورتین شه اینترنیتی ادرسا غیرفعال اینت.",
        "uploaddisabledtext": "فایل ئی بُرز کورتین غیر فعال اینت.",
-       "uploadscriptednamespace": "این اس‌وی‌جی ئی پوشه شامل غیرقانونی ئین  '$1' ئی پزای نام ئا اینت",
+       "uploadscriptednamespace": "این اس‌وی‌جی ئی پوشه شامل غیرقانونی ئین  '<nowiki>$1</nowiki>' ئی پزای نام ئا اینت",
        "uploadinvalidxml": "XML بئ بُرز بوته ئین پایل تا نتوانت تجزیه بیئت.",
        "uploadvirus": "ای پایل ویروس داریت!\nگیشتیرین مه لومات : $1",
        "upload-source": "فایلی منشا",
        "feedback-useragent": "کارزوروکی آگینت:",
        "searchsuggest-search": "گشتین",
        "searchsuggest-containing": "شامیلین دیمان...",
-       "api-error-badaccess-groups": "شما اجازه په پایلی ئی بُرز کورتین ئا بئ ای ویکی ای تا نداریت.",
        "api-error-badtoken": "داخیلی ئین خه تا: امنیتی ئین کوڈ سه ئی نه اینت (Bad token).",
-       "api-error-empty-file": "فایلی که دیم داته بوت خالی ات.",
        "api-error-emptypage": "خالی ئین دیمانی جۆڑ کورتین جایز نه اینت.",
-       "api-error-file-too-large": "فایلی که دیم داتیت بئ حد ٹوو ات.",
-       "api-error-filename-tooshort": "فایلی نام بئ شه اندازگ ئا گۆنڈ ات.",
-       "api-error-filetype-banned": "ایرنگین فایل ئی اجازه نه اینت.",
-       "api-error-filetype-missing": "فایل ئی نام فرمت نه داریت.",
-       "api-error-hookaborted": "تغیر که شما لۆٹیت جۆڑ کنیت شه یک جنگک یی نیمگا بند بوت.",
-       "api-error-http": "داخلین خطا:وصل بوتین بئ سرویس ئا ممکن نه اینت.",
-       "api-error-illegal-filename": "فایل ئی نام غیرمجاز اینت.",
-       "api-error-invalid-file-key": "داخلین خطا: فایل نام بئ موقت ئین حافظه ئی تا موجود نه اینت.",
-       "api-error-missingparam": "داخلین خطا: ناموجودین پارامیترئان بئ ریکویست ئی تا.",
-       "api-error-mustbeloggedin": "په فایلی بُرز کورتینا، شما باید بئ سایٹ ئی تا داخل بئیت.",
-       "api-error-mustbeposted": "داخلین خطا: ریکویست باید شه POST HTTP ئی روش ئا دیم داته بیئت.",
-       "api-error-unclassified": "یک نا زانتین خطائی رخ دات.",
-       "api-error-unknown-code": "نازانتین خطای: \" $1 \"",
        "api-error-unknown-warning": "نادروستئ ئین ایختار: $1",
        "api-error-unknownerror": "نادروستئ ئین خه تا: «$1».",
-       "api-error-uploaddisabled": "پایلانی بُرز کورتین بئ ای ویکی تا غیر په هال اینت.",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "duration-hours": "$1 سائت",
index d55a523..4e4401e 100644 (file)
        "create-local": "लोकल विवरण जोड़ीं",
        "editthispage": "ए पन्ना के संपादन करीं",
        "create-this-page": "ई पन्ना बनाईं",
-       "delete": "मिटाईं",
-       "deletethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤®à¤¿टाईं",
-       "undeletethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤«à¤¿à¤° à¤¸à¥\87 à¤¸à¥\8dथापित à¤\95रà¥\80ं",
-       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन|$1 à¤ à¥\87 à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\81ल}} à¤¬à¤¿à¤¨à¤¾à¤®à¥\87à¤\9fावल à¤\95रà¥\80ं",
-       "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन कुल}} देखीं",
+       "delete": "हटाईं",
+       "deletethispage": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¹टाईं",
+       "undeletethispage": "हà¤\9fावल à¤ªà¤¨à¥\8dना à¤µà¤¾à¤ªà¤¸ à¤²à¥\87 à¤\86à¤\88ं",
+       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤ à¥\8b à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन|$1 à¤ à¥\87 à¤¹à¤\9fावल à¤\97à¤\87ल à¤¸à¤\82पादन à¤\95à¥\81ल}} à¤µà¤¾à¤ªà¤¸ à¤²à¥\87 à¤\86à¤\88ं",
+       "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन}} देखीं",
        "protect": "सुरक्षित करीं",
        "protect_change": "बदलीं",
        "protectthispage": "ए पन्ना के सुरक्षित करीं।",
        "personaltools": "निजी औजार",
        "articlepage": "सामग्री पन्ना देखीं",
        "talk": "बातचीत",
-       "views": "वà¥\8dयà¥\82",
+       "views": "बिबिध à¤°à¥\82प",
        "toolbox": "औजार",
        "tool-link-userrights": "{{GENDER:$1|प्रयोगकर्ता}} के मंडली बदलीं",
        "tool-link-userrights-readonly": "{{GENDER:$1|प्रयोगकर्ता}} मंडली देखीं",
        "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}} के ईमेल करीं",
        "userpage": "प्रयोगकर्ता पन्ना देखीं",
-       "projectpage": "परियà¥\8bà¤\9cना पन्ना देखीं",
+       "projectpage": "पà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f पन्ना देखीं",
        "imagepage": "फाइल पन्ना देखीं",
        "mediawikipage": "सनेसा पन्ना देखीं",
        "templatepage": "टेम्पलेट पन्ना देखीं",
        "jumptosearch": "खोजीं",
        "view-pool-error": "माफ करीं, ए समय सर्वर पर बहुत ज्यादा लोड बढ़ गइल बा।\nए पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बा।\nए पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इंतजार करीं।\n\n$1",
        "generic-pool-error": "माफ करीं, ए समय सर्वर पर बहुत ज्यादा लोड बढ़ गइल बा।\nए संसाधन के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बा।\nए संसाधन तक पहुँच बनावे के कोशिश से पहिले कृपया कुछ देर तक इंतजार करीं।",
-       "pool-timeout": "तालाबनà¥\8dदà¥\80 à¤\96ातिर इंतजार समय समाप्त",
-       "pool-queuefull": "पà¥\82ल à¤ªà¤\82à¤\95à¥\8dति à¤­à¤° à¤\97à¤\87ल",
+       "pool-timeout": "तालाबà¤\82दà¥\80 à¤\96à¥\81लà¥\87 à¤\95à¥\87 इंतजार समय समाप्त",
+       "pool-queuefull": "पà¥\82ल à¤\95तार à¤­à¤°à¤² à¤¬à¤¾",
        "pool-errorunknown": "नामालूम खराबी",
        "pool-servererror": "पूल काउंटर सर्विस उपलब्ध नइखे ($1)।",
        "poolcounter-usage-error": "इस्तमाल खराबी: $1",
        "badaccess": "परमीशन खराबी",
        "badaccess-group0": "जवन कार्रवाई के माँग कइले बानी, ओकरा लागू करे के इजाजत रउआँ के नइखे।",
        "badaccess-groups": "रउआ जौन कारवाई के माँग कइले बानी ऊ {{PLURAL:$2|$1 मंडली|$1 मंडली सभ}} के सदस्य लोग भर कर सकत बा।",
-       "versionrequired": "मिडà¥\80याविà¤\95à¥\80 à¤\95à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण $1 के होखल जरुरी बा",
+       "versionrequired": "मिडà¥\80याविà¤\95à¥\80 à¤\95à¥\87 à¤µà¤°à¥\8dशन $1 के होखल जरुरी बा",
        "versionrequiredtext": "ए पन्ना के प्रयोग करे खातिर मीडियाविकी के वर्शन $1 जरूरी बा।\n[[Special:Version|वर्शन पन्ना]] देखीं।",
        "ok": "ठीक",
        "retrievedfrom": "\"$1\" से लिहल गइल",
-       "youhavenewmessages": "रउआ लगे बा $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|रà¤\89वाà¤\81 à¤\96ातिर}}{{PLURAL:$3|à¤\85à¤\89रà¥\80 प्रयोगकर्ता के|$3 प्रयोगकर्ता लोग}} के $1 बा ($2)।",
+       "youhavenewmessages": "{{PLURAL:$3|रउआँ खातिर}} $1 ($2) बा।",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|रà¤\89वाà¤\81 à¤\96ातिर}}{{PLURAL:$3|à¤\95à¥\87हà¥\82 प्रयोगकर्ता के|$3 प्रयोगकर्ता लोग}} के $1 बा ($2)।",
        "youhavenewmessagesmanyusers": "रउवाँ खातिर कई प्रयोगकर्ता लोग के भेजल $1 बा ($2)।",
        "newmessageslinkplural": "{{PLURAL:$1|नया सनेसा|999=नया सनेसा सभ}}",
        "newmessagesdifflinkplural": "पिछला {{PLURAL:$1|बदलाव|999=बदलाव}}",
        "viewdeleted": "$1 देखावल जाय?",
        "restorelink": "{{PLURAL:$1|एक ठो हटावल संपादन|$1 ठे हटावल संपादन}}",
        "feedlinks": "फीड:",
-       "feed-invalid": "अवैध सबस्क्रिप्शन फीड प्रकार",
+       "feed-invalid": "अवैध सबस्क्रिप्शन फीड प्रकार",
        "feed-unavailable": "सिंडिकेशन फीड उपलब्ध नइखें",
        "site-rss-feed": "$1 आरएसएस फीड",
        "site-atom-feed": "$1 एटम फीड",
-       "page-rss-feed": "\"$1\" à¤\86रà¤\8fसà¤\8fस à¤«à¤¿ड",
+       "page-rss-feed": "\"$1\" à¤\86रà¤\8fसà¤\8fस à¤«à¥\80ड",
        "page-atom-feed": "\"$1\" एटम फीड",
-       "red-link-title": "$1 (पन्ना मौजूद नइखे)",
+       "red-link-title": "$1 (पन्ना मौजूद नइखे)",
        "sort-descending": "उतरत क्रम में",
        "sort-ascending": "चढ़त क्रम में",
        "nstab-main": "पन्ना",
        "nstab-category": "श्रेणी",
        "mainpage-nstab": "मुख्य पन्ना",
        "nosuchaction": "अइसन कौनो कार्रवाई नइखे",
-       "nosuchactiontext": "à¤\8f à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारà¥\8dरवाà¤\88 à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89वाà¤\81 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95वà¥\8dनà¥\8b गलत कड़ी के इस्तेमाल कइले होखब।\n{{SITENAME}} में इस्तमाल हो रहल सॉफ्टवेयर में खराबी के लच्छन भी हो सकत बा।",
+       "nosuchactiontext": "à¤\8f à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤¦à¥\8dवारा à¤¬à¤¤à¤¾à¤µà¤² à¤\95ारà¥\8dरवाà¤\88 à¤\85वà¥\88ध à¤¬à¤¾à¥¤\nरà¤\89वाà¤\81 à¤¯à¥\82॰à¤\86र॰à¤\8fल à¤\97लत à¤²à¤¿à¤\96लà¥\87 à¤¹à¥\8bà¤\96ब, à¤¯à¤¾ à¤\95à¥\8cनà¥\8bà¤\82 गलत कड़ी के इस्तेमाल कइले होखब।\n{{SITENAME}} में इस्तमाल हो रहल सॉफ्टवेयर में खराबी के लच्छन भी हो सकत बा।",
        "nosuchspecialpage": "अइसन कौनो खास पन्ना नइखे",
        "nospecialpagetext": "<strong>रउआँ एगो अवैध खास पन्ना के अनुरोध कइले बानी।</strong>\n\nबैध खास पन्नासभ के लिस्ट [[Special:SpecialPages|{{int:specialpages}}]] पर देखल जा सकत बा।",
        "error": "खराबी",
        "databaseerror-error": "खराबी: $1",
        "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल ह।\nअगर आप कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
        "laggedslavemode": "<strong>चेतावनी:</strong> अइसन भी हो सकेला कि पन्ना पर हाल के अपडेट न होखे।",
-       "readonly": "डेटाबेस तालाबंद बा",
+       "readonly": "डेटाबेस तालाबंद बा",
        "enterlockreason": "तालाबंदी के कारण दीं, आ अनुमान बताईं कि कब तालाबंदी हटी",
        "readonlytext": "नया संपादन आ अन्य बदलाव खातिर डाटाबेस पर तालाबंदी बा, शायद रुटीन मेंटेनन्स के चलते, जेकरा बाद ए के सामान्य स्थिती में आ जाये के चाहीं।\n\nतालाबंदी करे वाला सिस्टम प्रबंधक के बतावल कारण: $1",
        "missing-article": "डेटाबास के ओ पन्ना के पाठ ना मिलल जवन मिले के चाहत रहल, एकर नाँव रहल \"$1\" $2।\nआमतौर पर अइसन तब होला पुरान हो चुकल अंतर या हटावल पन्ना के इतिहास के कड़ी के पीछा कइल जा रहल होखे।\n\nयदि ई बात नइखे, तब हो सकेला आपके कौनों सॉफ्टवेयर बग मिल गइल होखे।\n[[Special:ListUsers/sysop|प्रबंधक]] के ई यूआरएल दे के खबर करीं।",
        "cannotlogoutnow-text": "$1 के इस्तेमाल करत समय लॉगआउट नइखे संभव।",
        "welcomeuser": "राउर स्वागत बा, $1!",
        "welcomecreation-msg": "राउर खाता बना दिहल गईल बा।\nआपन [[Special:Preferences|{{SITENAME}} वरीयतां]] के बदले के ना भूलब।",
-       "yourname": "सदसà¥\8dयनाम:",
-       "userlogin-yourname": "सदसà¥\8dयनाँव",
-       "userlogin-yourname-ph": "à¤\86पन à¤¸à¤¦à¤¸à¥\8dयनाँव लिखीं",
-       "createacct-another-username-ph": "सदसà¥\8dयनाम लिखीं",
-       "yourpassword": "गुप्त शब्द",
+       "yourname": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व:",
+       "userlogin-yourname": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव",
+       "userlogin-yourname-ph": "à¤\86पन à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव लिखीं",
+       "createacct-another-username-ph": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व लिखीं",
+       "yourpassword": "गुप्तशब्द:",
        "userlogin-yourpassword": "गुप्तशब्द (पासवर्ड)",
        "userlogin-yourpassword-ph": "आपन गुप्तशब्द लिखीं",
        "createacct-yourpassword-ph": "एगो गुप्तशब्द (पासवर्ड) प्रवेश करीं",
-       "yourpasswordagain": "गुप्त-शब्द पुन:डालीं:",
+       "yourpasswordagain": "गुप्तशब्द दोबारा डालीं:",
        "createacct-yourpasswordagain": "गुप्तशब्द (पासवर्ड) के पुष्टि करीं",
        "createacct-yourpasswordagain-ph": "गुप्तशब्द (पासवर्ड) फेर से प्रवेश करीं",
        "userlogin-remembermypassword": "हमके लॉग इन रहे दीं",
        "userloginnocreate": "खाता में प्रवेश",
        "logout": "खाता से बाहर",
        "userlogout": "खाता से बाहर",
-       "notloggedin": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¨à¤\88à¤\96à¥\80à¤\82 à¤­à¤\88ल",
+       "notloggedin": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¨à¤\87à¤\96à¥\80à¤\82 à¤­à¤\87ल",
        "userlogin-noaccount": "का एगो खाता नइखे?",
        "userlogin-joinproject": "{{SITENAME}} से जुड़ीं",
        "nologin": "का एगो खाता नईखे? $1.",
        "createaccount": "खाता बनाईं",
        "gotaccount": "का पहिले से एगो खाता बा? $1.",
        "gotaccountlink": "खाता में प्रवेश",
-       "userlogin-resetlink": "à¤\95ा à¤°à¤\89à¤\86 à¤\86पन à¤ªà¥\8dरवà¥\87श à¤\9cानà¤\95ारà¥\80 à¤­à¥\82ला गइल बानी?",
-       "userlogin-resetpassword-link": "à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤­à¥\82ला à¤\97à¤\88नी का?",
-       "userlogin-helplink2": "लà¥\89à¤\97 à¤\87न में मदद",
-       "userlogin-loggedin": "रà¤\89à¤\86 {{GENDER:$1|$1}} à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤²à¥\89à¤\97à¥\8dड à¤\87न à¤¬à¤¾à¤¨à¥\80à¤\82।\nà¤\95à¥\8cनà¥\8b à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤²à¥\89à¤\97 à¤\87न à¤\95रà¥\87 à¤\96ातिर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤«à¤¼à¥\89रà¥\8dम के प्रयोग करीं।",
-       "userlogin-reauth": "à¤\86प à¤\95à¥\87 à¤\88 à¤¸à¤¾à¤¬à¤¿à¤¤ à¤\95रà¥\87 à¤\96ातिर à¤\95à¥\80 à¤\86पà¥\87 {{GENDER:$1|$1}} à¤¬à¤¾à¤¨à¥\80, à¤¦à¥\81बारा à¤²à¥\89à¤\97िन करे के पड़ी।",
+       "userlogin-resetlink": "à¤\95ा à¤°à¤\89à¤\86 à¤\86पन à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤µà¤¾à¤²à¥\80 à¤\9cानà¤\95ारà¥\80 à¤­à¥\81ला गइल बानी?",
+       "userlogin-resetpassword-link": "à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤­à¥\81ला à¤\97à¤\87नी का?",
+       "userlogin-helplink2": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श में मदद",
+       "userlogin-loggedin": "रà¤\89à¤\86 {{GENDER:$1|$1}} à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95 à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80à¤\82।\nà¤\95à¥\8cनà¥\8b à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\96ातिर à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤«à¤¾à¤°म के प्रयोग करीं।",
+       "userlogin-reauth": "à¤\86प à¤\95à¥\87 à¤\88 à¤¸à¤¾à¤¬à¤¿à¤¤ à¤\95रà¥\87 à¤\96ातिर à¤\95à¥\80 à¤\86पà¥\87 {{GENDER:$1|$1}} à¤¬à¤¾à¤¨à¥\80, à¤¦à¥\81बारा à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श करे के पड़ी।",
        "userlogin-createanother": "एगो दूसर खाता बनाईं",
-       "createacct-emailrequired": "ई-मेल पता",
-       "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
-       "createacct-email-ph": "आपन ई-मेल पता लिखीं",
-       "createacct-another-email-ph": "ई-मेल पता लिखीं",
-       "createaccountmail": "à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 (रà¥\88नà¥\8dडम) à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 à¤\86 à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\88-मेल पता पर भेजीं",
+       "createacct-emailrequired": "ईमेल पता",
+       "createacct-emailoptional": "ईमेल पता (वैकल्पिक)",
+       "createacct-email-ph": "आपन ईमेल पता लिखीं",
+       "createacct-another-email-ph": "ईमेल पता लिखीं",
+       "createaccountmail": "à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 (रà¥\88नà¥\8dडम) à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 à¤\86 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\88मेल पता पर भेजीं",
        "createaccountmail-help": "एकर इस्तेमाल केहू दुसरा खातिर खाता बनावे में कइल जा सके ला, बिना पासवर्ड जनले।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
-       "createacct-reason-ph": "रउआ एगो अन्य खाता काहे बना रहल बानी",
-       "createacct-reason-help": "à¤\96ाता à¤¬à¤¨à¤µà¤²à¥\87 à¤\95à¥\87 à¤²à¥\89à¤\97 à¤®à¥\87à¤\82 à¤¦à¥\87à¤\96ाà¤\88 à¤ªà¤¡à¤¼à¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤\82दà¥\87स",
+       "createacct-reason-ph": "रउआ एगो अन्य खाता काहे बना रहल बानी",
+       "createacct-reason-help": "à¤\96ाता à¤¬à¤¨à¤µà¤²à¥\87 à¤\95à¥\87 à¤²à¥\89à¤\97 à¤®à¥\87à¤\82 à¤¦à¥\87à¤\96ाà¤\88 à¤ªà¤¡à¤¼à¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤¨à¥\87सा",
        "createacct-submit": "आपन खाता बनाईं",
        "createacct-another-submit": "खाता बनाईं",
        "createacct-continue-submit": "खाता बनावल जारी राखीं",
        "createacct-another-continue-submit": "खाता बनावल जारी राखीं",
-       "createacct-benefit-heading": "{{SITENAME}} à¤°à¤\89à¤\86 à¤\9cà¤\87सन à¤²à¥\8bà¤\97न à¤¦à¥\8dवारा à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\88ल बा।",
+       "createacct-benefit-heading": "{{SITENAME}} à¤°à¤\89à¤\86 à¤\9cà¤\87सन à¤²à¥\8bà¤\97न à¤¦à¥\8dवारा à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\87ल बा।",
        "createacct-benefit-body1": "{{PLURAL:$1|संपादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
        "createacct-benefit-body3": "हाल के {{PLURAL:$1|योगदानकर्ता}}",
-       "badretype": "रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।",
-       "usernameinprogress": "à¤\8fहà¥\80 à¤¸à¤¦à¤¸à¥\8dयनाँव खातिर खाता खोले के काम पहिलहीं चालू बा।\nइंतजार करीं।",
-       "userexists": "लिà¤\96ल à¤\97à¤\88ल à¤¸à¤¦à¤¸à¥\8dय à¤¨à¤¾à¤® à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤®à¥\87à¤\82 à¤¬à¤¾à¥¤ à¤\95à¥\83पया à¤\95à¥\8cनà¥\8b à¤¦à¥\8bसर à¤¨à¤¾à¤® à¤\9aà¥\81नीं।",
-       "loginerror": "à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤®à¥\87à¤\82 à¤¤à¥\8dरà¥\81à¤\9fि",
-       "createacct-error": "à¤\96ाता à¤¨à¤¿à¤°à¥\8dमाण à¤¤à¥\8dरà¥\81à¤\9fि",
-       "createaccounterror": "à¤\88 à¤\96ाता à¤¨à¤¾ à¤¬à¤¨ à¤ªà¤¾à¤\88ल: $1",
-       "nocookiesnew": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\96ाता à¤¤ à¤¬à¤¨ à¤\97à¤\88ल, à¤¬à¤¾à¤\81à¤\95à¥\80 à¤°à¤\89à¤\86 à¤ªà¥\8dरवà¥\87श à¤¨à¤\88à¤\96à¥\80à¤\82 à¤­à¤\88ल।\n{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95िà¤\9c à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87ला।\nराà¤\89र à¤\95à¥\81à¤\95िà¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\83पया à¤\89 à¤\95à¥\87 à¤¸à¤\95à¥\8dषम à¤\95रà¥\80à¤\82, à¤\89 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤°à¤¾à¤\89र à¤¨à¤¯à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤\86 à¤\97à¥\81पà¥\8dत शब्द के साथ प्रवेश करीं।",
-       "nocookieslogin": "{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95िà¤\9c à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87ला।\nराà¤\89र à¤\95à¥\81à¤\95िà¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\83पया à¤\89 के सक्षम करीं आ फिर से कोशिश करीं",
-       "nocookiesfornew": "सà¥\8dरà¥\8bत à¤\95à¥\87 à¤ªà¥\81षà¥\8dà¤\9fि à¤¨à¤¾ à¤¹à¥\8b à¤ªà¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95ारण à¤\87 à¤\96ाता à¤¨à¤¿à¤°à¥\8dमित à¤¨à¤¾ à¤\95रल à¤\97à¤\87ल। \nसà¥\81निशà¥\8dà¤\9aित à¤\95रà¥\80à¤\82 à¤\95ि à¤°à¤\89à¤\86 à¤\95à¥\81à¤\95à¥\80à¤\9c़ à¤¸à¤\95à¥\8dषम à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80, à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤ªà¥\81नà¤\83 à¤²à¥\8bड à¤\95रà¥\80à¤\82 à¤\86 à¤ªà¥\81नà¤\83 à¤ªà¥\8dरयास करीं।",
+       "badretype": "रउआँ जौन गुप्तशब्द डालत बानी उ मेल नइखे खात।",
+       "usernameinprogress": "à¤\8fहà¥\80 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव खातिर खाता खोले के काम पहिलहीं चालू बा।\nइंतजार करीं।",
+       "userexists": "लिà¤\96ल à¤\97à¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤ªà¤¹à¤¿à¤²à¥\87 à¤¸à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤®à¥\87à¤\82 à¤¬à¤¾à¥¤ à¤\95à¥\8cनà¥\8bà¤\82 à¤¦à¥\82सर à¤¨à¤¾à¤® à¤¬à¥\80à¤\9bीं।",
+       "loginerror": "à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤®à¥\87à¤\82 à¤\96राबà¥\80",
+       "createacct-error": "à¤\96ाता à¤¬à¤¨à¤¾à¤µà¥\87 à¤®à¥\87à¤\82 à¤\96राबà¥\80",
+       "createaccounterror": "à¤\88 à¤\96ाता à¤¨à¤¾ à¤¬à¤¨ à¤ªà¤¾à¤µल: $1",
+       "nocookiesnew": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\96ाता à¤¤ à¤¬à¤¨ à¤\97à¤\87ल, à¤¬à¤¾à¤\95à¥\80 à¤°à¤\89à¤\86 à¤ªà¥\8dरवà¥\87श à¤¨à¤\87à¤\96à¥\80à¤\82 à¤­à¤\88ल।\n{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95à¥\80 à¤¸à¤¬ à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤²à¤¾à¥¤\nराà¤\89र à¤\95à¥\81à¤\95à¥\80à¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\81à¤\95à¥\80à¤\9c à¤¸à¤\95à¥\8dषम à¤\95रà¥\80à¤\82, à¤\8fà¤\95रा à¤¬à¤¾à¤¦ à¤\86पन à¤¨à¤¯à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤\86 à¤\97à¥\81पà¥\8dतशब्द के साथ प्रवेश करीं।",
+       "nocookieslogin": "{{SITENAME}} à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रावà¥\87 à¤\96ातिर à¤\95à¥\81à¤\95à¥\80 à¤¸à¤­ à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87ला।\nराà¤\89र à¤\95à¥\81à¤\95à¥\80à¤\9c à¤\85सà¤\95à¥\8dषम à¤¬à¤¾à¥¤\nà¤\95à¥\83पया à¤\95à¥\81à¤\95à¥\80 के सक्षम करीं आ फिर से कोशिश करीं",
+       "nocookiesfornew": "सà¥\8dरà¥\8bत à¤\95à¥\87 à¤ªà¥\81षà¥\8dà¤\9fि à¤¨à¤¾ à¤¹à¥\8b à¤ªà¤¾à¤µà¥\87 à¤\95à¥\87 à¤\95ारण à¤\87 à¤\96ाता à¤¨à¤¾ à¤¬à¤¨à¤¾à¤µà¤²à¤² à¤\97à¤\87ल। \nसà¥\81निशà¥\8dà¤\9aित à¤\95रà¥\80à¤\82 à¤\95ि à¤°à¤\89à¤\86à¤\81 à¤\95à¥\81à¤\95à¥\80à¤\9c à¤¸à¤\95à¥\8dषम à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80, à¤ªà¤¨à¥\8dना à¤¦à¥\8bबारा à¤²à¥\8bड à¤\95रà¥\80à¤\82 à¤\86 à¤«à¤¿à¤° à¤¸à¥\87 à¤\95à¥\8bसिस करीं।",
        "createacct-loginerror": "खाता बनावल सफल भइल बाकी रउआँ अपने-आप लॉगिन ना हो पवलीं। [[Special:UserLogin|मैनुअल लॉगिन]] करीं।",
-       "noname": "रà¤\89à¤\86 à¤\89पयà¥\81à¤\95à¥\8dत à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¨à¤\88à¤\96à¥\80à¤\82 à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95à¤\88ले।",
-       "loginsuccesstitle": "लà¥\89à¤\97िन à¤ªà¥\82रा",
-       "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
-       "nosuchuser": "\"$1\" नाँव के कौनो प्रयोगकर्ता नइखन।\nप्रयोगकर्ता नाम संवेदनशील मामला बा।\nशब्द आ इस्पेलिंग के जाँच करीं, या [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
-       "nosuchusershort": "ई नाम से कौनो प्रयोगकर्ता नईखन \"$1\".\nआपन शब्द-वर्तनी के जाँच करीं।",
-       "nouserspecified": "रà¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\95रà¥\87 à¤\95à¥\87 à¤¬à¤¾।",
-       "login-userblocked": "à¤\88 प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।",
-       "wrongpassword": "गलत गुप्त-शब्द डलले बानी।\nकृपया फिर से कोशिश करीं।",
-       "wrongpasswordempty": "गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।",
-       "passwordtooshort": "गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
-       "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से अधिक लमहर नइखे हो सकत।",
-       "passwordtoopopular": "à¤\85à¤\95à¥\8dसरहा à¤¬à¥\80à¤\9bल à¤\9cाà¤\8f à¤µà¤¾à¤²à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¨à¤¾ à¤\87सà¥\8dतà¥\87माल à¤¹à¥\8bà¤\96à¥\80। à¤\95à¥\8cनà¥\8bà¤\82 à¤\85à¤\89रà¥\80 à¤\96ास à¤\85लà¤\97 à¤\9fाà¤\87प à¤\95à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड चुनीं।",
-       "password-name-match": "राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।",
-       "password-login-forbidden": "à¤\87स à¤¸à¤¦à¤¸à¥\8dयनाम आ गुप्तशब्द के प्रयोग वर्जित बा।",
+       "noname": "रà¤\89à¤\86 à¤¬à¥\88ध à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¦à¤¿à¤¹ले।",
+       "loginsuccesstitle": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¹à¥\8b à¤\97à¤\87ल",
+       "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
+       "nosuchuser": "\"$1\" नाँव के कौनो प्रयोगकर्ता नइखन।\nप्रयोगकर्तानाँव संवेदनशील मामला बा।\nशब्द आ इस्पेलिंग के जाँच करीं, या [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
+       "nosuchusershort": "\"$1\" नाँव के कौनो प्रयोगकर्ता नइखन।\nआपन इस्पेलिंग (हिज्जे) जाँचीं।",
+       "nouserspecified": "à¤\8fà¤\97à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤ªà¤°à¥\80।",
+       "login-userblocked": "à¤\8f प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।",
+       "wrongpassword": "गलत गुप्तशब्द डलले बानी।\nकृपया फिर से कोसिस करीं।",
+       "wrongpasswordempty": "गुप्तशब्द खाली बा। कृपया फिर से कोसिस करीं।",
+       "passwordtooshort": "गुप्तशब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
+       "passwordtoolong": "गुप्तशब्द {{PLURAL:$1|$1 अक्षर}} से लमहर ना चाहीं।",
+       "passwordtoopopular": "à¤\85à¤\95à¥\8dसरहा à¤¬à¥\80à¤\9bल à¤\9cाà¤\8f à¤µà¤¾à¤²à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¨à¤¾ à¤\87सà¥\8dतà¥\87माल à¤¹à¥\8b à¤¸à¤\95à¥\87 à¤²à¤¾à¥¤ à¤\95à¥\8cनà¥\8bà¤\82 à¤\85à¤\89रà¥\80 à¤\96ास à¤\85लà¤\97 à¤\95िसिम à¤\95à¥\87 à¤\97à¥\81पà¥\8dतशबà¥\8dद चुनीं।",
+       "password-name-match": "राउर गुप्तशब्द राउर प्रयोगकर्तानाँव से अलग होखे के चाहीं।",
+       "password-login-forbidden": "à¤\87स à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व आ गुप्तशब्द के प्रयोग वर्जित बा।",
        "mailmypassword": "गुप्तशब्द रिसेट करीं",
-       "passwordremindertitle": "{{SITENAME}} खातिर नया अस्थायी गुप्त-शब्द",
-       "passwordremindertext": "à¤\95à¥\87हà¥\81 (शायद à¤°à¤\89à¤\8f, $1 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87) {{SITENAME}} ($4) à¤ªà¤° à¤ªà¥\8dरयà¥\8bà¤\97 à¤\96ातिर à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¤\88लà¥\87 à¤¬à¤¾à¤¨à¥\80। à¤¸à¤¦à¤¸à¥\8dय \"$2\" à¤\96ातिर à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾, à¤\86 à¤\88 à¤\85भà¥\80 \"$3\" à¤¬à¤¾à¥¤ à¤¯à¤¦à¤¿ à¤\88 à¤°à¤¾à¤\89रà¥\87 à¤\86शय à¤°à¤¹à¤², à¤¤ à¤\85ब à¤°à¤\89à¤\86 à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80।\nराà¤\89र à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤\85वधि {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨à¤\82}} à¤®à¥\87à¤\82 à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9cाà¤\88।\n\nयदि à¤\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤°à¤¹à¤², à¤¯à¤¾ à¤°à¤\89à¤\86 à¤\86पन à¤ªà¥\81रान à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85ब à¤¨à¤\87à¤\96à¥\80 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤\9aाहत à¤\95ाहà¥\87 à¤\95ि à¤°à¤\89à¤\86 à¤°à¤¾à¤\89र à¤ªà¥\81रनà¤\95ा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¸à¥\8dमरण à¤¹à¥\8b à¤\86à¤\87ल à¤¬à¤¾, à¤¤ à¤°à¤\89à¤\86 à¤\87 à¤¸à¤\82दà¥\87श à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80, à¤\86 à¤\86पन à¤ªà¥\81रान à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¹à¤¿ à¤\9cà¤\87सन कर सकत बानी।",
-       "noemail": "\"$1\" à¤¸à¤¦à¤¸à¥\8dय à¤\96ातिर à¤\95à¤\89नà¥\8b à¤­à¥\80 à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¦à¤°à¥\8dà¤\9c à¤¨à¤\87à¤\96à¥\87 à¤\95रल à¤\97à¤\87ल।",
-       "noemailcreate": "रउआ एगो जायज ई-मेल पता उपलब्ध करावे के पड़ी।",
-       "passwordsent": "\"$1\" के ई-मेल पता पर एगो नया गुप्तशब्द भेज दिहल गइल बा।\nई-मेल पावे के बाद कृपया दुबारा खाता में प्रवेश करब।",
-       "blocked-mailpassword": "राà¤\89र à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रà¥\87 à¤¸à¥\87 à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤ à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर, à¤\8f à¤\86à¤\87पà¥\80 à¤¸à¥\87 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤°à¤¿à¤\95वरà¥\80 à¤\95à¥\87 à¤\85नà¥\81मति नइखे।",
-       "eauthentsent": "दर्ज करावल गइल ई-मेल पता पर एगो पुष्टिकरण ई-मेल भेज दिहल गइल बा।\nउ खाता पर कौनो दुसर ईमेल भेजल जाओ उ से पहिले, रउआ भेजल गईल ई-मेल पर दिहल गइल निर्देश के अनुसरण कर के ई-मेल पता के पुष्टिकरण करावे के पड़ी ताकि पता चले की सही में उ राउरे खाता ह।",
-       "throttled-mailpassword": "पिà¤\9bला {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤\95à¥\87 à¤\85à¤\82दर à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\88-मà¥\87ल à¤­à¥\87à¤\9cल à¤\9cा à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤\nदà¥\81रà¥\81पयà¥\8bà¤\97 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 à¤\96ातिर {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤®à¥\87à¤\82 à¤¸à¤¿à¤°à¥\8dफ à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\88-मेल भेजल जाई।",
-       "mailerror": "ई-मेल भेजे में त्रुटि: $1",
+       "passwordremindertitle": "{{SITENAME}} खातिर नया अस्थायी गुप्तशब्द",
+       "passwordremindertext": "à¤\95à¥\87हà¥\82 (शायद à¤°à¤\89à¤\8f, $1 à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87) {{SITENAME}} ($4) à¤ªà¤° à¤ªà¥\8dरयà¥\8bà¤\97 à¤\96ातिर à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¨à¤¿à¤µà¥\87दन à¤\95à¤\87लà¥\87 à¤¬à¤¾à¥¤ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता \"$2\" à¤\96ातिर à¤\8fà¤\97à¥\8b à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾, à¤\86 à¤\88 \"$3\" à¤¬à¤¾à¥¤ à¤¯à¤¦à¤¿ à¤\88 à¤°à¤\89वà¥\87à¤\82 à¤\9aाहत à¤°à¤¹à¤²à¥\80à¤\82, à¤¤ à¤\85ब à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95 à¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80।\nराà¤\89र à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤\85वधि {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨}} à¤®à¥\87à¤\82 à¤\96तम à¤¹à¥\8b à¤\9cाà¤\88।\n\nयदि à¤\88 à¤¨à¤¿à¤µà¥\87दन à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤°à¤¹à¤², à¤¯à¤¾ à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\86पन à¤ªà¥\81रनà¤\95ा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\87याद à¤\86 à¤\97à¤\87ल à¤¬à¤¾ à¤\86 à¤¬à¤¦à¤²à¤¾à¤µ à¤¨à¤\87à¤\96à¥\80à¤\82 à¤\9aाहत, à¤¤ à¤°à¤\89à¤\86à¤\81 à¤\8f à¤¸à¤¨à¥\87सा à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80, à¤\86 à¤\86पन à¤ªà¥\81रनà¤\95ा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¨à¤¿à¤¯à¤° कर सकत बानी।",
+       "noemail": "\"$1\" à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\96ातिर à¤\95à¥\8cनà¥\8bà¤\82 à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤°à¤¿à¤\95ारà¥\8dड à¤®à¥\87à¤\82 à¤¨à¤\87à¤\96à¥\87।",
+       "noemailcreate": "रउआँ के एगो जायज ईमेल पता देवे के पड़ी।",
+       "passwordsent": "\"$1\" के ईमेल पता पर एगो नया गुप्तशब्द भेज दिहल गइल बा।\nईमेल पावे के बाद कृपया दुबारा खाता में प्रवेश करीं।",
+       "blocked-mailpassword": "राà¤\89र à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रà¥\87 à¤¸à¥\87 à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾à¥¤ à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95à¥\87 à¤\96ातिर, à¤\8f à¤\86à¤\87पà¥\80 à¤¸à¥\87 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¦à¥\8bबारा à¤¹à¤¾à¤¸à¤¿à¤² à¤\95रà¥\87 à¤\95à¥\87 à¤\87à¤\9cाà¤\9cत नइखे।",
+       "eauthentsent": "दर्ज करावल गइल ईमेल पता पर एगो पुष्टिकरण ईमेल भेज दिहल गइल बा।\nउ खाता पर कौनो दूसर ईमेल भेजल जाव ओ से पहिले, रउआँ भेजल गइल ईमेल पर दिहल गइल निर्देश के अनुसार ईमेल पता के पुष्टिकरण करावे के पड़ी ताकि पता चले की सही में ऊ राउरे खाता हऽ।",
+       "throttled-mailpassword": "पिà¤\9bला {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤\95à¥\87 à¤\85à¤\82दर à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤²à¤¾à¤µ à¤\88मà¥\87ल à¤­à¥\87à¤\9cल à¤\9cा à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤\nदà¥\81रà¥\81पयà¥\8bà¤\97 à¤¸à¥\87 à¤¬à¤\9aावà¥\87 à¤\96ातिर {{PLURAL:$1|à¤\8fà¤\95 à¤\98à¤\82à¤\9fा|$1 à¤\98à¤\82à¤\9fा}} à¤®à¥\87à¤\82 à¤¸à¤¿à¤°à¥\8dफ à¤\8fà¤\97à¥\8b à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤²à¤¾à¤µ à¤\88मेल भेजल जाई।",
+       "mailerror": "ईमेल भेजे में गड़बड़ी: $1",
        "acct_creation_throttle_hit": "राउर आइपी पता से आइल आगंतुक लोग पिछला $2 में एह विकि पर {{PLURAL:$1|एक ठो खाता|$1 खाता}} बना चुकल बा जवन एह समयअवधि में अधिकतम सीमा बा।\nएही कारण, एह आइपी पता के इस्तेमाल करे वाला आगंतुक अब कौनों अउरी खाता एह समय नइखें बना सकत।",
-       "emailauthenticated": "$2 के $3 पर राउर ई-मेल पता के पुष्टीकरण हो चुकल बा।",
-       "emailnotauthenticated": "राउर ई-मेल पता के अभी तक प्रमाणिकरण नइखे भईल।\nनिम्नलिखित कउनो भी सुविधा खातिर रउआ के कौनो भी ई-मेल ना भेजल जाई।",
-       "noemailprefs": "à¤\87 à¤¸à¥\81विधा à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤\86पन à¤µà¤°à¤¿à¤¯à¤¤à¤¾ à¤®à¥\87à¤\82 à¤\8fà¤\97à¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¦à¤¿à¤¹à¥\80ं।",
-       "emailconfirmlink": "अपना ई-मेल पता कन्फर्म करीं",
-       "invalidemailaddress": "राउर ई-मेल पता स्वीकार करल नइखे जा सकत काहे कि ई-मेल के जउन रुप दिखाई दे रहल बा उ गलत लागत बा।\nकृपया एगो सहि ई-मेल पता उपलब्ध कराईं या उ जगह के खाली छोड़ दिहीं।",
-       "cannotchangeemail": "à¤\87 à¤µà¤¿à¤\95à¥\80 à¤ªà¤° à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¬à¤¦à¤²à¤² à¤¨à¤\88à¤\96à¥\87 à¤\9cा à¤¸à¤\95त।",
-       "emaildisabled": "à¤\87 à¤¸à¤¾à¤\88à¤\9f à¤¸à¥\87 à¤\88-मà¥\87ल à¤¨à¤\88खे भेजल जा सकत।",
-       "accountcreated": "à¤\96ाता à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\88ल",
-       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वारà¥\8dता]]) à¤\96ातिर à¤\96ाता à¤¨à¤¿à¤°à¥\8dमित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾।",
+       "emailauthenticated": "$2 के $3 पर राउर ईमेल पता के पुष्टीकरण हो चुकल बा।",
+       "emailnotauthenticated": "राउर ईमेल पता के अभी तक प्रमाणिकरण नइखे भइल।\nनीचे लिखल कौनों भी सुविधा खातिर रउआ के कौनो भी ईमेल ना भेजल जाई।",
+       "noemailprefs": "à¤\8f à¤¸à¥\81विधा à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\87 à¤\96ातिर à¤\86पन à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤®à¥\87à¤\82 à¤\8fà¤\97à¥\8b à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¦à¥\87à¤\88ं।",
+       "emailconfirmlink": "अपना ईमेल पता के पुष्टी करीं",
+       "invalidemailaddress": "राउर ईमेल पता अबैध फॉरमैट में बुझात बा आ स्वीकार नइखे हो सकत।\nसही-फॉरमैट में ईमेल पता देईं या जगह के खाली छोड़ देईं।",
+       "cannotchangeemail": "à¤\8f à¤µà¤¿à¤\95à¥\80 à¤ªà¤° à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¨à¤¾ à¤¬à¤¦à¤²à¤² à¤\9cा à¤¸à¤\95त à¤¬à¤¾।",
+       "emaildisabled": "à¤\87 à¤¸à¤¾à¤\87à¤\9f à¤¸à¥\87 à¤\88मà¥\87ल à¤¨à¤\87खे भेजल जा सकत।",
+       "accountcreated": "à¤\96ाता à¤¬à¤¨à¤¾à¤µà¤² à¤\97à¤\87ल",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वारà¥\8dता]]) à¤\96ातिर à¤\96ाता à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल।",
        "createaccount-title": "{{SITENAME}} खातिर खाता बनाईं",
-       "createaccount-text": "राउर ई-मेल पता खातिर {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" गुप्तशब्द (पासवर्ड) सहित खाता खोलले बानी। रउआ खाता में प्रवेश कर के आपन गुप्तशब्द (पासवर्ड) तुरंत बदल लेवे के चाहीं।\n\nयदि इ खाता गलती से खोलल गईल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी।",
-       "login-throttled": "रà¤\89à¤\86 à¤¹à¤¾à¤²à¥\87 à¤®à¥\87à¤\82 à¤\95à¤\88यन à¤¬à¤¾à¤° à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95र à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80।\nà¤\95à¥\83पया $1 à¤ªà¥\8dरतिà¤\95à¥\8dषा à¤\95रला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤«à¤¿à¤° à¤¸à¥\87 à¤ªà¥\8dरयास करब।",
-       "login-abort-generic": "राà¤\89र à¤²à¥\89à¤\97िन बिफल रहल - रद्द कइल गइल",
-       "login-migrated-generic": "à¤\86प à¤\95à¥\87 à¤\96ाता à¤®à¤¾à¤\87à¤\97à¥\8dरà¥\87à¤\9f à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\85à¤\89र à¤\86प à¤\95à¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤\87 विकी पर अब मौजूद नइखे।",
+       "createaccount-text": "राउर ईमेल पता खातिर {{SITENAME}} ($4) पर \"$2\" प्रयोगकर्तानाँव से \"$3\" गुप्तशब्द के साथ केहू खाता खोलले बा।\nरउआँ के खाता में प्रवेश कर के आपन गुप्तशब्द तुरंत बदल लेवे के चाहीं।\n\nयदि ई खाता गलती से खोलल गइल बा, त रउआ ए सनेसा के अनदेखा कर सकत बानी।",
+       "login-throttled": "रà¤\89à¤\86 à¤¹à¤¾à¤²à¥\87 à¤®à¥\87à¤\82 à¤\95à¤\87यन à¤¬à¥\87र à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\95à¥\87 à¤\95à¥\8bशिश à¤\95 à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤¨à¥\80।\nà¤\95à¥\83पया $1 à¤\87à¤\82तà¤\9cार à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤«à¤¿à¤° à¤¸à¥\87 à¤\95à¥\8bसिस करब।",
+       "login-abort-generic": "राà¤\89र à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श बिफल रहल - रद्द कइल गइल",
+       "login-migrated-generic": "à¤\86प à¤\95à¥\87 à¤\96ाता à¤®à¤¾à¤\87à¤\97à¥\8dरà¥\87à¤\9f à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\85à¤\89र à¤\86प à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व à¤\8f विकी पर अब मौजूद नइखे।",
        "loginlanguagelabel": "भाषा: $1",
-       "suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि  अइसन लग रहल बा कि इ कउनो खराब ब्राउज़र या कैश करे वाली प्रॉक्सी द्वारा भेजल गईल रहल।",
-       "createacct-another-realname-tip": "à¤\85सलà¥\80 à¤¨à¤¾à¤® à¤µà¥\88à¤\95लà¥\8dपिà¤\95 à¤¬à¤¾à¥¤\nयदि à¤°à¤\89à¤\86 à¤\87 à¤\95à¥\87 à¤\89पलबà¥\8dध à¤\95रावà¥\87 à¤\95à¥\87 à¤\9aà¥\81नत à¤¬à¤¾à¤¨à¥\80 à¤¤, à¤\8fà¤\95र à¤ªà¥\8dरयà¥\8bà¤\97 à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤\93à¤\95रा à¤\95ाम à¤\95à¥\87 à¤\85धिà¤\95ार देवे खातिर होखी।",
+       "suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि अइसन बुझाता कि ई कौनों खराब ब्राउजर या कशे करे वाली प्रॉक्सी द्वारा भेजल गइल रहल।",
+       "createacct-another-realname-tip": "à¤\85सलà¥\80 à¤¨à¤¾à¤® à¤µà¥\88à¤\95लà¥\8dपिà¤\95 à¤¬à¤¾à¥¤\nà¤\85à¤\97र à¤°à¤\89à¤\86à¤\81 à¤\85सलà¥\80 à¤¨à¤¾à¤\81व à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤¬à¤¿à¤\95लà¥\8dप à¤\9aà¥\81नब, à¤\8fà¤\95र à¤\87सà¥\8dतà¥\87माल à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\87 à¤\93à¤\95रा à¤\95ाम à¤\95à¥\87 à¤¶à¥\8dरà¥\87य देवे खातिर होखी।",
        "pt-login": "खाता में प्रवेश",
-       "pt-login-button": "लà¥\89à¤\97 à¤\87न",
-       "pt-login-continue-button": "लà¥\89à¤\97िन जारी राखीं",
+       "pt-login-button": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श",
+       "pt-login-continue-button": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श जारी राखीं",
        "pt-createaccount": "खाता बनाईं",
-       "pt-userlogout": "लà¥\89à¤\97 à¤\86à¤\89à¤\9f",
-       "php-mail-error-unknown": "PHP à¤\95à¥\87 mail() à¤«à¤¼à¤\82à¤\95à¥\8dशन à¤®à¥\87à¤\82 à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¥\8dरà¥\81à¤\9fि बा।",
-       "user-mail-no-addy": "बिना à¤\95à¤\89नà¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤\88-मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤ªà¥\8dरयतà¥\8dन à¤­à¤\88ल बा।",
-       "user-mail-no-body": "à¤\8fà¤\97à¥\8b à¤\96ालà¥\80 à¤\85थवा à¤¬à¤¹à¥\81त à¤\9bà¥\8bà¤\9f à¤\88-मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤ªà¥\8dरयतà¥\8dन à¤­à¤\88ल बा।",
-       "changepassword": "गुप्त शब्द बदलीं",
-       "resetpass_announce": "लà¥\89à¤\97 à¤\87न à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रà¥\87 à¤\96ातिर à¤°à¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤¹à¥\8bà¤\88।",
+       "pt-userlogout": "à¤\96ाता à¤¸à¥\87 à¤¬à¤¾à¤¹à¤°",
+       "php-mail-error-unknown": "PHP à¤\95à¥\87 mail() à¤«à¤\82à¤\95à¥\8dशन à¤®à¥\87à¤\82 à¤¨à¤¾à¤®à¤¾à¤²à¥\82म à¤\97ड़बड़à¥\80 बा।",
+       "user-mail-no-addy": "बिना à¤\95à¥\8cनà¥\8b à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤\95à¥\87 à¤\88मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤\95à¥\8bसिस à¤­à¤\87ल बा।",
+       "user-mail-no-body": "à¤\8fà¤\97à¥\8b à¤\96ालà¥\80 à¤¯à¤¾ à¤¬à¤¹à¥\81त à¤\9bà¥\8bà¤\9f à¤\88मà¥\87ल à¤­à¥\87à¤\9cà¥\87 à¤\95à¥\87 à¤\95à¥\8bसिस à¤­à¤\87ल बा।",
+       "changepassword": "गुप्तशब्द बदलीं",
+       "resetpass_announce": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\95रà¥\87 à¤\96ातिर à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤¦à¥\87वà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80।",
        "resetpass_header": "खाता के गुप्तशब्द बदलीं",
-       "oldpassword": "पुराना गुप्त-शब्द:",
-       "newpassword": "नया गुप्त-शब्द:",
-       "retypenew": "नया गुप्त-शब्द पुन: डालीं:",
+       "oldpassword": "पुरान गुप्तशब्द:",
+       "newpassword": "नया गुप्तशब्द:",
+       "retypenew": "नया गुप्तशब्द फिर डालीं:",
        "resetpass_submit": "गुप्तशब्द बनाईं आ खाता में प्रवेश करीं",
-       "changepassword-success": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड बदल दिहल गइल बा!",
-       "changepassword-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
+       "changepassword-success": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद बदल दिहल गइल बा!",
+       "changepassword-throttled": "रउआँ हाले में कइयन बेर खाता में प्रवेश करे के कोसिस क चुकल बानी।\nकृपया $1 इंतजार के बाद फिर से कोसिस करब।",
        "botpasswords": "बॉट पासवर्ड",
        "botpasswords-summary": "<em>बॉट पासवर्ड</em> खाता के मुख्य प्रवेश-पहिचान-जानकारी के बिना, सीधे एपीआई के माध्यम से खाता ले पहुँच देवे लें। बॉट पासवर्ड दे के खाता में प्रवेश के बाद खाता के प्रयोगकर्ता अधिकार कुछ सीमित हो सकेला।\n\nअगर आपके ई नइखे मालूम कि ई करे के आपके का जरूरत बा, साइद आपके ई ना करे के चाहीं। केहू भी रउवाँ से कबो ई पासवर्ड जनरेट करे के ना कही न आपसे ई पासवर्ड माँगी।",
        "botpasswords-disabled": "बॉट पासवर्ड अक्षम कइल गइल बा।",
        "botpasswords-deleted-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड मिटावल गइल।",
        "resetpass_forbidden": "गुप्तशब्द बदलल नइखे जा सकत",
        "resetpass_forbidden-reason": "गुप्तशब्द बदलल नइखे जा सकत:$1",
-       "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
-       "resetpass-submit-loggedin": "गुप्त शब्द बदलीं",
+       "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआँ के पहिले खाता में प्रवेश करे के पड़ी।",
+       "resetpass-submit-loggedin": "गुप्तशब्द बदलीं",
        "resetpass-submit-cancel": "रद्द करीं",
        "resetpass-wrong-oldpass": "अबैध अस्थायी या वर्तमान गुप्तशब्द।\nरउआ पहिलहीं आपन गुप्तशब्द बदल चुकल बानी, या रउआ एगो अस्थायी गुप्तशब्द के अनुरोध कइले हो सकत बानी।",
        "resetpass-recycled": "रीसेट करे खातिर नया पासवर्ड में कृपया आपन वर्तमान पासवर्ड के अलावा कौनो अन्य पासवर्ड के प्रयोग करीं।",
-       "resetpass-temp-emailed": "à¤\85सà¥\8dथाà¤\88 à¤\88मà¥\87ल à¤\95à¥\8bड à¤\95à¥\87 à¤¦à¥\8dवारा à¤°à¤\89à¤\86 à¤²à¥\89à¤\97 à¤\87न à¤­à¤\87ल à¤¬à¤¾à¤¨à¥\80।\nलà¥\89à¤\97 à¤\87न à¤ªà¥\82रा à¤\95रà¥\87 à¤\96ातिर, à¤°à¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड सेट करे के पड़ी:",
+       "resetpass-temp-emailed": "à¤\85सà¥\8dथाà¤\88 à¤\88मà¥\87ल à¤\95à¥\8bड à¤\95à¥\87 à¤¦à¥\8dवारा à¤°à¤\89à¤\86 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80।\nà¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रा à¤\95रà¥\87 à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद सेट करे के पड़ी:",
        "resetpass-temp-password": "अस्थायी गुप्तशब्द:",
-       "resetpass-abort-generic": "à¤\95à¤\89नà¥\8b à¤\8fà¤\95à¥\8dसà¤\9fà¥\87à¤\82शन à¤¦à¥\8dवारा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा।",
-       "resetpass-expired": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\95à¥\80 à¤µà¥\88धता à¤\85वधि à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤ à¤\95à¥\83पया à¤²à¥\89à¤\97 à¤\87न à¤\95रà¥\87 à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड सेट करीं।",
-       "resetpass-expired-soft": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85मानà¥\8dय à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\87 à¤\95à¥\87 à¤ªà¥\81नà¤\83 à¤¸à¥\8dथापित à¤\95रà¥\87 à¤\95à¥\87 à¤ªà¤¡à¤¼à¥\80। à¤\95à¥\83पया à¤\85भà¥\80 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\80à¤\82 à¤¯à¤¾ \"{{int:authprovider-resetpass-skip-label}}\" à¤ªà¤° à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤ªà¥\81नà¤\83 à¤¸à¥\8dथापित à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।",
-       "resetpass-validity-soft": "राà¤\89र à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤®à¤¾à¤¨à¥\8dय à¤¨à¤\88à¤\96à¥\87: $1 \n\nà¤\95à¥\83पया à¤\85ब à¤\8fà¤\95 à¤¨à¤¯à¤¾ à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\9aà¥\81नà¥\80à¤\82, à¤¯à¤¾ à¤\89 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87 à¤\96ातिर \"{{int:authprovider-resetpass-skip-label}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80à¤\82।",
-       "passwordreset": "गुप्तशब्द (पासवर्ड) रिसेट करीं",
-       "passwordreset-text-one": "à¤\86पन à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87 à¤\96ातिर à¤\87 à¤«à¥\89रà¥\8dम भरीं।",
-       "passwordreset-text-many": "{{PLURAL:$1|à¤\88मà¥\87ल à¤¦à¥\8dवारा à¤\85सà¥\8dथाà¤\88 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤¾à¤µà¥\87 à¤\96ातिर à¤¨à¤¿à¤®à¥\8dन à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\95à¤\89नो एगो स्थान भरीं।}}",
-       "passwordreset-disabled": "à¤\87 à¤µà¤¿à¤\95à¥\80 à¤ªà¤° à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\85à¤\95à¥\8dषम बा।",
-       "passwordreset-emaildisabled": "à¤\87 à¤µà¤¿à¤\95ि à¤ªà¤° à¤\88-मà¥\87ल à¤¸à¥\81विधा à¤\85à¤\95à¥\8dषम à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा।",
-       "passwordreset-username": "प्रयोगकर्ता नाम",
+       "resetpass-abort-generic": "à¤\95à¤\89नà¥\8b à¤\8fà¤\95à¥\8dसà¤\9fà¥\87à¤\82शन à¤¦à¥\8dवारा à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल बा।",
+       "resetpass-expired": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤µà¥\88धता à¤¸à¤®à¤¯ à¤\96तम à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤ à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\87 à¤\96ातिर à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद सेट करीं।",
+       "resetpass-expired-soft": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\96तम à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾ à¤\86 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤\9cरà¥\82रत à¤¬à¤¾à¥¤ à¤\85बà¥\8dबà¥\87 à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\80à¤\82, à¤¯à¤¾ à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80à¤\82 \"{{int:authprovider-resetpass-skip-label}}\"।",
+       "resetpass-validity-soft": "राà¤\89र à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤®à¤¾à¤¨à¥\8dय à¤¨à¤\87à¤\96à¥\87: $1 \n\nà¤\85ब à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\9aà¥\81नà¥\80à¤\82, à¤¯à¤¾ \"{{int:authprovider-resetpass-skip-label}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रà¥\80à¤\82 à¤\85à¤\97र à¤¬à¤¾à¤¦ à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤¹à¥\8bà¤\96à¥\87।",
+       "passwordreset": "गुप्तशब्द रिसेट करीं",
+       "passwordreset-text-one": "à¤\88मà¥\87ल à¤¸à¥\87 à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤ªà¤¾à¤µà¥\87 à¤\96ातिर à¤\88 à¤«à¤¾à¤°म भरीं।",
+       "passwordreset-text-many": "{{PLURAL:$1|à¤\88मà¥\87ल à¤¦à¥\8dवारा à¤\85सà¥\8dथाà¤\88 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤¾à¤µà¥\87 à¤\96ातिर à¤¨à¥\80à¤\9aà¥\87 à¤\95à¥\87 à¤\95à¥\8cनो एगो स्थान भरीं।}}",
+       "passwordreset-disabled": "à¤\8f à¤µà¤¿à¤\95ि à¤ªà¤° à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¬à¤¦à¤²à¤² à¤\85à¤\95à¥\8dषम à¤\95à¤\87ल à¤\97à¤\87ल बा।",
+       "passwordreset-emaildisabled": "à¤\8f à¤µà¤¿à¤\95ि à¤ªà¤° à¤\88मà¥\87ल à¤¸à¥\81बिधा à¤\85à¤\95à¥\8dषम à¤\95à¤\87ल à¤\97à¤\87ल बा।",
+       "passwordreset-username": "प्रयोगकर्तानाँव:",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-email": "ई-मेल पता:",
+       "passwordreset-email": "ईमेल पता:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाता विवरण",
-       "passwordreset-emailtext-ip": "à¤\95à¥\87हà¥\81 (शायद à¤°à¤\89à¤\8f, $1 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87) {{SITENAME}} ($4) à¤ªà¤° à¤\86पन {{PLURAL:$3|à¤\97à¥\81पà¥\8dतशबà¥\8dद}} à¤\95à¥\87 à¤°à¥\80सà¥\87à¤\9f à¤\95रà¥\87 à¤\95à¥\87 à¤\85नà¥\81रà¥\8bध à¤\95à¤\88लà¥\87 à¤¬à¤¾à¤¨à¥\80। à¤\87 à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¸à¥\87 à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$3|à¤\96ाता à¤\9cà¥\81ड़ल à¤¬à¤¾}}:\n\n$2\n\n{{PLURAL:$3|à¤\87}} à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨}} à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\95ाम à¤¨à¤¾ à¤\95रà¥\80। à¤°à¤\89à¤\86 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85भà¥\80 à¤\9aà¥\81न à¤²à¥\87वà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82। à¤¯à¤¦à¤¿ à¤\87 à¤\85नà¥\81रà¥\8bध à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤¬à¤¾, à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤\89à¤\86 à¤\86पन à¤®à¥\82ल à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¯à¤¾à¤¦ à¤\86 à¤\97à¤\88ल à¤¬à¤¾, à¤\85à¤\89र à¤\86प {{PLURAL:$3|à¤\86पन}} à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¨à¤\87à¤\96à¥\80 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤\9aाहत à¤¤, à¤°à¤\89à¤\86 à¤\87 à¤¸à¤\82दà¥\87श à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95र के आपन पुरानका गुप्तशब्द के प्रयोग जारी रख सकत बानी।",
-       "passwordreset-emailtext-user": "{{SITENAME}} ($4) à¤ªà¤° à¤¸à¤¦à¤¸à¥\8dय $1 à¤°à¤¾à¤\89र {{PLURAL:$3|à¤\96ाता}} à¤\95à¥\87 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87 à¤\95à¥\87 à¤\85नà¥\81रà¥\8bध à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80। à¤\87 à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¸à¥\87 à¤¨à¤¿à¤®à¥\8dन {{PLURAL:$3|à¤\96ाता à¤\9cà¥\81ड़ल à¤¬à¤¾}}:\n\n$2\n\n{{PLURAL:$3|à¤\87}} à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨}} à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\95ाम à¤¨à¤¾ à¤\95रà¥\80।\nरà¤\89à¤\86 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85भà¥\80यà¥\87 à¤\9aà¥\81न à¤²à¥\87वà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82। à¤¯à¤¦à¤¿ à¤\87 à¤\85नà¥\81रà¥\8bध à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤¬à¤¾, à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤\89à¤\86 à¤\86पन à¤®à¥\82ल à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¯à¤¾à¤¦ à¤\86 à¤\97à¤\88ल à¤¬à¤¾, à¤\85à¤\89र à¤°à¤\89à¤\86 {{PLURAL:$3|à¤\86पन}} à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¨à¤\88à¤\96à¥\80à¤\82 à¤¬à¤¦à¤²à¥\87 à¤\95à¥\87 à¤\9aाहत à¤¤, à¤°à¤\89à¤\86 à¤\87 à¤¸à¤\82दà¥\87श à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95र के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
-       "passwordreset-emailelement": "सदसà¥\8dयनाम: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
+       "passwordreset-emailtext-ip": "à¤\95à¥\87हà¥\81 (शायद à¤°à¤\89à¤\8f, $1 à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤¸à¥\87) {{SITENAME}} ($4) à¤ªà¤° à¤\86पन {{PLURAL:$3|à¤\97à¥\81पà¥\8dतशबà¥\8dद}} à¤\95à¥\87 à¤°à¥\80सà¥\87à¤\9f à¤\95रà¥\87 à¤\95à¥\87 à¤\85नà¥\81रà¥\8bध à¤\95à¤\87लà¥\87 à¤¬à¤¾à¥¤ à¤\8f à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¸à¥\87 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² {{PLURAL:$3|à¤\96ाता à¤\9cà¥\81ड़ल à¤¬à¤¾}}:\n\n$2\n\n{{PLURAL:$3|à¤\87}} à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨}} à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\95ाम à¤¨à¤¾ à¤\95रà¥\80। à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95 à¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85बà¥\8dबà¥\87 à¤\9aà¥\81न à¤²à¥\87वà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82। à¤¯à¤¦à¤¿ à¤\88 à¤\85नà¥\81रà¥\8bध à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤¬à¤¾, à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\86पन à¤®à¥\82ल à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\87याद à¤\86 à¤\97à¤\87ल à¤¬à¤¾, à¤\86 à¤\86प {{PLURAL:$3|à¤\86पन}} à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¬à¤¦à¤²à¤² à¤\9aाहत à¤¤ à¤\8f à¤¸à¤¨à¥\87सा à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95 के आपन पुरानका गुप्तशब्द के प्रयोग जारी रख सकत बानी।",
+       "passwordreset-emailtext-user": "{{SITENAME}} ($4) à¤ªà¤° à¤¸à¤¦à¤¸à¥\8dय $1 à¤°à¤¾à¤\89र {{PLURAL:$3|à¤\96ाता}} à¤\95à¥\87 à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\95à¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\87 à¤\95à¥\87 à¤\85नà¥\81रà¥\8bध à¤\95à¤\87लà¥\87 à¤¬à¤¾à¤¨à¥\80। à¤\8f à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¸à¥\87 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² {{PLURAL:$3|à¤\96ाता à¤\9cà¥\81ड़ल à¤¬à¤¾}}:\n\n$2\n\n{{PLURAL:$3|à¤\87}} à¤\85सà¥\8dथायà¥\80 à¤\97à¥\81पà¥\8dतशबà¥\8dद {{PLURAL:$5|à¤\8fà¤\95 à¤¦à¤¿à¤¨|$5 à¤¦à¤¿à¤¨}} à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\95ाम à¤¨à¤¾ à¤\95रà¥\80।\nरà¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¤\95à¥\87 à¤\8fà¤\97à¥\8b à¤¨à¤¯à¤¾ à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\85बà¥\8dबà¥\87 à¤\9aà¥\81न à¤²à¥\87वà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82। à¤¯à¤¦à¤¿ à¤\88 à¤\85नà¥\81रà¥\8bध à¤\95à¥\87हà¥\81 à¤\85à¤\89र à¤\95à¤\87लà¥\87 à¤¬à¤¾, à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤\89à¤\86à¤\81 à¤\95à¥\87 à¤\86पन à¤®à¥\82ल à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤\87याद à¤\86 à¤\97à¤\87ल à¤¬à¤¾, à¤\86 à¤°à¤\89à¤\86à¤\81 {{PLURAL:$3|à¤\86पन}} à¤\97à¥\81पà¥\8dतशबà¥\8dद à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¬à¤¦à¤²à¤² à¤\9aाहत à¤¤ à¤\8f à¤¸à¤¨à¥\87सा à¤\95à¥\87 à¤\85नदà¥\87à¤\96ा à¤\95 के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
+       "passwordreset-emailelement": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाà¤\81व: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
        "passwordreset-emailsentemail": "अगर दिहल गइल ईमेल पता आपके खाता के साथ जुड़ल होखी, गुप्तशब्द दुबारा सेट करे खातिर एक ठो ईमेल भेज दिहल जाई।",
        "passwordreset-emailsentusername": "अगर एह प्रयोगकर्तानाँव के साथ कौनों ईमेल जुड़ल होखी, गुप्तशब्द बदले खातिर एक ठो ईमेल भेज दिहल जाई।",
        "passwordreset-nocaller": "एक ठो काल करे वाला दिहल जरूरी बाटे",
        "changeemail-header": "आपन ईमेल पता बदले खातिर ई फार्म भरीं। अगर आप अपना खाता से जुड़ल ईमेल हटावल चाहत बानी, तब नया ईमेल वाला बिकल्प के फार्म में खाली छोड़ देईं।",
        "changeemail-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "changeemail-oldemail": "वर्तमान ई-मेल पता:",
-       "changeemail-newemail": "नया ई-मेल पता:",
+       "changeemail-newemail": "नया ईमेल पता:",
        "changeemail-newemail-help": "ई बिकल्प के खाली तबे छोड़ल जाय जब आप आपन ईमेल खाता से हटावल चाहत होखीं। एकरा बाद आपन भुलाइल पासवर्ड बदले खातिर ईमेल ना माँग पाइब, न एह विकि से कौनों ईमेल आपके भेजल जा पाई अगर आप आपन ईमेल पता इहाँ से हटा देइब।",
-       "changeemail-none": "(à¤\95à¤\89नà¥\8b à¤¨à¤¾à¤¹à¥\80à¤\82)",
+       "changeemail-none": "(à¤\95à¥\8cनà¥\8b à¤¨à¤¾)",
        "changeemail-password": "राउर {{SITENAME}} गुप्तशब्द:",
-       "changeemail-submit": "ई-मेल बदलीं",
-       "changeemail-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
+       "changeemail-submit": "ईमेल बदलीं",
+       "changeemail-throttled": "रउआँ हाले में कइयन बेर खाता में प्रवेश करे के कोसिस क चुकल बानी।\nकृपया $1 इंतजार के बाद फिर से कोसिस करब।",
        "changeemail-nochange": "इहाँ एक ठो दूसर ईमेल भरीं।",
        "resettokens": "टोकन रीसेट करीं",
-       "resettokens-text": "à¤\9cà¥\8cन à¤\9fà¥\8bà¤\95न à¤°à¤¾à¤\89र à¤\96ाता à¤¸à¥\87 à¤¸à¤®à¥\8dबदà¥\8dध à¤\95à¥\81à¤\9b à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80 à¤ªà¥\8dरदान à¤\95रà¥\87ला, à¤\86प à¤\89 à¤\95à¥\87 à¤\85हिà¤\9cा à¤°à¥\80सà¥\87à¤\9f à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।\n\nयदि à¤°à¤\89à¤\86 à¤\88 à¤\95à¥\87 à¤\97लतà¥\80 à¤¸à¥\87 à¤\95à¥\87हà¥\82 à¤\95à¥\87 à¤¦à¤¿à¤\96ा à¤¦à¥\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤¾à¤\89र à¤\96ाता à¤¹à¥\88à¤\95 à¤¹à¥\8b à¤\97à¤\88ल à¤¬à¤¾ à¤¤ à¤°à¤\89à¤\86 à¤\88 के रीसेट कर देवे के चाहीं।",
+       "resettokens-text": "à¤\9cà¥\8cन à¤\9fà¥\8bà¤\95न à¤°à¤¾à¤\89र à¤\96ाता à¤¸à¥\87 à¤¸à¤®à¥\8dबदà¥\8dध à¤\95à¥\81à¤\9b à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80 à¤ªà¥\8dरदान à¤\95रà¥\87ला, à¤\86प à¤\87नहन à¤\95à¥\87 à¤\8fहिà¤\9cा à¤°à¥\80सà¥\87à¤\9f à¤\95र à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।\n\nयदि à¤°à¤\89à¤\86à¤\81 à¤\8fà¤\95रा à¤\95à¥\87 à¤\97लतà¥\80 à¤¸à¥\87 à¤\95à¥\87हà¥\82 à¤\95à¥\87 à¤¦à¥\87à¤\96ा à¤¦à¥\87लà¥\87 à¤¬à¤¾à¤¨à¥\80 à¤¯à¤¾ à¤«à¤¿à¤° à¤°à¤¾à¤\89र à¤\96ाता à¤¹à¥\88à¤\95 à¤¹à¥\8b à¤\97à¤\87ल à¤¬à¤¾ à¤¤ à¤\8fà¤\95रा के रीसेट कर देवे के चाहीं।",
        "resettokens-no-tokens": "रीसेट करे खातिर कउनो टोकन नइखे।",
        "resettokens-tokens": "टोकन:",
-       "resettokens-token-label": "$1 (वरà¥\8dतमान à¤®à¥\82लà¥\8dय: $2)",
-       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पà¤\95à¥\87 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤ªà¤¨à¥\8dनन à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µà¤¸à¤­]] à¤\95à¥\87 à¤µà¥\87ब à¤«à¤¼à¥\80ड (Atom/RSS) à¤¹à¥\87तà¥\81 टोकन",
+       "resettokens-token-label": "$1 (वरà¥\8dतमान à¤µà¥\88लà¥\8dयà¥\82: $2)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पà¤\95à¥\87 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤ªà¤¨à¥\8dनन à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µà¤¸à¤­]] à¤\95à¥\87 à¤µà¥\87ब à¤«à¥\80ड (à¤\8fà¤\9fम/à¤\86रà¤\8dसà¤\8dस) à¤\96ातिर टोकन",
        "resettokens-done": "टोकन रीसेट हो चुकल बा।",
        "resettokens-resetbutton": "चुनल गइल टोकन रीसेट करीं",
        "bold_sample": "मोट अच्छर में",
        "media_tip": "फाइल कड़ी",
        "sig_tip": "समय मोहर की संघे राउर दस्खत",
        "hr_tip": "पड़ी लकीर (कम प्रयोग करीं)",
-       "summary": "à¤\9bà¥\8bà¤\9f à¤µà¤¿à¤µà¤°à¤£ (साराà¤\82श):",
+       "summary": "साराà¤\82श:",
        "subject": "बिसय:",
        "minoredit": "छोट परिवर्तन",
        "watchthis": "धियानसूची में डालीं",
        "savechanges": "बदलाव सहेजीं",
        "publishpage": "पन्ना प्रकाशित करीं",
        "publishchanges": "बदलाव प्रकाशित करीं",
-       "preview": "पà¥\82रà¥\8dवावलà¥\8bà¤\95न",
+       "preview": "à¤\9dलà¤\95",
        "showpreview": "झलक देखीं",
        "showdiff": "बदलाव देखीं",
-       "blankarticle": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\8fà¤\97à¥\8b à¤\96ालà¥\80 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¨à¤¾à¤µà¥\87 à¤\9cा à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nयदि à¤\86प \"{{int:savearticle}}\" à¤\95à¥\87 à¤«à¥\87र à¤¸à¥\87 à¤¦à¤¬à¤¾à¤¯à¥\87ब à¤¤ à¤ªà¤¨à¥\8dना à¤¬à¤¿à¤¨à¤¾ à¤\95à¤\89नà¥\8b à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95à¥\87 à¤¬à¤¨ à¤\9cाà¤\88।",
-       "anoneditwarning": "<strong>चेतावनी:</strong> रउआ आपन खाता में प्रवेश नइखीं कइले। अगर रउआ कौनों बदलाव करत बानी त राउर आईपी पता दर्ज होई। अगर रउआ <strong>[$1 लॉग इन]</strong> या <strong>[$2 नया खाता बनाइब]</strong> त, अउरी सुबिधा सब की संघे राउर संपादन के श्रेय भी राउर सदस्य-नाँव से जुड़ जाई!",
-       "anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
-       "missingsummary": "'''सà¥\8dमरणपतà¥\8dर:'''रà¤\89à¤\86 à¤\8fà¤\97à¥\8b à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤¨à¤\88à¤\96à¥\80à¤\82 à¤ªà¥\8dरदान à¤\95à¤\88लà¥\87। à¤\85à¤\97र à¤°à¤\89à¤\86 \"फिर à¤¸à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रà¥\80à¤\82\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रà¥\87ब, à¤¤ à¤°à¤¾à¤\89र à¤¸à¤®à¥\8dपादन à¤¬à¤¿à¤¨à¤¾ à¤\8fà¤\97à¥\8b à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\8b जाई।",
-       "selfredirect": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\96à¥\81द à¤\95à¥\87 à¤\87 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤ªà¥\81नà¤\83 à¤¨à¤¿à¤°à¥\8dदà¥\87शित à¤\95र à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nà¤\86प à¤\85नà¥\81पà¥\8dरà¥\87षित à¤\96ातिर à¤\97लत à¤²à¤\95à¥\8dषà¥\8dय à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80, à¤¯à¤¾ à¤\86प à¤\95à¥\87 à¤¦à¥\8dवारा à¤\97लत à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾à¥¤\nà¤\86प à¤¯à¤¦à¤¿ à¤«à¥\87र à¤¸à¥\87 \"{{int:savearticle}}\" à¤\95à¥\8dलिà¤\95 à¤\95रत à¤¬à¤¾à¤¨à¥\80 à¤¤, à¤ªà¥\81न: à¤¨à¤¿à¤°à¥\8dदà¥\87षण à¤\93à¤\87सहà¥\81 à¤¬à¤¨à¤¾à¤µल जाई।",
-       "missingcommenttext": "à¤\95à¥\83पया à¤¨à¤¿à¤\9aà¥\87 à¤\8fà¤\97à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤\95रीं।",
+       "blankarticle": "<strong>चेतावनी:</strong> आप एगो खाली पन्ना बनावे जा रहल बानी।\nयदि आप \"{{int:savearticle}}\" के फेर से दबायेब त पन्ना बिना कउनो सामग्री के बन जाई।",
+       "anoneditwarning": "<strong>चेतावनी:</strong> रउआँ आपन खाता में प्रवेश नइखीं कइले। अगर रउआँ कौनों बदलाव करब त राउर आईपी पता सभके लउकी। अगर रउआ <strong>[$1 खाता में प्रवेश करब]</strong> या <strong>[$2 नया खाता बनाइब]</strong> त, अउरी सुबिधा सब की संघे राउर संपादन के श्रेय भी राउर प्रयोगकर्तानाँव के मिली!",
+       "anonpreviewwarning": "''रउआँ खाता में प्रवेश नइखीं भइल। सहेजब तब ए पन्ना के संपादन इतिहास में राउर आईपी पता दर्ज हो जाई।\"",
+       "missingsummary": "'''याद à¤¦à¤¿à¤¯à¤¾à¤µà¤² à¤\9cात à¤¬à¤¾:'''रà¤\89à¤\86à¤\81 à¤\8fà¤\97à¥\8b à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤\87à¤\96à¥\80à¤\82 à¤¦à¤¿à¤¹à¤²à¥\87। à¤\85à¤\97र à¤«à¤¿à¤° \"{{int:savearticle}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रब, à¤¤ à¤°à¤¾à¤\89र à¤¸à¤\82पादन à¤\8fà¤\95रà¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cा जाई।",
+       "selfredirect": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86प à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤\96à¥\81दà¥\87 à¤\8fहà¥\80 à¤ªà¤° à¤\85नà¥\81पà¥\8dरà¥\87षण à¤\95 à¤°à¤¹à¤² à¤¬à¤¾à¤¨à¥\80।\nया à¤¤ à¤\86प à¤\85नà¥\81पà¥\8dरà¥\87षण à¤\96ातिर à¤\97लत à¤²à¤\95à¥\8dषà¥\8dय à¤¦à¥\87त à¤¬à¤¾à¤¨à¥\80, à¤¯à¤¾ à¤\86प à¤\97लत à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\95रत à¤¬à¤¾à¤¨à¥\80।\nà¤\8fà¤\95 à¤¬à¥\87र à¤\85à¤\89रà¥\80 \"{{int:savearticle}}\" à¤\95à¥\8dलिà¤\95 à¤\95रब à¤¤, à¤\93à¤\87सहà¥\82à¤\81 à¤\88 à¤\85नà¥\81पà¥\8dरà¥\87षण à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹ल जाई।",
+       "missingcommenttext": "नà¥\80à¤\9aà¥\87 à¤\8fà¤\97à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤­रीं।",
        "missingcommentheader": "'''याद दियावल जात बा:''' रउआँ एह कमेंट खातिर कौनों बिसय नइखीं दिहले। अगर आप \"{{int:savearticle}}\" पर क्लिक करब तब राउर संपादन एकरे बिना सहेजा जाई।",
-       "summary-preview": "साराà¤\82श à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न:",
+       "summary-preview": "सà¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95 à¤\9dलà¤\95:",
        "subject-preview": "बिसय के झलक:",
-       "previewerrortext": "à¤\9cब à¤\86प à¤\86पन à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤ªà¥\81रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96à¥\87 à¤\96ातिर à¤ªà¥\8dरयास à¤\95à¤\87नà¥\80 à¤¹ à¤¤à¤µà¤¨à¥\87 à¤\98ड़à¥\80 à¤\8fà¤\97à¥\8b à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\89तà¥\8dपनà¥\8dन à¤¹à¥\8b à¤\97à¤\87ल à¤¬à¤¾।",
-       "blockedtitle": "निषà¥\8dà¤\95à¥\8dरिय à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता",
+       "previewerrortext": "राà¤\89र à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96ावà¥\87 à¤\95à¥\87 à¤\95à¥\8bसिस à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95à¥\81à¤\9b à¤\97ड़बड़à¥\80 à¤¹à¥\8b à¤\97à¤\87ल।",
+       "blockedtitle": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬ा",
        "blockedtext": "'''राउर सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिहल गईल बा ।'''\n\nअवरोध $1 द्वारा करल गईल रहल।\nअवरोध के कारण बा ''$2''\n\n* अवरोध के आरंभ: $8\n* अवरोध के समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइ अवरोध के बारे में चर्चा करे खातिर रउआ $1 या केहु अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकत बानी।\nअगर रउआ [[Special:Preferences|आपन वरीयता]] में वैद्य ई-मेल पता प्रविष्ट कइले होखब तबे 'इ प्रयोक्ता के ई-मेल भेजीं' वाला सुविधा के प्रयोग कर सकत बानी अउर रउआ एकर प्रयोग करे से ना रोकल गईल होखे।\nराउर हाल के आइ॰पी पता $3 ह अउर अवरोध क्रमांक #$5 ह।\nआपन कउनो भी प्रश्न में कृपया इ सब जानकारी भी शामिल करब।",
        "autoblockedtext": "राउर आइ॰पी पता अपने आप अवरुद्ध हो गईल बा काहे कि एकर प्रयोग केहु अन्य सदस्य द्वारा होत रहल,\nजे $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आपन कउनो भी प्रश्न में कृपया इ सब जानकारी शामिल करब।",
        "systemblockedtext": "राउर खाता या आइपी पता के मीडियाविकि द्वारा ऑटोमेटिक रूप से रोक दिहल गइल बा।\nएकरा खातिर कारण दिहल गइल बा:\n\n\n:<em>$2</em>\n\n* रोक के सुरुआत: $8\n* रोक समाप्त होखी: $6\n* रोक लगावे वाला: $7\n\nराउर वर्तमान आइपी पता $3 बा।\nअगर कौनों सवाल करीं तब ऊपर बतावल सगरी जानकारी देईं।",
        "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
        "mergehistory-done": " $1 के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
        "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
+       "mergehistory-autocomment": "[[:$1]] के [[:$2]] में विलय कइल गइल",
+       "mergehistory-comment": "[[:$1]] के [[:$2]] में विलय कइल गइल: $3",
+       "mergehistory-same-destination": "स्रोत आ लक्ष्य पन्ना एकही ना होखे सकत बा",
        "mergehistory-reason": "कारण:",
+       "mergelog": "विलय लॉग",
        "revertmerge": "अलग करीं",
        "mergelogpagetext": "एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भइले के एगो सूची नीचे दिहल बा।",
        "history-title": "''$1'' के संशोधन इतिहास",
        "difference-title": "\"$1\" की अवतरण में अंतर",
        "lineno": "लाइन $1:",
-       "compareselectedversions": "à¤\9aà¥\81नल à¤\97à¤\88ल à¤¸à¤\82शà¥\8bधन à¤®à¥\87à¤\82 à¤\85नà¥\8dतर देखीं",
-       "showhideselectedversions": "à¤\9aà¥\81नल à¤\97à¤\88ल à¤¸à¤\82शà¥\8bधन à¤¦à¤¿à¤\96ाà¤\88à¤\82/à¤\9bà¥\81पाà¤\88ं",
+       "compareselectedversions": "à¤\9aà¥\81नल à¤\97à¤\87ल à¤¸à¤\82शà¥\8bधन à¤®à¥\87à¤\82 à¤\85à¤\82तर देखीं",
+       "showhideselectedversions": "à¤\9aà¥\81नल à¤\97à¤\87ल à¤¸à¤\82शà¥\8bधन à¤\95à¥\87 à¤¦à¥\83शà¥\8dयता à¤¬à¤¦à¤²à¥\80ं",
        "editundo": "वापस लीं",
-       "diff-multi-sameuser": "(एही सदस्य द्वारा कइल {{PLURAL:$1|बीच के एगो बदलाव|$1 बीच के बदलाव सब}} नइखे देखावल जात)",
+       "diff-multi-sameuser": "(एही सदस्य द्वारा कइल {{PLURAL:$1|बीच के एगो बदलाव|बीच के $1 बदलाव}} नइखे देखावल जात)",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "$1 खातिर खोज परिणाम",
-       "titlematches": "पनà¥\8dना à¤\95à¥\87 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤®à¤¿à¤²à¤¤ à¤¬à¤¾à¥¤",
-       "textmatches": "पनà¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤ à¥\8dय à¤®à¤¿à¤²à¤¤ à¤¬à¤¾",
-       "notextmatches": "पनà¥\8dना à¤\95à¥\87 à¤ªà¤¾à¤ à¥\8dय à¤¨à¤\88à¤\96à¥\87 à¤®à¤¿à¤²à¤¤",
+       "titlematches": "पनà¥\8dना à¤\9fाà¤\87à¤\9fिल à¤®à¤¿à¤²à¤¾à¤¨",
+       "textmatches": "पनà¥\8dना à¤ªà¤¾à¤  à¤®à¤¿à¤²à¤¾à¤¨",
+       "notextmatches": "à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤¾à¤  à¤®à¤¿à¤²à¤¾à¤¨ à¤¨à¤\87à¤\96à¥\87",
        "prevn": "पछिला {{PLURAL:$1|$1}}",
        "nextn": "अगिला {{PLURAL:$1|$1}}",
        "prev-page": "पिछलका पन्ना",
        "next-page": "अगला पन्ना",
        "prevn-title": "पिछला $1 {{PLURAL:$1|परिणाम}}",
        "nextn-title": "अगिला $1 {{PLURAL:$1|परिणाम}}",
-       "shown-title": "à¤\8fà¤\95 à¤ªà¤¨à¥\8dना à¤ªà¤° $1 {{PLURAL:$1|परिणाम}} देखाईं",
+       "shown-title": "पà¥\8dरति à¤ªà¤¨à¥\8dना $1 {{PLURAL:$1|परिणाम}} देखाईं",
        "viewprevnext": "देखीं ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
        "searchmenu-new": "<strong> ए विकि पर \"[[:$1]]\" नाँव के पन्ना बनाईं !</strong> {{PLURAL:$2|0=|अपनी खोज से मिलल पन्ना भी देखीं|खोज के परिणाम भी देखीं।}}",
        "skin-preview": "पूर्वावलोकन",
        "datedefault": "वरीयता नईखे",
        "prefs-user-pages": "सदस्य पन्ना",
-       "prefs-personal": "सदसà¥\8dय à¤ªà¥\8dरà¥\8bफाà¤\88ल",
-       "prefs-rc": "तà¥\81रà¤\82त à¤­à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन",
+       "prefs-personal": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\8dरà¥\8bफाà¤\87ल",
+       "prefs-rc": "हाल à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ",
        "prefs-watchlist": "धियानसूची",
        "prefs-editwatchlist": "धियानसूची संपादन",
        "prefs-editwatchlist-label": "अपनी धियानसूची के चीज संपादित करीं:",
        "prefs-watchlist-edits": "बिस्तारित धियानसूची में देखावे खातिर अधिकतम बदलाव संख्या:",
        "prefs-watchlist-edits-max": "अधिकतम संख्या:1000",
        "prefs-watchlist-token": "धियानसूची टोकन:",
-       "prefs-misc": "à¤\85à¤\89रà¥\80 à¤\95à¥\81ल",
-       "prefs-resetpass": "पासवरà¥\8dड बदलीं",
+       "prefs-misc": "बिबिध",
+       "prefs-resetpass": "à¤\97à¥\81पà¥\8dतशबà¥\8dद बदलीं",
        "prefs-changeemail": "ईमेल पता बदलीं",
        "prefs-setemail": "ईमेल पता सेट करीं",
        "prefs-email": "ईमेल बिकल्प",
        "prefs-rendering": "रंगरूप",
-       "saveprefs": "सà¥\81रà¤\95à¥\8dषित à¤\95रीं",
+       "saveprefs": "सहà¥\87à¤\9cीं",
        "restoreprefs": "सगरी डिफाल्ट सेटिंग पहिले जइसन करीं (सगरी खंड में)",
        "prefs-editing": "संपादन",
        "searchresultshead": "खोज",
-       "stub-threshold-disabled": "निरसà¥\8dत",
+       "stub-threshold-disabled": "à¤\85à¤\95à¥\8dषम",
        "recentchangesdays": "हाल में भइल परिवर्तन में देखावे खातिर दिन:",
        "recentchangesdays-max": "अधिकतम $1{{PLURAL:$1|दिन}}",
        "recentchangescount": "डिफाल्ट में देखावे खातिर संपादन संख्या:",
        "prefs-reset-intro": "रउआँ आपन पसंद बदल के डिफाल्ट करे खातिर ए पन्ना के इस्तेमाल नइखीं कर सकत।\n\nई फिर से वापस ना हो पाई।",
        "prefs-emailconfirm-label": "ईमेल जाँच:",
        "youremail": "ईमेल:",
+       "username": "{{GENDER:$1|प्रयोगकर्तानाँव}}:",
        "prefs-registration": "रजिस्ट्रेशन के समय:",
        "yourrealname": "असली नाम",
        "yourlanguage": "भाषा:",
        "listusers-desc": "घटत क्रम से सरियाईं",
        "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादन सभ}}",
        "newpages": "नया पन्ना",
-       "newpages-username": "सदसà¥\8dयनाँव:",
+       "newpages-username": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतानाँव:",
        "ancientpages": "पुरान पन्ना",
        "move": "स्थानांतरण",
        "movethispage": "एह पन्ना के स्थानांतरण करीं",
        "trackingcategories-msg": "निगरानी श्रेणी",
        "trackingcategories-name": "संदेस नाँव",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
+       "emailusername": "प्रयोगकर्तानाँव:",
        "watchlist": "धियानसूची",
        "mywatchlist": "धियानसूची",
        "watch": "धियानसूची में डालीं",
index 79558c1..85b582e 100644 (file)
        "emailnotauthenticated": "আপনার ই-মেইলের ঠিকানা এখনও যাচাই করা হয়নি।\nনিচের বৈশিষ্ট্যগুলোর (features) জন্য কোনো ই-মেইল পাঠানো হবে না।",
        "noemailprefs": "এই বৈশিষ্টটি কাজ করাতে হলে একটি ই-মেইল ঠিকানা নির্ধারণ করতে হবে।",
        "emailconfirmlink": "আপনার ই-মেইলের ঠিকানা নিশ্চিত করুন",
-       "invalidemailaddress": "এই ই-মেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক ফরম্যাটে লেখা হয়নি। অনুগ্রহ করে সঠিক ফরম্যাটে লেখা ই-মেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।",
+       "invalidemailaddress": "এই ইমেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক বিন্যাসে লেখা হয়নি। অনুগ্রহ করে সঠিক বিন্যাসে লেখা ইমেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।",
        "cannotchangeemail": "একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।",
        "emaildisabled": "এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।",
        "accountcreated": "অ্যাকাউন্ট তৈরি করা হয়েছে",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
        "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
-       "summary-preview": "সারাà¦\82শ প্রাকদর্শন:",
-       "subject-preview": "বিষয় প্রাকদর্শন:",
+       "summary-preview": "সমà§\8dপাদনা à¦¸à¦¾à¦°à¦¾à¦\82শà§\87র প্রাকদর্শন:",
+       "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দয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "search-interwiki-caption": "সহপ্রকল্পসমূহ",
        "search-interwiki-default": "$1 থেকে ফলাফলসমূহ:",
        "search-interwiki-more": "(আরও)",
+       "search-interwiki-more-results": "আরও ফলাফল",
        "search-relatedarticle": "সম্পর্কিত",
        "searchrelated": "সম্পর্কিত",
        "searchall": "সমস্ত",
        "youremail": "ইমেইল *",
        "username": "{{GENDER:$1|ব্যবহারকারী নাম}}:",
        "prefs-memberingroups": "{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদস্য}}:",
+       "group-membership-link-with-expiry": "$1 ($2 পর্যন্ত)",
        "prefs-registration": "নিবন্ধনের সময়:",
        "yourrealname": "আসল নাম *",
        "yourlanguage": "ভাষা:",
        "editusergroup": "ব্যবহারকারী দল লোড করুন",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার পরিবর্তন করছেন",
        "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|ব্যবহারকারীর}} ব্যবহারকারী অধিকার দেখছেন",
-       "userrights-editusergroup": "ব্যবহারকারীর দল সম্পাদনা করো",
-       "userrights-viewusergroup": "ব্যবহারকারী দল দেখা",
+       "userrights-editusergroup": "{{GENDER:$1|ব্যবহারকারী}} দল সম্পাদনা করে",
+       "userrights-viewusergroup": "{{GENDER:$1|ব্যবহারকারী}} দল দেখা",
        "saveusergroups": "{{GENDER:$1|ব্যবহারকারীর}} দল সংরক্ষণ করো",
        "userrights-groupsmember": "সদস্য:",
        "userrights-groupsmember-auto": "শর্তহীন সদস্য",
-       "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 à¦\8fà¦\96ন à¦\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রতে পারবেন না।",
+       "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র à¦®à§\87য়াদ à¦¶à§\87ষ à¦¹à¦\93য়ার à¦¸à¦®à¦¯à¦¼ à¦ªà¦¿à¦\9bনà§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à¦¬à§\87ন; à¦\95িনà§\8dতà§\81 à¦¸à¦¾à¦®à¦¨à§\87 à¦¨à¦¿তে পারবেন না।",
        "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-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-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
        "group": "দল:",
        "group-user": "ব্যবহারকারীগণ",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "recentchanges-submit": "দেখাও",
        "rcfilters-activefilters": "সক্রিয় ফিল্টার",
-       "rcfilters-restore-default-filters": "ডিফলà§\8dà¦\9f à¦«à¦¿à¦²à§\8dà¦\9fার à¦ªà§\81নরà§\81দà§\8dধার",
+       "rcfilters-restore-default-filters": "পà§\82রà§\8dবনিরà§\8dধারিত à¦\9bাà¦\81à¦\95নি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\81ন",
        "rcfilters-clear-all-filters": "সমস্ত ফিল্টার অপসারণ",
-       "rcfilters-search-placeholder": "ফিলà§\8dà¦\9fারà§\87 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ (ব্রাউজ বা টাইপ করা শুরু করুন)",
+       "rcfilters-search-placeholder": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦\9bাà¦\81à¦\95à§\81ন (ব্রাউজ বা টাইপ করা শুরু করুন)",
        "rcfilters-invalid-filter": "অকার্যকর ফিল্টার",
        "rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
-       "rcfilters-filterlist-title": "ছাকনী",
+       "rcfilters-filterlist-title": "ছাঁকনি",
+       "rcfilters-highlightbutton-title": "ফলাফল আলোকপাত করুন",
+       "rcfilters-highlightmenu-title": "একটি রং নির্বাচন করুন",
        "rcfilters-filterlist-noresults": "কোনও ফিল্টার পাওয়া যায়নি",
-       "rcfilters-filtergroup-registration": "বà§\8dযবহারà¦\95ারà§\80 à¦°à§\87à¦\9cিসà§\8dà¦\9fà§\8dরà§\87শন",
+       "rcfilters-filtergroup-registration": "বà§\8dযবহারà¦\95ারà§\80 à¦¨à¦¿à¦¬à¦¨à§\8dধন",
        "rcfilters-filter-registered-label": "নিবন্ধিত",
-       "rcfilters-filter-registered-description": "লà¦\97-à¦\87ন সম্পাদকবৃন্দ।",
+       "rcfilters-filter-registered-description": "পà§\8dরবà§\87শà¦\95à§\83ত সম্পাদকবৃন্দ।",
        "rcfilters-filter-unregistered-label": "অনিবন্ধিত",
+       "rcfilters-filter-unregistered-description": "সম্পাদক যারা প্রবেশ করেন নি।",
        "rcfilters-filtergroup-authorship": "কৃতি সম্পাদনা",
        "rcfilters-filter-editsbyself-label": "আপনার নিজস্ব সম্পাদনা",
        "rcfilters-filter-editsbyself-description": "আপনার দ্বারা সম্পাদনা।",
        "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-experienced-label": "অভিজ্ঞ ব্যবহারকারী",
+       "rcfilters-filter-userExpLevel-experienced-description": "৩০ দিনের বেশী কার্যকলাপ ও ৫০০টি সম্পাদনা।",
+       "rcfilters-filtergroup-automated": "স্বয়ংক্রিয় অবদান",
        "rcfilters-filter-bots-label": "বট",
+       "rcfilters-filter-bots-description": "স্বয়ংক্রিয় সরঞ্জাম দিয়ে করা সম্পাদনা।",
+       "rcfilters-filter-humans-label": "মানুষ (বট নয়)",
+       "rcfilters-filter-humans-description": "মানব সম্পাদক দ্বারা করা সম্পাদনা।",
+       "rcfilters-filtergroup-significance": "তাৎপর্য",
+       "rcfilters-filter-minor-label": "অনুল্লেখ্য সম্পাদনা",
+       "rcfilters-filter-major-label": "অ-অনুল্লেখ্য সম্পাদনা",
+       "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-logactions-label": "প্রবেশকৃত কার্য",
+       "rcfilters-filter-logactions-description": "প্রশাসনিক কর্ম, অ্যাকাউন্ট সৃষ্টিকরণ, পাতা অপসারণ, আপলোড....",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
        "uploaded-href-unsafe-target-svg": "অনিরাপদ উপাত্তে href পাওয়া গেছে: আপলোডকৃত SVG ফাইলে URI লক্ষ্য ছিল <code>&lt;$1 $2=\"$3\"&gt;</code>।",
        "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
-       "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
+       "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"<nowiki>$1</nowiki>\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "uploadvirus": "এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1",
        "uploadjava": "এটি একটি ZIP ফরম্যাটের ফাইল, যেখানে একটি জাভা .class ফরম্যাটের ফাইল রয়েছে।\nজাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।",
        "apisandbox-results": "ফলাফল",
        "apisandbox-sending-request": "API অনুরোধ পাঠানো হচ্ছে...",
        "apisandbox-loading-results": "API ফলাফল গ্রহণ করা হচ্ছে...",
-       "apisandbox-request-selectformat-label": "অনুরোধ ডেটা দেখান যেভাবে:",
+       "apisandbox-results-error": "এপিআই কুয়েরির প্রতিক্রিয়া লোড করার সময় একটি ত্রুটি ঘটেছে: $1।",
+       "apisandbox-request-selectformat-label": "অনুরোধ উপাত্ত এভাবে দেখান:",
        "apisandbox-request-format-url-label": "URL কোয়েরি স্ট্রিং",
        "apisandbox-request-url-label": "অনুরোধের URL:",
-       "apisandbox-request-json-label": "অনুরোধ JSON:",
+       "apisandbox-request-json-label": "JSON অনুরোধ:",
        "apisandbox-request-time": "অনুরোধের সময়: {{PLURAL:$1|$1 মি.সে.}}",
        "apisandbox-results-fixtoken": "টোকেন সংশোধন ও পুনরায় জমা",
+       "apisandbox-results-fixtoken-fail": "\"$1\" টোকেন আনতে ব্যর্থ হয়েছে।",
        "apisandbox-alert-page": "এই পাতার ঘরগুলো বৈধ নয়।",
        "apisandbox-alert-field": "এই ক্ষেত্রের মান বৈধ নয়।",
        "apisandbox-continue": "অব্যাহত",
        "editcomment": "সম্পাদনা সারাংশ ছিল: \"''$1''\"।",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]]) এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]] এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে।",
        "revertpage-nouser": "একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে।",
-       "rollback-success": "$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
+       "rollback-success": "{{GENDER:$3|$1}}-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; {{GENDER:$4|$2}}-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
        "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
        "undeletehistorynoadmin": "এই পাতাটি মুছে ফেলা হয়েছে। মুছে ফেলার কারণ নিচের সারাংশে দেখানো হল। সেই সাথে মুছে ফেলার আগে যেসমস্ত ব্যবহারকারী পাতাটি সম্পাদনা করেছেন, তাদের সম্পর্কেও বিস্তারিত দেখানো হল। এই মুছে ফেলা সংশোধনগুলির বিষয়বস্তু  কেবল প্রশাসকদের কাছে লভ্য।",
        "undelete-revision": "$3-এর করা $1 সংশোধন ($4 তারিখে, $5 সময়ের) মুছে ফেলা হয়েছে:",
        "undeleterevision-missing": "সংশোধনটি অবৈধ কিংবা হারানো গেছে। আপনি হয়ত অচল সংযোগে ক্লিক করেছেন, কিংবা সংশোধনটি হয়ত বাতিল করে পাতাটি পূর্বাবস্থায় নেওয়া হয়েছে, অথবা সংশোধনটি আর্কাইভ থেকে মুছে ফেলা হয়েছে।",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|একটি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা যাবে না, কারণ {{PLURAL:$1|এটির|এগুলির}} <code>rev_id</code> ইতিমধ্যেই ব্যবহৃত হয়েছে।",
        "undelete-nodiff": "পূর্বের কোন সংশোধন খুঁজে পাওয়া যায়নি।",
        "undeletebtn": "পুনরুদ্ধার",
        "undeletelink": "দেখুন/পুনর্বহাল করুন",
        "proxyblockreason": "আপনার আইপি ঠিকানাকে বাধা দেয়া হয়েছে কারণ এটি একটি উন্মুক্ত প্রক্সি। অনুগ্রহ করে আপনার ইন্টারনেট সেবা প্রদানকারী কোম্পানির সাথে কারিগরি সহায়তার ব্যাপারে যোগাযোগ করুন এবং এই গুরুত্বপূর্ণ নিরাপত্তা সমস্যার ব্যাপারে তাদেরকে অবহিত করুন।",
        "sorbsreason": "আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে।",
        "sorbs_create_account_reason": "আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে। আপনি কোন অ্যাকাউন্ট সৃষ্টি করতে পারবেন না।",
+       "softblockrangesreason": "বেনামী অবদান আপনার আইপি ঠিকানা থেকে অনুমোদিত নয় ($1)। দয়া করে প্রবেশ করুন।",
        "xffblockreason": "X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1",
        "cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।",
        "ipbblocked": "আপনি অন্য কোন ব্যবহারকরীকে ব্লক বা আনব্লক করতে পারবেন না, কারণ আপনি নিজেই ব্লক রয়েছেন",
        "cant-move-category-page": "আপনার বিষয়শ্রেণী পাতা স্থানান্তরের অনুমতি নেই।",
        "cant-move-to-category-page": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
        "cant-move-subpages": "আপনার উপপাতা স্থানান্তরের অনুমতি নেই।",
+       "namespace-nosubpages": "\"$1\" নামস্থান উপপাতার অনুমতি দেয় না।",
        "newtitle": "নতুন শিরোনাম:",
        "move-watch": "এই পাতাটি নজরে রাখুন",
        "movepagebtn": "পাতা স্থানান্তর করুন",
        "movelogpagetext": "সরানো পাতাগুলির একটি তালিকা নিচে দেয়া হল।",
        "movesubpage": "{{PLURAL:$1|উপপাতা|উপপাতাসমূহ}}",
        "movesubpagetext": "এই পাতার $1টি {{PLURAL:$1|উপপাতা}} রয়েছে যেগুলো নিচে দেখানো হচ্ছে।",
+       "movesubpagetalktext": "সংশ্লিষ্ট আলাপ পাতার $1টি {{PLURAL:$1|উপপাতা}} রয়েছে যেগুলো নিচে দেখানো হচ্ছে।",
        "movenosubpage": "এই পাতাটির কোনো উপপাতা নেই।",
        "movereason": "কারণ:",
        "revertmove": "পূর্বাবস্থায় ফেরত নেওয়া হোক",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
        "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
+       "tags-delete-too-many-uses": "\"$1\" ট্যাগটি $2টিরও অধিক {{PLURAL:$2|সংশোধনে}} প্রয়োগ করা হয়েছে, যার অর্থ এটি অপসারণ করা যাবে না।",
        "tags-delete-no-permission": "আপনার পরিবর্তন ট্যাগ মুছে ফেলার অনুমতি নেই।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-question": "আপনি ট্যাগ \"$1\" সক্রিয় করতে চলেছেন।",
        "tags-deactivate-reason": "কারণ:",
        "tags-deactivate-not-allowed": "ট্যাগ \"$1\" নিষ্ক্রিয় করা সম্ভব নয়।",
        "tags-deactivate-submit": "নিষ্ক্রিয়",
+       "tags-apply-no-permission": "আপনার পরিবর্তনসহ আপনার ট্যাগ পরিবর্তন প্রয়োগ করার অনুমতি নেই।",
+       "tags-apply-not-allowed-one": "\"$1\" ট্যাগটি ম্যানুয়ালি প্রয়োগ করা যাবে না।",
+       "tags-apply-not-allowed-multi": "নিন্মলিখিত {{PLURAL:$2|ট্যাগটি|ট্যাগগুলি}} ম্যানুয়ালি প্রয়োগ করা যাবে না: $1",
+       "tags-update-no-permission": "স্বতন্ত্র সংশোধন বা লগের ভুক্তি থেকে আপনার ট্যাগ পরিবর্তন যোগ বা বাতিল করার অনুমতি নেই।",
+       "tags-update-add-not-allowed-one": "\"$1\" ট্যাগটি ম্যানুয়ালি যোগ করা যাবে না।",
+       "tags-update-add-not-allowed-multi": "নিন্মলিখিত {{PLURAL:$2|ট্যাগটি|ট্যাগগুলি}} ম্যানুয়ালি যোগ করা যাবে না: $1",
+       "tags-update-remove-not-allowed-one": "\"$1\" ট্যাগটি বাতিল করা যাবে না।",
+       "tags-update-remove-not-allowed-multi": "নিন্মলিখিত {{PLURAL:$2|ট্যাগটি|ট্যাগগুলি}} ম্যানুয়ালি বাতিল করা যাবে না: $1",
        "tags-edit-title": "ট্যাগ সম্পাদনা করুন",
        "tags-edit-manage-link": "ট্যাগ পরিচালনা করুন",
        "tags-edit-revision-selected": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
+       "tags-edit-logentry-legend": "{{PLURAL:$1|এই লগের ভুক্তি|$1টি লগের ভুক্তি}} থেকে ট্যাগ যোগ বা বাতিল করুন",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
        "tags-edit-existing-tags-none": "<em>কোনটি নয়</em>",
        "tags-edit-new-tags": "নতুন ট্যাগ:",
        "tags-edit-chosen-placeholder": "কিছু ট্যাগ নির্বাচন করুন",
        "tags-edit-chosen-no-results": "কোন ট্যাগ মিল পাওয়া যায়নি",
        "tags-edit-reason": "কারণ:",
-       "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|এই সংশোধনে|$1 সংশোধনসমূহে}} পরিবর্তন প্রয়োগ করুন",
+       "tags-edit-revision-submit": "{{PLURAL:$1|এই সংশোধনে|$1টি সংশোধনে}} পরিবর্তন প্রয়োগ করুন",
+       "tags-edit-logentry-submit": "{{PLURAL:$1|এই লগের ভুক্তিতে|$1টি লগের ভুক্তিতে}} পরিবর্তন প্রয়োগ করুন",
        "tags-edit-success": "পরিবর্তন প্রয়োগ করা হয়েছে।",
        "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1",
        "tags-edit-nooldid-title": "লক্ষ্য সংশোধন অবৈধ",
        "htmlform-date-placeholder": "বববব-মম-দদ",
        "htmlform-time-placeholder": "ঘঘ:মম:সস",
        "htmlform-datetime-placeholder": "বববব-মম-দদ ঘঘ:মম:সস",
+       "htmlform-date-invalid": "প্রদানকৃত মানটি স্বীকৃত তারিখ নয়। বববব-মম-দদ বিন্যাস ব্যবহার করে চেষ্টা করুন।",
+       "htmlform-time-invalid": "প্রদানকৃত মানটি স্বীকৃত সময় নয়। ঘঘ:মম:সস বিন্যাস ব্যবহার করে চেষ্টা করুন।",
+       "htmlform-datetime-invalid": "প্রদানকৃত মানটি স্বীকৃত তারিখ ও সময় নয়। বববব-মম-দদ ঘঘ:মম:সস বিন্যাস ব্যবহার করে চেষ্টা করুন।",
+       "htmlform-date-toolow": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ $1-এর অনেক আগের।",
+       "htmlform-date-toohigh": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ $1-এর অনেক পরের।",
+       "htmlform-time-toolow": "আপনার প্রদানকৃত মানটি অনুমোদিত সময় $1-এর অনেক আগের।",
+       "htmlform-time-toohigh": "আপনার প্রদানকৃত মানটি অনুমোদিত সময় $1-এর অনেক পরের।",
+       "htmlform-datetime-toolow": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ ও সময় $1-এর অনেক আগের।",
+       "htmlform-datetime-toohigh": "আপনার প্রদানকৃত মানটি অনুমোদিত তারিখ ও সময় $1-এর অনেক পরের।",
        "htmlform-title-badnamespace": "[[:$1]] \"{{ns:$2}}\" নামস্থানে খুঁজে পাওয়া যায়নি।",
        "htmlform-title-not-creatable": "\"$1\" সৃষ্টিযোগ্য পাতার শিরোনাম নয়",
        "htmlform-title-not-exists": "$1-এর অস্তিত্ব নেই।",
        "logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
-       "logentry-managetags-create": "$1 \"$4\" ট্যাগ {{GENDER:$2|তৈরি করেছে}}",
+       "logentry-managetags-create": "$1 \"$4\" ট্যাগটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-managetags-delete": "$1 \"$4\" ট্যাগটি {{GENDER:$2|অপসারণ করেছেন}} ($5টি {{PLURAL:$5|সংস্করণ বা লগ ভুক্তি|সংস্করণ ও/বা লগ ভুক্তি}} সরানো হয়েছে)",
+       "logentry-managetags-deactivate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|নিষ্ক্রিয়}} করেছেন",
        "log-name-tag": "ট্যাগ লগ",
        "rightsnone": "(কিছু নাই)",
        "revdelete-summary": "সম্পাদনা সারাংশ",
+       "rightslogentry-temporary-group": "$1 (সাময়িক, $2 পর্যন্ত)",
        "feedback-adding": "পাতায় প্রতিক্রিয়া যোগ হচ্ছে...",
        "feedback-back": "পিছনে",
        "feedback-bugcheck": "উত্তম! যাচাই করুন যে এই [$1  জানা বাগের] কোন একটি কিনা।",
        "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|মিনিট|মিনিট}}",
        "expand_templates_generate_xml": "XML পার্স বৃক্ষ দেখাও",
        "expand_templates_generate_rawhtml": "এইচটিএমএল দেখাও",
        "expand_templates_preview": "প্রাকদর্শন",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে ও সেশন উপাত্ত হারিয়ে গিয়েছে, জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি লুকায়িত আছে।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি অনুমতি দেয়।",
+       "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে ও আপনি প্রবেশ করেন নি, জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি লুকায়িত আছে।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে  [[Special:UserLogin|প্রবেশ করুন]] ও আবার চেষ্টা করুন।</strong>",
        "expand_templates_input_missing": "আপনাকে অন্তত কিছু ইনপুট লেখা প্রদান করতে হবে।",
        "pagelanguage": "পাতার ভাষা পরিবর্তন করুন",
        "pagelang-name": "পাতা",
        "pagelang-select-lang": "ভাষা নির্বাচন করুন",
        "pagelang-reason": "কারণ",
        "pagelang-submit": "জমা দাও",
+       "pagelang-nonexistent-page": "$1 শিরোনামে কোন পাতা নেই।",
        "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": "আরও যোগ করুন...",
        "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1।",
        "sessionprovider-generic": "$1টি সেশন",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
-       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে, <pre>0.0.0.0/0::/0</pre> ব্যবহার করুন",
+       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "সংশোধন $1",
        "pageid": "পাতার আইডি $1"
 }
index e4c0ae1..7b6c458 100644 (file)
        "create-local": "یأ توزی ڤولات نشيني إزافإ کونين",
        "editthispage": "اصلاح ای صفحه",
        "delete": "حذف",
+       "deletethispage": "اي بلگأ نأ پاکسا کونين",
+       "undeletethispage": "اي بلگأ نأ پاکسا نکونين",
        "protect": "حفاظت وحمایت",
        "protect_change": "آلإشت کونين",
+       "protectthispage": "ز اي بلگأ هامينداري کونين",
        "newpage": "صفحه تازه",
        "talkpage": "بحث ای صفحه",
        "talkpagelinktext": "چأک چئنە",
        "red-link-title": "$1 (چونو بألگئ یی نیدٙئس)",
        "nstab-main": "بلگه",
        "nstab-user": "صفحه کاربر",
+       "nstab-media": "بلگأ ڤارسگأري",
        "nstab-special": "بألگه ڤیجه",
        "nstab-project": "صفحه پروژه",
        "nstab-image": "فایل",
        "mainpage-nstab": "سأرآسوٙنە",
        "error": "خطا",
        "databaseerror-query": "جوستکاری: $1",
+       "databaseerror-error": "خطا: $1",
+       "internalerror": "خطا مإنجقایي",
        "badtitle": "عنوان بد",
        "badtitletext": "عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرسته\nو ممکنه دارای یک یا چند کاراکتر بوه که در عنوان مربوط نوا زش استفاده کنین",
        "viewsource": "مشاهده منبع",
        "viewsourcetext": "ایسا ترین بوینین وکپی کنین منبع ای صفحه را:",
+       "welcomeuser": "خۈش أڤوڌين،$1!",
        "yourname": "نام کاربر:",
        "userlogin-yourname": "نوم کارياري",
        "userlogin-yourname-ph": "نوم کاریاريتونأ بزنين",
        "createacct-yourpasswordagain": "پشت راسدکاري رازينإ گوڤأرتن",
        "createacct-yourpasswordagain-ph": "ز نۉ رازينإ گوڤأرتن نأ بزأ",
        "userlogin-remembermypassword": "مۈنإ مإن سامۈنإ ڤاڌار",
+       "yourdomainname": "پوشگر ايسا:",
        "login": "اویدن به سیستم",
        "nav-login-createaccount": "اویدن به سیستم",
        "userlogin": "اویدن به سیستم / درست کردن حساب کاربری",
        "gotaccountlink": "اویدن به",
        "userlogin-resetpassword-link": "رازینإ گوڤأرتن تۈ ز ڤيرتۈن رأهڌإ",
        "userlogin-helplink2": "هومياري کردن سي ڤامإن أڤوڌن",
+       "createacct-emailrequired": "تيرنشۈن أنجومانامأ",
        "createacct-emailoptional": "تيرنشۈن أنجومانامأ",
        "createacct-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
+       "createacct-another-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
+       "createaccountreason": "دلیل:",
+       "createacct-reason": "دلیل",
        "createacct-submit": "هساڤ خوتۈنإ راسد کونين",
+       "createacct-another-submit": "راسد کردن هساڤ کارياري",
        "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
        "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
        "createacct-benefit-body3": "تازأ{{PLURAL:$1|هوميار|هوميارا}}",
        "noemail": "وجود نداره نشانی امیل ضبط وابده زه کاریر \"$1\".",
        "passwordsent": "یه رمز تازه ارسال وابید به نشانی امیل ثبت وابده سی \"$1\".\nلطفا بعد از دریافت آن داخل سیستم بوین.",
        "eauthentsent": "یه ایمیل سی تایید آدرس ایمیل به آدرس مورنظر ارسال وابید. قبل زه یو که ایمیل دیگری قابل ارسال به این آدرس بوه، وا دستورهایی که در آن ایمیل اویده را جهت تأیید ای مساله که ای آدرس مال ایسانه اجرا کنین.",
+       "emaildisabled": "اي ديارگأ نترإ إنجومانامإ سيتۈن بفرشنإ",
+       "accountcreated": "هساڤ راسد ڤابي",
+       "createaccount-title": "هساڤ سي {{SITENAME}} راسد ڤابي",
        "loginlanguagelabel": "زۈن:$1",
        "pt-login": "ڤامین اوڤیڌن",
        "pt-login-button": "ڤامین اوڤیڌن",
        "pt-createaccount": "راسد کردن هساڤ کارياري",
        "pt-userlogout": "ز سامۈنإ درأڤوڌن",
+       "changepassword": "آلشد کردن رازينإ گوڤأرتن",
+       "oldpassword": "رازينإ گوڤأرتن ديندایي:",
+       "newpassword": "رازينإ گوڤأرتن تازأ:",
        "retypenew": "تایپ دوباره رمز:",
+       "botpasswords": "رازينإیل گوڤأرتن بوتا",
+       "botpasswords-label-appid": "نوم بوت:",
        "botpasswords-label-create": "راس كردن",
+       "botpasswords-label-update": "ب هنگوم سازی",
        "botpasswords-label-cancel": "أنجومشيڤ کردن",
        "botpasswords-label-delete": "پاکسا کردن",
        "botpasswords-label-resetpassword": "ز نۉ داڌن رازينإ گوأرتن",
+       "botpasswords-label-grants-column": "داڌإ ڤابي",
+       "resetpass-submit-loggedin": "آلشد کردن رازينإ گوڤأرتن",
        "resetpass-submit-cancel": "أنجومشيڤ کردن",
        "passwordreset": "ز نۉ داڌن رازينإ گوأرتن",
        "passwordreset-username": "نوم کارياري",
        "passwordreset-domain": "پوشگر",
        "passwordreset-email": "تيرنشۈن أنجومانامأ",
+       "passwordreset-emailtitle": "جوزيات هساڤ مإن{{SITENAME}}",
+       "passwordreset-invalidemail": "تيرنشۈن أنجومانامأ نادوروسد",
+       "changeemail-oldemail": "تيرنشۈن أنجومانامإ ايسني",
+       "changeemail-newemail": "تيرنشۈن أنجومانامإ تازأ:",
        "changeemail-none": "(هيش كوم)",
+       "changeemail-password": "رازينإ گوڤأرتن {{SITENAME}} ایسا:",
+       "changeemail-submit": "آلشد کردن أنجومانامأ",
+       "resettokens": "ز نۉ کردن نشۈنإیل",
+       "resettokens-tokens": "نشۈنإیل:",
+       "resettokens-token-label": "$1 (أرزایشت تازأ: $2)",
        "bold_sample": "متن گپ نما",
        "bold_tip": "متن گپ نما",
        "italic_sample": "متن شکسته",
        "anoneditwarning": "'''توجه:''' ایسا داخل سیستم نوابیدین.\nآی پی آدرستو درگزارش اصلاح صفحه ضبط ابوه.",
        "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": "ڤامإن إڤوڌن لازومإ",
        "loginreqlink": "ڤامین اوڤیڌن",
+       "accmailtitle": "رازينإ گوڤأرتن فرشناڌإ ڤابيڌإ",
        "newarticle": "(تازه)",
        "newarticletext": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
        "noarticletext": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
        "editing": "درحال اصلاح $1",
        "creating": "راسد کردن $1",
        "editingsection": "درحال اصلاح $1 (قسمت)",
+       "yourtext": "متن ايسا",
        "copyrightwarning": "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).\n\n\n(سی دیدن  جزئیات بیشتر به $1 برین\n\nایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه و به دلخواه ارسال بوه، ایچو نفرستن.<br />\nدرضمن ایسادارین به ایما قول ادین که خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق کپی رایت را بی‌اجازه نفرستین!'''',",
        "templatesused": "{{PLURAL:$1|چوٙأ|چوٙأیل}} ب کار گرهڌأ ڤابيڌإ مإن اي بألگأ:",
        "templatesusedpreview": "قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:",
        "template-protected": "(تحت حمایت)",
        "template-semiprotected": "(نیمه حمایت وابیده)",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
+       "permissionserrorstext-withaction": "ايسا سی نياگري $2 سإلا\nنارين {{PLURAL:$1|دلیل|دليلا}}:",
        "recreate-moveddeleted-warn": "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
        "content-model-wikitext": "ڤيکي تکست",
        "content-model-javascript": "جاڤا إسکريپت",
        "rev-delundel": "آلشد هال و بال ديإن",
        "rev-showdeleted": "دياري کردن",
        "revdelete-show-file-submit": "هأرإ",
+       "revdelete-log": "دلیل:",
+       "mergehistory-from": "بألگإ سرچشمأ:",
+       "mergehistory-reason": "دلیل:",
        "history-title": "دڤارتإ دیئن ڤيرگار $1",
        "difference-title": "فرخ مإنجقا ڤانإیريا \"$1\"",
        "lineno": "سطر $1:",
        "search-redirect": "(ڤاگردۈني ز $1)",
        "search-section": "(بهرجا $1)",
        "search-suggest": "منزۈرت یو بي:$1",
+       "search-interwiki-more": "(بيشدر)",
        "searchall": "همه",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
+       "powersearch-toggleall": "همأ",
+       "powersearch-togglenone": "هيش کوم",
        "preferences": "اولویتها",
        "mypreferences": "خوصوٙیات هأنی",
+       "prefs-skin": "پۈسدأ",
+       "skin-preview": "پيش سإیل",
+       "prefs-watchlist": "سإیل برگ",
+       "prefs-editwatchlist": "ڤيرایشد سإیل برگ",
+       "prefs-misc": "شيڤسدن",
+       "prefs-resetpass": "آلشد کردن رازينإ گوڤأرتن",
+       "saveprefs": "إمایإ کردن",
+       "searchresultshead": "پی جۈري",
+       "stub-threshold-sample-link": "نمۈنأ",
+       "timezoneregion-africa": "إفرقا",
+       "timezoneregion-america": "إمرکا",
+       "timezoneregion-asia": "آسيا",
        "yourrealname": "نام واقعی:",
        "prefs-help-realname": "ذکر نام واقعی اختیاریه ایر تصمیم به گدن بگیرین هنگام ارجاع به آثارتو و انتساب هونو به ایسا زه نام واقعیتو استفاده ابوه",
        "grouppage-sysop": "{{ns:project}}:مدیران",
        "exif-software": "نرم افزار ب کارگرهڌني",
        "exif-exifversion": "نوسقإ Exif",
        "exif-colorspace": "رنگ ڤأرگأ",
+       "exif-datetimeoriginal": "گات و ڤخت راسد ڤابيإن دۈنسمنديا",
        "exif-datetimedigitized": "گات و وخت دیجیتالی کردن",
        "exif-orientation-1": "عادي",
        "namespacesall": "همه",
index cefa4a6..a47a9e4 100644 (file)
@@ -43,7 +43,7 @@
        "tog-previewonfirst": "Rakwelet tres ar bajenn kerkent hag an aozadenn gentañ",
        "tog-enotifwatchlistpages": "Kas ur postel din pa vez kemmet ur bajenn zo war ma roll evezhiañ",
        "tog-enotifusertalkpages": "Kas ur postel din pa vez kemmet ma fajenn gaozeal",
-       "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister",
+       "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister war pajennoù pe restroù",
        "tog-enotifrevealaddr": "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
        "tog-shownumberswatching": "Diskouez an niver a lennerien",
        "tog-oldsig": "Ho sinadur evit poent :",
        "tagline": "Eus {{SITENAME}}",
        "help": "Skoazell",
        "search": "Klask",
+       "search-ignored-headings": " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>\n# Titloù a vo lezet a-gostez gant ar c'hlask.\n# Ar c'hemmoù graet amañ a vo lakaet e pleustr kerkent ha menegeret ar bajenn gant an titl.\n# Gallout a rit forsiñ un advenegeriñ ma rit ur c'hemm goullo en ur bajenn.\n# Setu penaos emañ an ereadur :\n#   * Kement linenn zo, adalek an arouezenn \"#\" betek dibenn al linenn a zo un evezhiadenn.\n#   * Kement linenn ha n'eo ket goullo a verk an titl rik a zo da vezañ lezet a-gostez, pennlizherennoù hag all.\nDaveennoù\nLiammoù diavaez\nGwelet ivez\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
        "searchbutton": "Klask",
        "go": "Kas",
        "searcharticle": "Mont",
        "ok": "Mat eo",
        "retrievedfrom": "Adtapet diwar « $1 »",
        "youhavenewmessages": "$1 zo ganeoc'h ($2).",
-       "youhavenewmessagesfromusers": "$1 ho peus eus {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Bez' hoc'h eus}} $1 a-berzh {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
        "youhavenewmessagesmanyusers": " $1 ho peus implijerien a-leizh  ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|ur gemennad nevez|999=kemennadoù nevez}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|kemennad diwezhañ|999=kemennadoù diwezhañ}}",
-       "youhavenewmessagesmulti": "Kemennoù nevez zo ganeoc'h war $1",
+       "newmessageslinkplural": "{{PLURAL:$1|ur gemennadenn nevez|999=kemennadennoù nevez}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|kemm diwezhañ|999=kemmoù diwezhañ}}",
+       "youhavenewmessagesmulti": "Kemennadennoù nevez zo ganeoc'h war $1",
        "editsection": "kemmañ",
        "editold": "kemmañ",
        "viewsourceold": "sellet ouzh tarzh an destenn",
        "databaseerror-query": "Reked : $1",
        "databaseerror-function": "Arc'hwel : $1",
        "databaseerror-error": "Fazi : $1",
+       "transaction-duration-limit-exceeded": "Kuit da lakaat kreskiñ betek re an termen respont eo bet nullet an treuzgread-mañ rak aet e oa ar pad skrivañ ($1) en tu all d'ar vevenn a $2 eilenn.\nM'emaoc'h o cheñch kalz elfennoù war un dro klaskit kentoc'h troc'hañ anezho e meur a oberiadenn disteroc'h.",
        "laggedslavemode": "Diwallit : marteze a-walc'h n'emañ ket ar c'hemmoù diwezhañ war ar bajenn-mañ",
        "readonly": "Hizivadurioù stanket war ar bank roadennoù",
        "enterlockreason": "Merkit perak eo stanket hag istimit pegeit e chomo evel-henn",
        "missingarticle-rev": "(adweladenn # : $1)",
        "missingarticle-diff": "(Dif : $1, $2)",
        "readonly_lag": "Stanket eo bet ar bank roadennoù ent emgefre p'emañ an eilservijerioù oc'h adpakañ o dale e-keñver ar pennservijer",
+       "nonwrite-api-promise-error": "Kaset e oa bet an talbenn HTTP 'Promise-Non-Write-API-Action' met savet e oa bet ar reked ouzh ur vodulenn skrivañ API.",
        "internalerror": "Fazi diabarzh",
        "internalerror_info": "Fazi diabarzh : $1",
+       "internalerror-fatal-exception": "Fazi groñs a seurt \"$1\"",
        "filecopyerror": "Dibosupl eilañ \"$1\" war-du \"$2\".",
        "filerenameerror": "Dibosupl da adenvel « $1 » e « $2 ».",
        "filedeleteerror": "Dibosupl eo diverkañ « $1 ».",
        "cannotdelete": "Dibosupl diverkañ ar bajenn pe ar restr \"$1\".\nMarteze e o bet diverket gant unan bennak all dija.",
        "cannotdelete-title": "N'haller ket diverkañ ar bajenn \"$1\"",
        "delete-hook-aborted": "Nullet ar c'hemmañ gant un astenn.\nAbeg dianav.",
+       "no-null-revision": "N'eus ket bet gallet krouiñ un adweladenn nevez c'houllo evit ar bajenn \"$1\"",
        "badtitle": "Titl fall",
        "badtitletext": "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel pe etrewiki.\nMarteze ez eus ennañ arouezennoù n'haller ket degemer en titloù.",
+       "title-invalid-empty": "Pe eo goullo titl ar bajenn c'houlennet pe n'eus ennañ nemet anv an esaouenn anv.",
+       "title-invalid-utf8": "Titl ar bajenn c'houlennet zo ennañ un heuliad UTF-8 direizh.",
+       "title-invalid-interwiki": "Titl ar bajenn c'houlennet zo ennañ ul liamm etrewiki n'haller ket ober gantañ en titloù.",
+       "title-invalid-talk-namespace": "Titl ar bajenn c'houlennet a ra dave d'ur bajenn gaozeal n'eus ket anezhi.",
+       "title-invalid-characters": "Titl ar bajenn c'houlennet zo ennañ arouezennoù direizh : \"$1\".",
+       "title-invalid-relative": "Un hent amvat zo gant an titl. Direizh eo titloù ar pajennoù amvat (./, ../) peogwir e vint dibosupl da dizhout dre merdeerioù implijet gant tud zo.",
+       "title-invalid-magic-tilde": "Titl ar bajenn c'houlennet zo ennañ un heuliad tildennoù burzhudus direizh (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Re hir eo titl ar bajenn c'houlennet. N'hall ket bezañ hiroc'h eget $1 {{PLURAL:$1|okted}} er c'hod UTF-8.",
+       "title-invalid-leading-colon": "Titl ar bajenn c'houlennet zo ennañ un daoubik direizh er penn-kentañ.",
        "perfcached": "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet. D'ar muiañ e c'haller kaout {{PLURAL:$1|un disoc'h|$1 disoc'h}} er grubuilh.",
        "perfcachedts": "Krubuilhet eo ar roadennoù da-heul hag hizivaet int bet da ziwezhañ d'an $1. D'ar muiañ e c'haller kaout {{PLURAL:$4|un disoc'h|$4 disoc'h}} er grubuilh.",
        "querypage-no-updates": "Diweredekaet eo an hizivaat evit ar bajenn-mañ. Evit poent ne vo ket nevesaet ar roadennoù amañ.",
        "viewsource": "Sellet ouzh tarzh an destenn",
        "viewsource-title": "Gwelet an tarzh evit $1",
        "actionthrottled": "Ober daleet",
-       "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeut munutennoù.",
+       "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeudig munutennoù.",
        "protectedpagetext": "Prennet eo bet ar bajenn-mañ kuit na vefe skrivet pe cheñchet un dra bennak enni",
-       "viewsourcetext": "Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ",
+       "viewsourcetext": "Gallout a rit gwelet hag eilañ mammenn ar bajenn-mañ.",
        "viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho <strong>kemmoù</strong> d'ar bajenn-mañ.",
        "protectedinterface": "Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.",
        "editinginterface": "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [https://translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
-       "cascadeprotected": "Gwarezet eo ar bajenn-mañ; n'haller ket kemmañ anezhi ken p'he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
+       "translateinterface": "Evit ouzhpennañ pe cheñch troidigezhioù en holl wikioù, grit gant [https://translatewiki.net/ translatewiki.net], anezhañ raktres lec'helaat MediaWiki.",
+       "cascadeprotected": "Gwarezet eo ar bajenn-mañ ; n'haller ket kemmañ anezhi ken p'he c'haver treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
        "namespaceprotected": "N'oc'h ket aotreet da gemmañ pajennoù an esaouenn anv '''$1'''.",
        "customcssprotected": "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "customjsprotected": "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "mypreferencesprotected": "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
        "ns-specialprotected": "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
        "titleprotected": "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].\nSetu amañ perak <em>$2</em>.",
-       "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"''$3''\" eo an abeg roet gant ar merour en deus prennet anezhi.",
+       "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"$3\" eo an abeg roet gant merour ar reizhiad en deus prennet anezhi.",
        "invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
        "invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
        "exception-nologin": "N'oc'h ket kevreet",
        "yourname": "Anv implijer :",
        "userlogin-yourname": "Anv implijer",
        "userlogin-yourname-ph": "Merkit hoc'h anv implijer",
-       "createacct-another-username-ph": "Ebarzhiñ an anv implijer",
+       "createacct-another-username-ph": "Merkañ an anv implijer",
        "yourpassword": "Ger-tremen :",
        "userlogin-yourpassword": "Ger-tremen",
        "userlogin-yourpassword-ph": "Merkit ho ker-tremen",
        "createacct-emailrequired": "Chomlec'h postel",
        "createacct-emailoptional": "Chomlec'h postel (diret)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
-       "createacct-another-email-ph": "Ebarzhiñ ur chomlec'h postel",
+       "createacct-another-email-ph": "Merkañ ur chomlec'h postel",
        "createaccountmail": "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
        "createaccountmail-help": "Gallout a ra bezañ implijet evit krouiñ ur gont evit unan bennak all hep gouzout ar ger-tremen.",
        "createacct-realname": "Anv gwir (diret)",
        "wrongpassword": "Ger-tremen kamm. Klaskit en-dro.",
        "wrongpasswordempty": "Ger-tremen ebet. Lakait unan mar plij.",
        "passwordtooshort": "{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.",
-       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 arouezenn.",
+       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 {{PLURAL:$1|1 arouezenn|$1 arouezenn}}.",
+       "passwordtoopopular": "N'haller ket ober gant gerioù-ter boutin betek re. Grit gant ur ger-tremen raloc'h.",
        "password-name-match": "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
        "password-login-forbidden": "Berzet eo ober gant an anv implijer hag ar ger-tremen-mañ.",
        "mailmypassword": "Adderaouekaat ar ger-tremen",
        "noemail": "N'eus bet enrollet chomlec'h postel ebet evit an implijer \"$1\".",
        "noemailcreate": "Ret eo deoc'h merkañ ur chomlec'h postel reizh",
        "passwordsent": "Kaset ez eus bet ur ger-tremen nevez da chomlec'h postel an implijer \"$1\".\nTrugarez deoc'h da gevreañ kerkent ha ma vo bet resevet ganeoc'h.",
-       "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Gant se n'hallit ket implijout an arc'hwel adtapout gerioù-tremen, kuit m'en em ledfe gwallimplijoù.",
+       "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Kuit m'en em ledfe gwallimplijoù n'hallit ket implijout an arc'hwel adtapout gerioù-tremen adalek ar chomlec'h IP-mañ.",
        "eauthentsent": "Kaset ez eus bet ur postel kadarnaat war-du ar chomlec'h postel spisaet.\nA-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzulioù merket er postel resevet evit kadarnaat ez eo mat ho kont deoc'h.",
        "throttled-mailpassword": "Kaset ez eus bet deoc'h ur postel adderaouekaat e-kerzh an\n{{PLURAL:$1|eurvezh|$1 eurvezh}} tremenet. Evit mirout ouzh nep gaou ne gaser ket ouzhpenn ur postel a seurt-se bep {{PLURAL:$1|eurvezh|$1 eurvezh}}.",
        "mailerror": "Fazi en ur gas ar postel : $1",
-       "acct_creation_throttle_hit": "{{PLURAL:$1|1 gont|$1 kont}} zo bet krouet c'hoazh nevez zo dre ho chomlec'h IP gant gweladennerien d'ar wiki-mañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
+       "acct_creation_throttle_hit": "Gweladennerien zo o deus implijet ho chomlec'h IP evit krouiñ {{PLURAL:$1|1 gont|$1 kont}} e-kerzh an $2 diwezhañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
        "emailauthenticated": "Gwiriet eo bet ho chomlec'h postel d'an $2 da $3.",
        "emailnotauthenticated": "N'eo ket bet gwiriekaet ho chomlec'h postel evit c'hoazh.\nNe vo ket tu da gas postel ebet deoc'h evit hini ebet eus an dezverkoù dindan.",
        "noemailprefs": "Merkit ur chomlec'h postel mar fell deoc'h ez afe an arc'hwelioù-mañ en-dro.",
        "botpasswords-label-delete": "Dilemel",
        "botpasswords-label-resetpassword": "Adderaouekaat ar ger-tremen",
        "botpasswords-label-grants": "Aotreoù a c'haller ober ganto :",
+       "botpasswords-help-grants": "Gant an aotreoù e c'haller kaout ar gwirioù grataet d'ho kont implijer. N'eo ket peogwir e vo gweredekaet un aotre amañ e vo digoret gwirioù ouzhpenn deoc'h estreget ar re zo stag ouzh ho kont implijer. Kit da welet [[Special:ListGrants|taolenn an aotreoù]] evit gouzout hiroc'h.",
        "botpasswords-label-grants-column": "Aotreet",
        "botpasswords-bad-appid": "N'eo ket reizh anv ar robot « $1 »",
        "botpasswords-insert-failed": "C'hwitet eo ouzhpennadenn ar robot « $1 ». Hag ouzhpennet eo bet ?",
        "botpasswords-update-failed": "C'hwitet eo bet hizivadur anv ar robot « $1 ». Ha dilamet eo bet ?",
        "botpasswords-created-title": "Ger-tremen robotoù krouet",
-       "botpasswords-created-body": "Krouet mat eo bet ar ger-tremen « $1 ».",
+       "botpasswords-created-body": "Krouet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
        "botpasswords-updated-title": "Ger-tremen robotoù hizivaet",
-       "botpasswords-updated-body": "Hizivaet mat eo bet ar ger-tremen « $1 ».",
+       "botpasswords-updated-body": "Hizivaet mat eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
        "botpasswords-deleted-title": "Ger-tremen robotoù dilamet",
-       "botpasswords-deleted-body": "Ar ger-tremen robotoù « $1 » zo bet dilamet.",
-       "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen evit kevreañ gant <strong>$1</strong>. Enrollit anezhañ, par plij, evit ober dave dezhañ diwezhatoc'h.</em>",
+       "botpasswords-deleted-body": "Dilamet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
+       "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen nevez evit kevreañ ouzh <strong>$1</strong>. Enrollit anezhañ evit ober dave dezhañ diwezhatoc'h.</em>(Evit ar robotoù kozh zo rekis evito e vefe heñvel an anv kevreañ ouzh hini an implijer a c'hall bezañ, e c'hallit ober gant <strong>$3</strong> da anv implijer ha gant <strong>$4</strong> evel ger-tremen).",
        "botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
+       "botpasswords-restriction-failed": "N'hallit ket kevreañ abalamour d'ar strishadurioù war gerioù-tremen ar robotoù.",
+       "botpasswords-invalid-name": "N'eus ket a zispartier gerioù-tremen robot en anv implijer spisaet (\"$1\").",
        "botpasswords-not-exist": "N'eus ger-tremen bot ebet anvet \"$2\" gant an implijer \"$1\".",
        "resetpass_forbidden": "N'haller ket cheñch ar gerioù-termen",
        "resetpass_forbidden-reason": "N'haller ket cheñch ar gerioù-termen : $1",
        "resetpass-temp-password": "Ger-tremen da c'hortoz :",
        "resetpass-abort-generic": "Nullet eo bet kemm ar ger-tremen gant un astenn.",
        "resetpass-expired": "Deuet eo ho ker-tremen d'e dermen. Lakait ur ger-tremen nevez, mar plij, evit kevreañ.",
+       "resetpass-expired-soft": "Aet eo ho ker-tremen d'e dermen, ret eo adderaouekaat anezhañ. Dibabit ur ger-tremen nevez diouzhtu pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
+       "resetpass-validity-soft": "Direizh eo ho ker-tremen : $1\n\nDibabit ur ger-tremen nevez diouzhtu, pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
        "passwordreset": "Adderaouekaat ar ger-tremen",
        "passwordreset-text-one": "Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.",
        "passwordreset-text-many": "{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}",
        "passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war  {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailelement": "Anv implijer :           \n$1\n\nGer-tremen da c'hortoz : \n$2",
-       "passwordreset-emailsentemail": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-emailsentemail": "Mard eo liammet ar chomlec'h postel-mañ ouzh ho kont, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-emailsentusername": "Mard eo liammet ar chomlec'h postel-mañ gant an anv implijer-mañ, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
        "passwordreset-nocaller": "Ret eo merkañ anv ur galver",
        "passwordreset-nosuchcaller": "N'eus ket eus ar galver : $1",
+       "passwordreset-ignored": "N'eus ket bet gallet adderaouekaat ar ger-termen. Marteze a-walc'h peogwir n'eus ket bet kefluniet pourvezer ebet ?",
        "passwordreset-invalidemail": "Chomlec'h postel direizh",
        "passwordreset-nodata": "N'eus bet lakaet anv implijer na chomlec'h postel ebet",
        "changeemail": "Kemmañ pe dilemel ar chomlec'h postel",
-       "changeemail-header": "Kemmañ chomlec'h postel ar gont",
+       "changeemail-header": "Leuniit ar furmskrid-mañ evit cheñch ho chomlec'h postel. Mar fell deoc'h distagañ ur chomlec'h postel bennak diouzh ho kont, lezit goullo lec'h ar chomlec'h postel nevez a-raok kadarnaat ar furmskrid.",
        "changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "changeemail-oldemail": "Chomlec'h postel a-vremañ :",
        "changeemail-newemail": "Chomlec'h postel nevez :",
+       "changeemail-newemail-help": "Goullo e tlefe chom ar vaezienn-mañ mar fell deoc'h lemel kuit ho chomlec'h postel. Ne viot ket gouest da adderaouekaat ur ger-tremen ankouaet ganeoc'h ken ha ne resevot postel ebet a-berzh ar wiki-mañ ma lamit kuit ar chomlec'h postel.",
        "changeemail-none": "(hini ebet)",
        "changeemail-password": "Ho ker-tremen war {{SITENAME}}:",
        "changeemail-submit": "Cheñch chomlec'h postel",
        "changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
        "changeemail-nochange": "Merkit ur chomlec'h postel all.",
        "resettokens": "Adderaouekaat ar jedoueroù",
+       "resettokens-text": "Gallout a ri adderaouekaat amañ ar jedoueroù a aotre ac'hanoc'h da vont war roadennoù prevez zo hag a zo staget ouzh ho kont.\n\nMat e vefe deoc'h en ober m'hoc'h eus rannet anezho gant unan bennak dre fazi pe mard eo bet implijet ho kont gant unan bennak all mod pe vod.",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
        "resettokens-tokens": "Jedoueroù :",
        "resettokens-token-label": "$1 (talvoud bremañ : $2)",
+       "resettokens-watchlist-token": "Jedouer evit lanvad web (Atom/RSS) [[Special:Watchlist|kemmañ pajennoù eus ho roll evezhiañ]]",
        "resettokens-done": "Jedoueroù adderaouekaet.",
        "resettokens-resetbutton": "Adderaouekaat ar jedoueroù diuzet",
        "bold_sample": "Testenn dev",
        "preview": "Rakwelet",
        "showpreview": "Rakwelet",
        "showdiff": "Diskouez ar c'hemmoù",
+       "blankarticle": "<strong>Taolit evezh :</strong> Goullo eo ar bajenn emaoc'h o krouiñ.\nMar klikit war \"{{int:savearticle}}\" en-dro e vo krouet hep netra ebet e-barzh.",
        "anoneditwarning": "</strong>Diwallit :</strong> N'oc'h ket kevreet.\nGallout a raio an holl dud gwelet ho chomlec'h IP ma rit kemmoù. Ma <strong>[$1kevreit]</strong>pe<strong>[$2 krouit ur gont]</strong>, e vo deroet ho kemmoù d'hoc'h anv-implijer, e-touez spletoù all.",
        "anonpreviewwarning": "''N'oc'h ket kevreet. Enrollañ a lakao war-wel ho chomlec'h IP e istor kemmoù ar bajenn.''",
        "missingsummary": "'''Taolit evezh:''' N'hoc'h eus ket lakaet tamm testenn diverrañ ebet evit ho kemmoù. Mar klikit war enrollañ en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+       "selfredirect": "<strong>Taolit evezh :</strong> Emaoc'h oc'h adkas ar bajenn-mañ warni hec'h-unan.\nPe hoc'h eus spisaet ur pal a-dreuz evit an adkas pe emaoc'h o cheñch ur bajenn n'emañ ket da vezañ cheñchet evel-se.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo krouet an adkas forzh penaos.",
        "missingcommenttext": "Skrivit hoc'h evezhiadenn a-is.",
-       "missingcommentheader": "'''Taolit evezh :''' N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
-       "summary-preview": "Rakwelet an diverrañ :",
+       "missingcommentheader": "<strong>Taolit evezh :</strong> N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+       "summary-preview": "Rakwelet un diverrañ eus ar c'hemmoù :",
        "subject-preview": "Rakwelet an danvez :",
        "previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
        "blockedtitle": "Implijer stanket",
        "blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
        "autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
+       "systemblockedtext": "Stanket eo bet hoc'h anv implijer pe ho chomlec'h IP ent emgefre gant MediaWiki.\nSetu perak :\n\n:<em>$2</em>\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Hinienn a sell ar stankadenn outi : $7\n\n$3 eo ho chomlec'h IP diouzhtu.\nMerkit mat ar munudoù skrivet a-us er c'hlemmoù a c'halljec'h ober.",
        "blockednoreason": "n'eus bet roet abeg ebet",
        "whitelistedittext": "Ret eo deoc'h en em $1 evit gallout skridaozañ.",
        "confirmedittext": "Rankout a ri bezañ kadarnaet ho chomlec'h postel a-raok gallout kemmañ pajennoù. Skrivit ha kadarnait ho chomlec'h postel en ho [[Special:Preferences|penndibaboù implijer]] mar plij.",
        "accmailtext": "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2. Cheñchet e c'hall ar ger-tremen evit ar gont nevez-mañ bezañ war ar bajenn ''[[Special:ChangePassword|cheñch ger-tremen]]'', ur wezh kevreet.",
        "newarticle": "(Nevez)",
        "newarticletext": "Heuliet hoc'h eus ul liamm a gas d'ur bajenn n'eo ket bet savet evit c'hoazh.\nA-benn krouiñ ar bajenn-se, krogit da skrivañ er prenestr skridaozañ dindan (gwelet ar [$1 bajenn skoazell] evit gouzout hiroc'h).\nM'emaoc'h en em gavet amañ dre fazi, klikit war bouton '''kent''' ho merdeer evit mont war ho kiz.",
-       "anontalkpagetext": "---- ''Homañ eo ar bajenn gaozeal evit un implijer(ez) dizanv n'eus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ/i.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer(ez).\nMa'z oc'h un implijer(ez) dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]]pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
+       "anontalkpagetext": "<em>Homañ eo ar bajenn gaozeal evit un implijer dizanv n'en deus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi</em>.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer.\nMa'z oc'h un implijer dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]] pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
        "noarticletext": "N'eus tamm skrid ebet war ar bajenn-mañ evit poent.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù all,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask en oberiadennoù liammet], pe [{{fullurl:{{FULLPAGENAME}}|action=edit}} krouiñ ar bajenn]</span>.",
        "noarticletext-nopermission": "N'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,\npe <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>, met n'oc'h ket aotreet da grouiñ ar bajenn-mañ.",
        "missing-revision": "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{FULLPAGENAME}} ».\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "userpage-userdoesnotexist": "N'eo ket enrollet ar gont \"<nowiki>$1</nowiki>\". Merkit ma fell deoc'h krouiñ/kemmañ ar bajenn-mañ.",
        "userpage-userdoesnotexist-view": "N'eo ket enrollet ar gont implijer \"$1\".",
        "blocked-notice-logextract": "Stanket eo an implijer-mañ evit poent.\nDindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
-       "clearyourcache": "Notenn :''' Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* '''Firefox / Safari:''' Derc'hel da bouezañ war ''Pennlizherenn'' en ur glikañ war ''Adkargañ'', pe pouezañ war ''Ctrl-F5'' pe ''Ctrl-R'' (''⌘-R'' war ur Mac); \n* ''''Google Chrome:''' Pouezañ war ''Ctrl-Pennlizh-R'' (''⌘-Shift-R'' war ur Mac)\n* '''Internet Explorer:''' Derc'hel da bouezañ war ''Ctrl'' en ur glikañ war ''Freskaat,'' pe pouezañ war ''Ctrl-F5''\n* ''''Konqueror: '''Klikañ war ''Adkargañ'' pe pouezañ war ''F5;'' \n* '''Opera:''' Riñsañ ar grubuilh e ''Ostilhoù → Penndibaboù''",
+       "clearyourcache": "<strong>Notenn :</strong> Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* <strong>Firefox / Safari:</strong> Derc'hel da bouezañ war <em>Pennlizherenn</em> en ur glikañ war <em>Adkargañ</em>, pe pouezañ war <em>Ctrl-F5</em> pe <em>Ctrl-R</em> (<em>⌘-R</em> war ur Mac); \n* <strong>Google Chrome:</strong> Pouezañ war <em>Ctrl-Pennlizh-R</em> (<em>⌘-Shift-R</em> war ur Mac)\n* <strong>Internet Explorer :</strong> Derc'hel da bouezañ war <em>Ctrl</em> en ur glikañ war <em>Freskaat</em>, pe pouezañ war <em>Ctrl-F5</em>\n* <strong>Konqueror :</strong> Klikañ war <em>Adkargañ</em> pe pouezañ war <em>F5</em>\n* <strong>Opera :</strong> Mont da <em>Arventennoù → lañser</em> (<em>Opera → Penndibaboù</em> war ur Mac) ha goude mont da <em>Prevezded & surentez → Riñsañ roadennoù ar grubuilh → Skeudennoù krubuilhet ha restroù</em>.",
        "usercssyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn CSS nevez a-raok enrollañ anezhi.",
        "userjsyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn JS nevez a-raok enrollañ anezhi.",
        "usercsspreview": "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ho follenn CSS deoc'h.'''\n'''N'eo ket bet enrollet evit c'hoazh!'''",
        "previewnote": "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''\nN'eo ket bet enrollet ho kemmoù evit c'hoazh !",
        "continue-editing": "Mont d'an takad kemmañ",
        "previewconflict": "Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.",
-       "session_fail_preview": "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''\nKlaskit en-dro mar plij.\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h.",
-       "session_fail_preview_html": "'''Ho tigarez! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.'''\n\n''Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.''\n\n'''Mard e oa onest ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro. '''\nMar ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] ha kevreañ en-dro.",
+       "session_fail_preview": "Ho tigarez ! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.\n\nMarteze n'oc'h ket kevreet ken. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\n\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h. Gwiriit mat e asant ho merdeer resev toupinoù a-berzh al lec'hienn-mañ ivez.",
+       "session_fail_preview_html": "Ho tigarez ! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.\n\n<em>Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.</em>\n\n<strong>Ma oa reizh ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro.</strong>\nMa ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude. Gwiriit e asant mat ho merdeer degemer toupinoù a-berzh al lec'hienn-mañ ivez.",
        "token_suffix_mismatch": "'''Distaolet eo bet ar c'hemmoù degaset ganeoc'h abalamour ma oa bet kemmesket an arouezennoù poentadur gant ho merdeer en daveer kemmañ. Distaolet eo bet ar c'hemmoù kuit na vije breinet ar bajennad skrid.\nC'hoarvezout a ra a-wechoù pa implijit ur servijer proksi dreinek dizanav.'''",
        "edit_form_incomplete": "'''Darn eus ar furmskrid kemmañ zo chomet hep tizhout ar servijer ; gwiriit ervat emañ mat ho kemmoù tre evel m'int bet graet ganeoc'h ha klaskit en-dro.'''",
        "editing": "Oc'h aozañ $1",
        "yourdiff": "Diforc'hioù",
        "copyrightwarning": "Sellet e vez ouzh an holl degasadennoù graet war {{SITENAME}} evel ouzh degasadennoù a zouj da dermenoù ar $2 (Sellet ouzh $1 evit gouzout hiroc'h). Mar ne fell ket deoc'h e vefe embannet ha skignet ho skridoù, arabat kas anezho.<br />\nHeñveldra, prometiñ a rit kemer perzh dre zegas skridoù savet ganeoc'h hepken pe tennet eus ur vammenn frank a wirioù.\n'''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER (COPYRIGHT) HEP AOTRE D'OBER KEMENT-SE!'''",
        "copyrightwarning2": "Notit mat e c'hall kement degasadenn graet ganeoc'h war {{SITENAME}} bezañ kemmet, adaozet pe lamet kuit gant an implijerien all. Mar ne fell ket deoc'h e vije kemmet-digemmet ar pezh hoc'h eus skrivet na gemerit ket perzh er raktres-mañ.<br /> Gouestlañ a rit ivez eo bet savet ar boued spered ganeoc'h pe eilet diwar ur vammenn frank a wirioù pe en domani foran (gwelet $1 evit gouzout hiroc'h). '''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER HEP AOTRE D'OBER KEMENT-SE!'''",
+       "editpage-cannot-use-custom-model": "N'haller ket cheñch patrom danvez ar bajenn-mañ.",
        "longpageerror": "'''FAZI : {{PLURAL:$1|Ur c'hilookted|$1 kilookted}} hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget {{PLURAL:$2|ur c'hilookted|$2 kilookted}}, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
-       "readonlywarning": "'''KEMENN DIWALL : prennet eo bet an diaz titouroù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.'''\n\nGallout a rit eilañ ha pegañ ho testenn en ur restr skrid all hag enrollañ anezhi a-benn diwezhatoc'hik.'''\n\nSetu an displegadenn lakaet gant ar merour eo bet prennet an traoù gantañ : $1",
+       "readonlywarning": "<strong>Diwallit : prennet eo bet an diaz roadennoù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.</strong>\n\nGallout a rit eilañ ha pegañ ho skrid en ur restr testenn all hag enrollañ anezhañ a-benn diwezhatoc'hik.\n\nSetu an displegadenn lakaet gant ar merour reizhiad eo bet prennet an traoù gantañ : $1",
        "protectedpagewarning": "'''KEMENN DIWALL: Gwarezet eo bet ar bajenn-mañ. N'eus nemet an implijerien ganto ar statud merour a c'hall kemmañ anezhi.'''\nEnmont diwezhañ ar marilh a ziskouezer amañ a-is evel dave :",
        "semiprotectedpagewarning": "''Notenn :''' Gwarezet eo ar bajenn-mañ; n'eus nemet an implijerien bet krouet ur gont ganto a kemmañ anezhi. Kasadenn ziwezhañ ar marilh zo diskouezet amañ a-is evel dave :",
-       "cascadeprotectedwarning": "'''Diwallit :''' Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
+       "cascadeprotectedwarning": "<strong>Diwallit :</strong> Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir emañ treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
        "titleprotectedwarning": "'''DIWALLIT :  Gwarezet eo bet ar bajenn-mañ e doare ma ranker kaout [[Special:ListGroupRights|gwirioù dibar]] a-benn krouiñ anezhi.''' Kasadenn ziwezhañ ar marilh a zo diskouezet amañ a-is evel dave :",
        "templatesused": "{{PLURAL:$1|Patrom|Patromoù}} implijet war ar bajenn-mañ :",
        "templatesusedpreview": "{{PLURAL:$1|Patrom|Patromoù}} implijet er rakweladenn-mañ :",
        "permissionserrors": "Fazi aotre",
        "permissionserrorstext": "N'oc'h ket aotreet d'ober kement-mañ evit {{PLURAL:$1|an abeg-mañ|an abegoù-mañ}} :",
        "permissionserrorstext-withaction": "N'oc'h ket aotreet da $2, evit an {{PLURAL:$1|abeg-mañ|abeg-mañ}} :",
+       "contentmodelediterror": "N'hallit ket kemmañ an adweladenn-mañ peogwir ez eo par he fatrom danvez da <code>$1</code>, ar pezh zo disheñvel diouzh ar patrom danvez implijet bremañ war ar bajenn <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Diwallit : Emaoc'h o krouiñ ur bajenn zo bet diverket c'hoazh.'''\n\nEn em soñjit ervat ha talvoudus eo kenderc'hel krouiñ ar bajenn.\nDeoc'h da c'houzout, aze emañ ar marilhoù diverkañ hag adenvel :",
        "moveddeleted-notice": "Diverket eo bet ar bajenn-mañ.\nDindan emañ ar marilh diverkañ hag adenvel.",
+       "moveddeleted-notice-recent": "Ho tigarez, nevez ziverket eo bet ar bajenn-mañ (e-kerzh an 24 eurvezh tremenet).\nDindan emañ ar marilhoù diverkañ hag adenvel evit ho kelaouiñ.",
        "log-fulllog": "Gwelet ar marilh klok",
        "edit-hook-aborted": "C'hwitet ar c'hemmañ gant un astenn.\nAbeg dianav.",
        "edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
        "invalid-content-data": "n'eo ket mat roadennoù an endalc'had",
        "content-not-allowed-here": "N'eo ket aotreet an endalc'had \"$1\" er bajenn [[$2]]",
        "editwarning-warning": "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.\nMa'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"{{int:prefs-editing}}\" en ho penndibaboù.",
+       "editpage-invalidcontentmodel-title": "N'eo ket skoret ar patrom danvez",
+       "editpage-invalidcontentmodel-text": "N'eo ket skoret ar patrom danvez \"$1\".",
        "editpage-notsupportedcontentformat-title": "Furmad endalc'had ha n'eo ket kemeret e karg",
+       "editpage-notsupportedcontentformat-text": "N'eo ket skoret ar patrom $1 gant ar patrom danvez $2.",
        "content-model-wikitext": "wikitestenn",
        "content-model-text": "testenn blaen",
        "content-model-javascript": "Javascript",
        "content-json-empty-object": "Elfenn goullo",
        "content-json-empty-array": "Taolenn c'houllo",
        "deprecated-self-close-category": "Pajennoù a ra gant tikedennoù HTML emserriñ direizh",
-       "expensive-parserfunction-warning": "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv|galv}}, ha {{PLURAL:$1|$1 galv|$1 galv}} zo.",
+       "deprecated-self-close-category-desc": "Er bajenn-mañ ez eus tikedennoù HTML emserriñ, evel <code>&lt;b/></code> pe <code>&lt;span/></code>.  Cheñch a raio o emzalc'h a-raok pell evit bezañ diouzh an erbedadennoù HTML5. Gant se eo dispredet implijout anezho er wikitestenn.",
+       "duplicate-args-warning": "<strong>Taolit evezh : Emañ </strong> [[:$1]] o c'hervel [[:$2]] gant muioc'h eget un talvoud evit an arventenn \"$3\". N'eus nemet an talvoud pourchaset da ziwezhañ a vo implijet.",
+       "duplicate-args-category": "Pajennoù a ra gant arguzennoù eilet er galvoù patrom",
+       "duplicate-args-category-desc": "Er bajenn-mañ ez eus galvoù patroù a ra gant arguzennoù eilet, evel <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> pe <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Diwallit :</strong>: Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo er bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv}}, ha {{PLURAL:$1|$1 galv}} zo.",
        "expensive-parserfunction-category": "Pagjennoù enno re a c'halvoù koustus e-keñver an arc'hwelioù parser.",
        "post-expand-template-inclusion-warning": "Diwallit : re a batromoù zo war ar bajenn-mañ.\nLod anezho a vo lakaet a-gostez.",
        "post-expand-template-inclusion-category": "Pajennoù enno re a batromoù",
        "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]]",
-       "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù ar patromoù ($1)",
+       "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ù",
        "node-count-exceeded-category-desc": "Mont a ra ar bajenn-mañ en tu all da gont uhelañ ar skoulmoù.",
        "undo-summary": "Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])",
        "undo-summary-username-hidden": "Dizober ar reizhadenn $1 gant un implijer kuzhet",
        "cantcreateaccount-text": "Stanket eo bet ar c'hrouiñ kontoù adal ar chomlec'h IP ('''$1''') gant [[User:$3|$3]].\n\nAn abeg roet gant $3 zo ''$2''",
+       "cantcreateaccount-range-text": "Berzet eo bet gant [[User:$3|$3]] ar c'hrouiñ kontoù adalek ar chomlec'hioù IP el lijorennoù <strong>$1</strong> m'emañ ho chomlec'h IP (<strong>$4</strong>), \n\n<em>$2</em> eo an abeg roet gant $3",
        "viewpagelogs": "Gwelet ar marilhoù evit ar bajenn-mañ",
        "nohistory": "Ar bajenn-mañ n'he deus tamm istor ebet.",
        "currentrev": "Stumm a-vremañ pe stumm red",
        "history-feed-description": "Istor ar c'hemmoù degaset war ar bajenn-mañ eus ar wiki",
        "history-feed-item-nocomment": "$1 d'an $2",
        "history-feed-empty": "Ar bajenn goulennet n'eus ket anezhi.\nMarteze eo bet diverket eus ar wiki, pe adanvet.\nImplijit [[Special:Search|klaskit er wiki]] evit kavout pajennoù all a c'hallfe klotañ.",
+       "history-edit-tags": "Kemmañ tikedennoù ar stummoù diuzet",
        "rev-deleted-comment": "(diverradenn ar c'hemm diverket)",
        "rev-deleted-user": "(anv implijer diverket)",
-       "rev-deleted-event": "(elfenn dilamet)",
+       "rev-deleted-event": "(munudoù ar marilh bet dilamet)",
        "rev-deleted-user-contribs": "[anv implijer pe chomlec'h IP diverket - kemm kuzhet diouzh an degasadennoù]",
        "rev-deleted-text-permission": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} roll ar pajennoù diverket].",
+       "rev-suppressed-text-permission": "<strong>Diverket</strong> eo bet ar stumm-mañ eus ar bajenn.\nGallout a reot kavout ar munudoù e [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh an diverkadennoù].",
        "rev-deleted-text-unhide": "!'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-suppressed-text-unhide": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nTitouroù zo da gaout war [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-deleted-text-view": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nGallout a rit sellet outañ ; titouroù all a gavot war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].",
        "rev-showdeleted": "diskouez",
        "revisiondelete": "Diverkañ/diziverkañ stummoù",
        "revdelete-nooldid-title": "N'eus stumm pal ebet evit an degasadennoù",
-       "revdelete-nooldid-text": "Pe n'eo ket bet spisaet ganeoc'h ar stumm(où) pal da implijout an arc'hwel-mañ evito. pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
+       "revdelete-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal ebet da lakaat an arc'hwel-mañ da vont en-dro warnañ, pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
        "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-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.",
        "revdelete-text-file": "Dalc'het e vo da welet stummoù restroù dilamet en istor ar restr, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "logdelete-text": "Gwelet e vo c'hoazh dilamadennoù er marilhoù, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "revdelete-text-others": "Ar verourien a c'hallo c'hoazh mont da welet petra zo e-barzh, hag eilpennañ an dilamadenn, nemet ha reolennoù strishoc'h ouzhpenn a vefe.",
        "revdelete-legend": "Lakaat strishadurioù gwelet",
        "revdelete-hide-text": "Testenn ar stumm",
        "revdelete-hide-image": "Kuzhat danvez ar restr",
-       "revdelete-hide-name": "Kuzhat an ober hag ar vukadenn",
+       "revdelete-hide-name": "Kuzhat ar pal hag an arventennoù",
        "revdelete-hide-comment": "Notenn ar c'hemm",
        "revdelete-hide-user": "Anv implijer pe chomlec'h IP an aozer",
        "revdelete-hide-restricted": "Diverkañ ar roadennoù kement d'ar verourien ha d'ar re all",
        "revdelete-unsuppress": "Lemel ar strishadurioù war ar stummoù assavet",
        "revdelete-log": "Abeg :",
        "revdelete-submit": "Lakaat da dalvezout evit an {{PLURAL:$1|adweladenn|adweladennoù}} diuzet",
-       "revdelete-success": "''Gweluster ar stummoù hizivaet mat.'''",
+       "revdelete-success": "Gweluster ar stummoù hizivaet.",
        "revdelete-failure": "''Dibosupl hizivaat gweluster ar stumm :'''\n$1",
-       "logdelete-success": "'''Gweluster ar marilh arventennet evel m'eo dleet.'''",
+       "logdelete-success": "Kemmet eo bet gweluster ar marilh.",
        "logdelete-failure": "'''N'eus ket bet gallet termeniñ gweluster ar marilh :'''\n$1",
        "revdel-restore": "Cheñch ar gweluster",
        "pagehist": "Istor ar bajenn",
        "mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
        "mergehistory-submit": "Kendeuziñ ar stummoù",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
-       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
+       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
        "mergehistory-fail-bad-timestamp": "Merk amzer direizh.",
        "mergehistory-fail-invalid-source": "Pajenn darzh direizh.",
        "mergehistory-fail-invalid-dest": "Pajenn vuket direizh.",
+       "mergehistory-fail-no-change": "N'eus ket bet kendeuzet stumm ebet p'eo bet kendeuzet an istor. Gwiriit en-dro ar bajenn hag an arventennoù amzer.",
+       "mergehistory-fail-permission": "Re izel eo ho kwirioù evit gallout kendeuziñ an istor.",
+       "mergehistory-fail-self-merge": "Mammenn ha pal ar bajenn n'hall ket bezañ heñvel.",
+       "mergehistory-fail-timestamps-overlap": "En em frikañ a ra stummoù ar vammenn pe dont a reont war-lerc'h stummoù pal.",
        "mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
        "mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
        "mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
        "search-category": "(rummad $1)",
        "search-file-match": "(klotañ a ra gant endalc'had ar restr)",
        "search-suggest": "N'hoc'h eus ket soñjet kentoc'h e : $1",
+       "search-rewritten": "O tiskouez disoc'hoù evit $1. Klask $2 kentoc'h.",
        "search-interwiki-caption": "Raktresoù kar",
        "search-interwiki-default": "Disoc'hoù eus $1 :",
        "search-interwiki-more": "(muioc'h)",
+       "search-interwiki-more-results": "Muioc'h a zisoc'hoù",
        "search-relatedarticle": "Disoc'hoù kar",
        "searchrelated": "disoc'hoù kar",
        "searchall": "An holl",
        "showingresultsinrange": "O tiskouez amañ dindan betek {{PLURAL:$1|<strong>1</strong> disoc'h|<strong>$1</strong> a zisoc'hoù}} etre #<strong>$2</strong> ha #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Disoc'h <strong>$1</strong> of <strong>$3</strong>|a zisoc'hoù <strong>$1 - $2</strong> diwar <strong>$3</strong>}}",
        "search-nonefound": "An enklask-mañ ne zisoc'h war netra.",
+       "search-nonefound-thiswiki": "N'eus bet kavet disoc'h ebet o klotañ gant ar reked el lec'hienn-mañ.",
        "powersearch-legend": "Klask araokaet",
        "powersearch-ns": "Klask en esaouennoù anv :",
        "powersearch-togglelabel": "Dibab :",
        "search-external": "Klask diavaez",
        "searchdisabled": "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
        "search-error": "Ur fazi a zo bet e-ser klask : $1",
+       "search-warning": "Ur c'hemenn-diwall zo bet e-ser klask : $1",
        "preferences": "Penndibaboù",
        "mypreferences": "Penndibaboù",
        "prefs-edits": "Niver a zegasadennoù :",
        "prefs-rc": "Kemmoù diwezhañ",
        "prefs-watchlist": "Roll evezhiañ",
        "prefs-editwatchlist": "Kemmañ ar roll evezhiañ",
+       "prefs-editwatchlist-label": "Kemmañ titloù eus ho roll evezhiañ :",
        "prefs-editwatchlist-edit": "Gwelet ha lemel titloù a-ziwar ho roll evezhiañ",
        "prefs-editwatchlist-raw": "Kemmañ ar roll evezhiañ (mod diginkl)",
        "prefs-editwatchlist-clear": "Diverkañ ho roll evezhiañ",
        "prefs-help-recentchangescount": "Kemer a ra an dra-mañ e kont ar c'hemmoù diwezhañ, istor ar pajennoù hag ar marilhoù.",
        "prefs-help-watchlist-token2": "Homañ zo an alc'hwez kuzh d'ho roll-evezhiañ davit boued war ar web. Forzh piv a anavez anezhañ a c'hall lenn ho roll-evezhiañ, setu na lavarit grit diwar e benn. M'ho pez ezhomm, e c'hallit [[Special:ResetTokens|assevel anezhañ]].",
        "savedprefs": "Enrollet eo bet ar penndibaboù.",
+       "savedrights": "Enrollet eo bet strolladoù implijer {{GENDER:$1|$1}}.",
        "timezonelegend": "Takad eur :",
        "localtime": "Eur lec'hel :",
        "timezoneuseserverdefault": "Ober gant talvoudenn dre ziouer ar wiki ($1)",
        "youremail": "Postel :",
        "username": "{{GENDER:$1|Anv implijer|Anv implijerez}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezel}} eus {{PLURAL:$1|ar strollad|ar strolladoù}}:",
+       "group-membership-link-with-expiry": "$1 (betek $2)",
        "prefs-registration": "Deiziad enskrivañ :",
        "yourrealname": "Anv gwir*",
        "yourlanguage": "Yezh an etrefas&nbsp;",
        "badsig": "Direizh eo ho sinadur kriz; gwiriit ho palizennoù HTML.",
        "badsiglength": "Re hir eo ho sinadur.\nDre ret e rank bezañ nebeutoc'h eget {{PLURAL:$1|arouezenn|arouezenn}} ennañ.",
        "yourgender": "Penaos eo plij deoc'h bezañ deskrivet ?",
-       "gender-unknown": "Gwell eo ganin tevel war se",
+       "gender-unknown": "Pa vo graet anv ac'hanoc'h gant ar meziant e vo graet gant gerioù dic'hour bep tro ma vo posupl",
        "gender-male": "Aozañ a ra-eñ pajennoù wiki",
        "gender-female": "Aozañ a ra-hi pajennoù wiki",
        "prefs-help-gender": "Diret : implijet evit kenglotadurioù gour e troidigezh etrefas ar meziant.\nA-wel d'an holl e vo an titour-mañ.",
        "email": "Postel",
-       "prefs-help-realname": "Diret eo skrivañ hoc'h anv gwir.\nMa skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset ganeoc'h.",
+       "prefs-help-realname": "Diret eo skrivañ e anv gwir.\nMa rit gantañ e c'hall bezañ implijet evit reiñ hoc'h anv d'ar pezh a vo bet degaset ganeoc'h.",
        "prefs-help-email": "Diret eo merkañ ur chomlec'h postel met ma lakait unan e vo tu da adkas ur ger-tremen nevez deoc'h ma tichañsfe deoc'h disoñjal ho hini.",
        "prefs-help-email-others": "Gallout a rit lezel tud all da vont e darempred ganeoc'h dre ho pajennoù implijer ha kaozeal hep na vefe ret deoc'h diskuliañ piv oc'h ivez.",
        "prefs-help-email-required": "Ezhomm zo eus ur chomlec'h postel.",
        "prefs-tokenwatchlist": "Jedouer",
        "prefs-diffs": "Diforc'hioù",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
+       "prefswarning-warning": "Kemmet eo bet ho penndibaboù ganeoc'h, met enrollet n'int ket bet avat.\nMar kuitait ar bajenn-mañ hep klikañ war \"$1\" ne vo ket nevesaet ho penndibaboù",
        "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
        "userrights": "Merañ statud an implijerien",
        "userrights-lookup-user": "Diuzañ un implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
        "editusergroup": "Kargañ strolladoù implijerien",
        "editinguser": "O kemmañ gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Kemmañ strolladoù an implijer",
-       "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+       "viewinguserrights": "Gwelet gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "userrights-viewusergroup": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "saveusergroups": "Enrollañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "userrights-groupsmember": "Ezel eus :",
        "userrights-groupsmember-auto": "Ezel emplegat eus :",
-       "userrights-groups-help": "Cheñch strollad an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet, pe ar c'hontrol.",
+       "userrights-groups-help": "Cheñch strolladoù an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet ganeoc'h, pe ar c'hontrol.\n* Ur # a verk a c'hallit astenn termen echuiñ ar strollad hepken ; n'hallit ket berraat anezhañ.",
        "userrights-reason": "Abeg :",
        "userrights-no-interwiki": "N'oc'h ket aotreet da gemmañ ar gwirioù implijer war wikioù all.",
        "userrights-nodatabase": "N'eus ket eus an diaz titouroù $1 pe n'eo ket lec'hel.",
        "userrights-changeable-col": "Ar strolladoù a c'hallit cheñch",
        "userrights-unchangeable-col": "Ar strolladoù n'hallit ket cheñch",
+       "userrights-expiry-current": "A ya d'e dermen d'an $1",
+       "userrights-expiry-none": "Didermen",
+       "userrights-expiry": "Termen :",
+       "userrights-expiry-existing": "Termen echuiñ merket : $3, $2",
+       "userrights-expiry-othertime": "Termen all :",
+       "userrights-expiry-options": "1 deiz:1 day,1 sizhun:1 week,1 miz:1 month,3 miz:3 months,6 miz:6 months, bloaz:1 year",
+       "userrights-invalid-expiry": "Direizh eo termen echuiñ ar strollad \"$1\".",
+       "userrights-expiry-in-past": "Re gozh eo termen echuiñ ar strollad \"$1\".",
+       "userrights-cannot-shorten-expiry": "N'hallit ket astenn termen echuiñ ar strollad \"$1\". N'eus nemet an implijerien aotreet da ouzhpennañ ha lemel ar strollad-mañ a c'hall astenn an termen.",
        "userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "right-reupload-shared": "Gwaskañ restroù ent lec'hel war an diellaoueg vedia rannet",
        "right-upload_by_url": "Enporzhiañ ur restr adal ur chomlec'h URL",
        "right-purge": "Spujañ krubuilh ar pajennoù hep kadarnaat",
-       "right-autoconfirmed": "Kemmañ ar pajennoù damwarezet",
+       "right-autoconfirmed": "Na vezañ trubuilhet gant ar bevennoù kas liammet ouzh ar chomlec'hioù IP",
        "right-bot": "Plediñ ganti evel gant un argerzh emgefre",
        "right-nominornewtalk": "Arabat diskouez ar c'hemenn \"Kemennoù nevez zo ganeoc'h\" pa vez lakaet kemmoù dister e pajenn gaozeal un implijer",
        "right-apihighlimits": "Kreskiñ ar bevennoù er goulennoù API",
        "right-deletedtext": "Gwelet ar skrid diverket hag an diforc'hioù etre ar stummoù diverket",
        "right-browsearchive": "Klask pajennoù bet diverket",
        "right-undelete": "Assevel ur bajenn",
-       "right-suppressrevision": "Teuler ur sell war ar stummoù kuzhet ouzh ar verourien hag assevel anezho",
+       "right-suppressrevision": "Gwelet, kuzhat ha diguzhat stummoù resis pajennoù zo diouzh selloù an implijerien all",
+       "right-viewsuppressed": "Gwelet ar stummoù kuzhet diouzh an implijerien all",
        "right-suppressionlog": "Gwelet ar marilhoù prevez",
        "right-block": "Mirout ouzh an implijerien all a gemmañ pajennoù pelloc'h",
        "right-blockemail": "Mirout ouzh un implijer a gas posteloù",
        "right-hideuser": "Stankañ un implijer, en ur guzhat anezhañ diouzh ar re all",
        "right-ipblock-exempt": "Tremen dreist an IPoù stanket, ar stankadennoù emgefre hag ar bloc'hadennoù IP stanket",
        "right-unblockself": "En em zistankañ",
-       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet",
+       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet dre skalierad",
        "right-editprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Kemmañ patrom danvez ur bajenn bennak",
        "right-editinterface": "Kemmañ an etrefas implijer",
        "right-editusercssjs": "Kemmañ restroù CSS ha JS implijerien all",
        "right-editusercss": "Kemmañ restroù CSS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
        "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+       "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyprivateinfo": "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyoptions": "Kemmañ ho penndibaboù",
        "right-siteadmin": "Prennañ ha dibrennañ ar bank-titouroù",
        "right-override-export-depth": "Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live",
        "right-sendemail": "Kas ur postel d'an implijerien all",
+       "right-managechangetags": "Krouiñ ha gweredekaat/diweredekaat [[Special:Tags|tikedennoù]]",
+       "right-applychangetags": "Lakaat [[Special:Tags|an tikedennoù]] e pleustr asambles gant kemmoù an-unan",
+       "right-changetags": "Ouzhpennañ ha dilemel [[Special:Tags|tikedennoù]], diwar ziviz, war adweladennoù hiniennel pe monedoù marilh.",
+       "right-deletechangetags": "Diverkañ[[Special:Tags|tikedennoù]] a-ziwar an diaz roadennoù",
+       "grant-generic": "Pakad aotreoù \"$1\"",
+       "grant-group-page-interaction": "Etreober gant pajennoù",
+       "grant-group-file-interaction": "Etreober gant mediaoù",
+       "grant-group-watchlist-interaction": "Etreober gant ho roll evezhiañ",
        "grant-group-email": "Kas ur postel",
+       "grant-group-high-volume": "Seveniñ ur pikol obererezh",
+       "grant-group-customization": "Personeladur ha penndibaboù",
+       "grant-group-administration": "Seveniñ oberoù melestradurel",
+       "grant-group-private-information": "Gwelet ar roadennoù prevez diwar ho penn",
        "grant-group-other": "Obererezh liesseurt",
        "grant-blockusers": "Stankañ ha distankañ implijerien",
        "grant-createaccount": "Krouiñ kontoù",
        "action-writeapi": "Ober gant an API skrivañ",
        "action-delete": "diverkañ ar bajenn-mañ",
        "action-deleterevision": "diverkañ adweladennoù",
-       "action-deletedhistory": "Gwelet istor diverket ar bajenn-mañ",
+       "action-deletelogentry": "Diverkañ enmontoù ar marilh",
+       "action-deletedhistory": "Gwelet istor diverket ur bajenn",
+       "action-deletedtext": "gwelet testenn diverket ar stumm-mañ",
        "action-browsearchive": "Klask pajennoù bet diverket",
        "action-undelete": "diziverkañ pajennoù",
        "action-suppressrevision": "gwiriañ hag assevel an adweladennoù kuzh",
        "action-viewmywatchlist": "gwelet ho roll evezhiañ",
        "action-viewmyprivateinfo": "Gwelet ho titouroù prevez",
        "action-editmyprivateinfo": "aozañ ho titouroù prevez",
+       "action-editcontentmodel": "Kemmañ patrom danvez ur bajenn",
+       "action-managechangetags": "krouiñ ha gweredekaat/diweredekaat tikedennoù",
+       "action-applychangetags": "lakaat e pleustr an tikedennoù a-gevret gant ho kemmoù",
+       "action-changetags": "ouzhpennañ ha dilemel tikedennoù diwar ziviz diouzh adweladennoù hiniennel pe monedoù marilh",
        "action-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
        "action-purge": "spurjañ ar bajenn-mañ",
        "nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "recentchanges-submit": "Diskouez",
        "rcfilters-activefilters": "Siloù oberiant",
+       "rcfilters-restore-default-filters": "Assevel ar siloù dre ziouer",
        "rcfilters-clear-all-filters": "Riñsañ an holl siloù",
+       "rcfilters-search-placeholder": "Silañ ar c'hemmoù diwezhañ (merdeiñ pe kregiñ da skrivañ)",
        "rcfilters-invalid-filter": "Sil direizh",
+       "rcfilters-empty-filter": "Sil oberiant ebet. War wel emañ an holl gemmoù.",
        "rcfilters-filterlist-title": "Siloù",
+       "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-filterlist-noresults": "N'eus bet kavet sil ebet",
+       "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-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ñ an implijer",
+       "rcfilters-filtergroup-userExpLevel": "Live skiant-prenañ (evit an implijer enrollet hepken)",
        "rcfilters-filter-userExpLevel-newcomer-label": "Tud nevez-deuet",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Nebeutoc'h eget 10 kemm ha 4 devezh obererezh.",
        "rcfilters-filter-userExpLevel-learner-label": "Deskarded",
+       "rcfilters-filter-userExpLevel-learner-description": "Muioc'h a zeizioù obererezh hag a gemmoù eget \"deraouidi\" hogen nebeutoc'h eget an \"implijerien arroutet\".",
        "rcfilters-filter-userExpLevel-experienced-label": "Implijerien arroutet",
        "rcfilters-filter-userExpLevel-experienced-description": "Ouzhpenn 30 devezh oberiantiz ha 500 kemm.",
+       "rcfilters-filtergroup-automated": "Degasadennoù emgefre",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Kemmoù graet gant ostilhoù emgefre.",
        "rcfilters-filter-humans-label": "Den (ket ur robot)",
+       "rcfilters-filter-humans-description": "Kemmoù graet gant tud kig-hag-eskern.",
+       "rcfilters-filtergroup-significance": "Talvoudegezh",
        "rcfilters-filter-minor-label": "Kemmoù dister",
+       "rcfilters-filter-minor-description": "Kemmoù merket evel dister gant an aozer.",
+       "rcfilters-filter-major-label": "Kemmoù n'int ket dister",
+       "rcfilters-filter-major-description": "Kemmoù n'int ket bet merket evel dister",
        "rcfilters-filtergroup-changetype": "Seurt kemm",
        "rcfilters-filter-pageedits-label": "Kemmoù pajennoù",
+       "rcfilters-filter-pageedits-description": "Kemmoù da danvez ar wiki, d'ar c'haozeadennoù, da zeskrivadurioù rummadoù...",
        "rcfilters-filter-newpages-label": "Krouidigezhioù pajennoù",
+       "rcfilters-filter-newpages-description": "Kemmoù a grou pajennoù nevez.",
        "rcfilters-filter-categorization-label": "Kemmoù rummad",
+       "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ñ...",
        "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",
        "rcshowhidemine": "$1 ma c'hemmoù",
        "rcshowhidemine-show": "Diskouez",
        "rcshowhidemine-hide": "Kuzhat",
+       "rcshowhidecategorization": "$1 rummatadur ar bajenn",
        "rcshowhidecategorization-show": "Diskouez",
        "rcshowhidecategorization-hide": "Kuzhat",
        "rclinks": "Diskouez an/ar $1 kemm diwezhañ c'hoarvezet e-pad an/ar $2 devezh diwezhañ.<br />$3",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]",
-       "rc_categories": "Bevenn ar rummadoù (dispartiañ gant \"|\")",
+       "rc_categories": "Bevenniñ d'ar rummadoù (dispartiet gant \"|\") :",
        "rc_categories_any": "Unan e-touez ar re zibabet",
        "rc-change-size-new": "$1 {{PLURAL:$1|okted|okted}} goude kemmañ",
        "newsectionsummary": "/* $1 */ rann nevez",
        "recentchangeslinked-feed": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-toolbox": "Heuliañ ar pajennoù liammet",
        "recentchangeslinked-title": "Kemmoù a denn da \"$1\"",
-       "recentchangeslinked-summary": "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).\nE '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
+       "recentchangeslinked-summary": "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).\nE <strong>tev</strong> emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
        "recentchangeslinked-page": "Anv ar bajenn :",
        "recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
        "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
-       "recentchanges-page-removed-from-category": "Diverket eo bet [[$1]] diouzh ar rummad",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ouzhpennet d'ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
+       "recentchanges-page-removed-from-category": "Diverket eo bet [[:$1]] diouzh ar rummad",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dilamet diouzh ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
        "autochange-username": "Kemm emgefre gant MediaWiki",
        "upload": "Kargañ war ar servijer",
        "uploadbtn": "Kargañ ur restr",
        "uploaderror": "Fazi enporzhiañ",
        "upload-recreate-warning": "'''Diwallit''' : Diverket pe dilec'hiet ez eus bet ur restr gant an anv-se.'''\n\nDeoc'h da c'houzout, setu aze marilh an diverkañ hag an dilec'hiañ evit ar bajenn-mañ.",
        "uploadtext": "Grit gant ar furmskrid a-is evit enporzhiañ restroù war ar servijer.\nEvit sellet pe klask skeudennoù bet enporzhiet a-raok sellit ouzh [[Special:FileList|roll ar skeudennoù]]. Kavet e vo ar skeudennoù enporzhiet war [[Special:Log/upload|marilh ar pajennoù enporzhiet]] hag an diverkadennoù war [[Special:Log/delete|istor an diverkadennoù]].\n\nEvit enklozañ ur skeudenn en ur pennad, lakait er pennad-se ul liamm skrivet evel-henn :\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.jpg]]</nowiki></code>''' evit diskouez ar restr en he spider brasañ ;\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.png|deskrivadenn]]</nowiki></code>''' evit ober gant ur munud 200 piksel ledander er ur voest a-gleiz enni \"testenn zeskrivañ\" da zeskrivadenn\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:anv_ar_restr.ogg]]</nowiki></code>''' evit sevel ul liamm war-eeun war-du ar restr hep diskouez anezhi.",
-       "upload-permitted": "Seurtoù restroù aotreet : $1.",
-       "upload-preferred": "Seurtoù restroù gwellañ : $1.",
-       "upload-prohibited": "Seurtoù restroù berzet : $1.",
+       "upload-permitted": "{{PLURAL:$2|Seurt|Seurtoù}} restr aotreet : $1.",
+       "upload-preferred": "{{PLURAL:$2|Seurt|Seurtoù}} restr karetañ : $1.",
+       "upload-prohibited": "{{PLURAL:$2|Seurt|Seurtoù}} restr berzet : $1.",
        "uploadlogpage": "Marilh ar pajennoù enporzhiet",
        "uploadlogpagetext": "Setu a-is marilh ar restroù diwezhañ bet karget war ar servijer.\nS.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
        "filename": "Anv ar restr",
        "largefileserver": "Brasoc'h eo ar restr-mañ eget ar pezh a c'hall ar servijer aotren.",
        "emptyfile": "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
        "windows-nonascii-filename": "N'eo ket skoret anvioù ar restroù enno arouezennoù dibar gant ar wiki-mañ.",
-       "fileexists": "Ur restr all gant an anv-se zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
+       "fileexists": "Ur restr all gant an anv-mañ zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'{{GENDER:|oc'h}} ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
        "filepageexists": "Amañ <strong>[[:$1]]</strong> eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.\nAn diverradenn skrivet ganeoc'h ne vo ket gwelet war ar bajenn zeskrivañ.\nMar fell deoc'h e teufe ho tiverradenn war wel eno eo ret deoc'h-c'hwi kemmañ anezhi hoc'h-unan.\n[[$1|thumb]]",
-       "fileexists-extension": "Bez' ez eus dija ur restr gant an anv-se war-bouez nebeut : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi dija : <strong>[[:$2]]</strong>\nDibabit un anv all mar plij.",
+       "fileexists-extension": "Bez' ez eus ur restr gant an hevelep anv koulz lavaret : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi c'hoazh : <strong>[[:$2]]</strong>\nDibab un anv all a fell deoc'h kentoc'h marteze ?",
        "fileexists-thumbnail-yes": "Evit doare ez eus ur skeudenn krennet he ment eus ar restr ''(thumbnail)''. [[$1|thumb]]\nGwiriit ar restr <strong>[[:$1]]</strong>.\nMard eo an hevelep skeudenn ha hini ar restr orin, ha heñvel he ment, n'eo ket dav pellgargañ ur stumm krennet ouzhpenn.",
        "file-thumbnail-no": "Kregiñ a ra anv ar restr gant <strong>$1</strong>.\nEvit doare eo ur skeudenn krennet he ment ''(thumbnail)''.\nMa'z eus ganeoc'h ur skeudenn uhel he fizhder, pellgargit anezhi; a-hend-all cheñchit anv ar restr.",
        "fileexists-forbidden": "Ur restr all gant an anv-se zo c'hoazh ha n'hall ket bezan diverket.\nMar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un anv all [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ur restr all dezhi an hevelep anv zo c'hoazh er c'havlec'h eskemm restroù.\nMar fell deoc'h enporzhiañ ar restr-mañ da vat, kit war ho kiz hag enporzhiit anezhi adarre dindan un anv all. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Rik-heñvel ouzh ar stumm a-vremañ eus <strong>[[:$1]]</strong> eo an enporzhiadenn-mañ.",
+       "fileexists-duplicate-version": "Rik-heñvel ouzh {{PLURAL:$2|ur stumm koshoc'h|stummoù koshoc'h}} eus <strong>[[:$1]]</strong> eo an enporzhiadenn-mañ.",
        "file-exists-duplicate": "Un eil eus ar {{PLURAL:$1|restr|restroù}} da-heul eo ar restr-mañ :",
        "file-deleted-duplicate": "Diverket ez eus bet c'hoazh ur restr heñvel-poch ouzh ar restr-mañ ([[:$1]]). Gwelloc'h e vefe deoc'h teuler ur sell war istor diverkadenn ar bajenn-se a-raok hec'h enporzhiañ en-dro.",
+       "file-deleted-duplicate-notitle": "Ur restr rik-heñvel ouzh homañ zo bet dilamet c'hoazh, hag an titl zo bet diverket. Gwelloc'h e vefe deoc'h gwelet gant unan bennak a c'hall gwelet roadennoù ar restroù diverket evit gwiriañ an traoù a-raok mont da adenporzhiañ anezhi.",
        "uploadwarning": "Kemenn diwall en ur ezporzhiañ",
        "uploadwarning-text": "Cheñchit deskrivadur ar restr a-is ha klaskit en-dro.",
        "savefile": "Enrollañ ar restr",
        "uploaddisabledtext": "Diweredekaet eo an enporzhiañ restroù.",
        "php-uploaddisabledtext": "Diweredekaet eo bet ar pellgargañ e PHP. Gwiriit an dibarzh arventennoù file_uploads.",
        "uploadscripted": "Er restr-mañ ez eus kodoù HTML pe skriptoù a c'hallfe bezañ kammgomprenet gant ur merdeer Kenrouedad.",
+       "upload-scripted-pi-callback": "Dibosupl eo enporzhiañ ur restr enni kemennoù plediñ gant ur follenn stil XML.",
+       "uploaded-script-svg": "Kavet ez eus bet ul elfenn skriptadus \"$1\" er restr SVG enporzhiet.",
+       "uploaded-hostile-svg": "Kavet ez eus bet ur CSS diasur en elfenn stil ur restr SVG.",
+       "uploaded-event-handler-on-svg": "N'eo ket aotreet spisaat perzhioù merañ darvoudoù <code>$1=\"$2\"</code> er restroù SVG.",
+       "uploaded-href-attribute-svg": "N'eo aotreet ar perzhioù href ere restroù SVG nemet evit liammañ ouzh palioù http:// pe https://, <code>&lt;$1 $2=\"$3\"&gt;</code> kavet.",
+       "uploaded-href-unsafe-target-svg": "Kavet ez eus bet un href war-zu roadennoù diasur er restr SVG bet enporzhiet : URI pal <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Kavet ez eus bet un dikedenn \"vevaet\" a c'hallfe cheñch an href, en ur ober gant ar perzh \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> er restr SVG enporzhiet.",
+       "uploaded-setting-event-handler-svg": "Stanket eo kefluniañ perzhioù dre ar merer darvoudoù, <code>&lt;$1 $2=\"$3\"&gt;</code> kavet er restr SVG bet enporzhiet.",
+       "uploaded-setting-href-svg": "Difennet eo ober gant an dikedenn \"set\" evit ouzhpennañ ur perzh \"href\" d'an elfenn kar.",
+       "uploaded-wrong-setting-svg": "Difennet eo ober gant an dikedenn \"set\" evit ouzhpennañ ur pal a-bell/roadenn/skript d'ur perzh bennak. Kavet eo bet <code>&lt;set to=\"$1\"&gt;</code> er restr SVG enporzhiet.",
+       "uploaded-setting-handler-svg": "Stanket eo an SVG a spisa ar perzh \"handler\" gant a-bell/roadennoù/skript. Kavet eo bet <code>$1=\"$2\"</code> er restr SVG enporzhiet.",
+       "uploaded-remote-url-svg": "Stanket eo an SVG a spisa ur perzh stil gant un URL a-bell. Kavet eo bet <code>$1=\"$2\"</code> er restr SVG enporzhiet.",
+       "uploaded-image-filter-svg": "Kavet ez eus bet ur sil skeudennoù gant un URL : <code>&lt;$1 $2=\"$3\"&gt;</code> er restr SVG enporzhiet.",
+       "uploadscriptednamespace": "Un anv esaouenn berzet zo er restr SVG \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "N'eus ket bet gallet dielfennañ an XML er restr ezporzhiet.",
        "uploadvirus": "Viruzet eo ar restr! Titouroù : $1",
        "uploadjava": "Ur restr ZIP a ra gant Java .class eo homañ.\nN'haller ket enporzhiañ restroù Java peogwir e c'haller mont dreist da vevennoù surentez ganto.",
        "upload-options": "Dibaboù kargañ",
        "watchthisupload": "Evezhiañ ar bajenn-mañ",
        "filewasdeleted": "Ur restr gant an anv-mañ zo bet enporzhiet dija ha diverket goude-se. Mat e vefe deoc'h gwiriañ an $1 a-raok hec'h enporzhiañ en-dro.",
+       "filename-thumb-name": "Tennañ a ra da ditl ur munud. Na enpotzhiit ket munudoù skeudennoù zo er wiki dija. Ma n'eo ket unan, cheñchit anv ar restr evit ma vefe splannoc'h ha na grogfe ket evel titl ur munud.",
        "filename-bad-prefix": "Anv ar restr emaoc'h oc'h enporzhiañ a grog gant '''\"$1\"''', da lavaret eo un anv dizeskrivus roet alies ent emgefre gant luc'hskeudennerezioù niverel. Dibabit un anv splannoc'h evit deskrivañ ar restr.",
        "filename-prefix-blacklist": " #<!-- lezel al linenn-mañ tre ha tre evel m'emañ --> <pre>\n# Setu penaos emañ an ereadur :\n#   * Pep tra adal un arouezenn \"#\" betek dibenn al linenn a ya d'ober un notenn\n#   * Pep linenn n'eo ket goullo zo ur rakger evit anvioù restroù heverk roet ent emgefre gant luc'hskeudennerezioù niverel\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # pellgomzerioù hezoug zo\nIMG # jenerik\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-proto-error": "Protokol direizh",
        "upload-too-many-redirects": "Re a adkasoù zo en URL-mañ.",
        "upload-http-error": "Ur fazi HTTP zo bet : $1",
        "upload-copy-upload-invalid-domain": "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
+       "upload-foreign-cant-upload": "N'eo ket kefluniet ar wiki-mañ evit enporzhiañ restroù d'ar c'havlec'h diellaouiñ diavaez goulennet.",
+       "upload-foreign-cant-load-config": "N'eus ket bet gallet kargañ ar c'hefluniadur enporzhiañ restroù diavaez d'ar c'havlec'h diellaouiñ.",
+       "upload-dialog-disabled": "Diweredekaet eo enporzhiañ restroù dre ar prenestr kaozeal-mañ war ar wiki-mañ.",
        "upload-dialog-title": "Kargañ ar restr",
        "upload-dialog-button-cancel": "Nullañ",
        "upload-dialog-button-back": "Kent",
        "upload-dialog-button-upload": "Enporzhiañ",
        "upload-form-label-infoform-title": "Munudoù",
        "upload-form-label-infoform-name": "Anv",
+       "upload-form-label-infoform-name-tooltip": "Un anv deskrivus nemetken evit ar restr a servijo da anv restr. Gallout a rit implijout ur yezh plaen gant esaouennoù. Arabat lakaat astenn ar restr.",
        "upload-form-label-infoform-description": "Deskrivadur",
+       "upload-form-label-infoform-description-tooltip": "Grit un tamm diverrañ eus perzhioù heverkañ al labour.\nEvit ur skeudenn, merkit ar pep pouezusañ eus ar pezh a weler, an degouezh pe al lec'h.",
        "upload-form-label-usage-title": "Implij",
        "upload-form-label-usage-filename": "Anv ar restr",
        "upload-form-label-own-work": "Setu aze ma zammig labour din-me",
        "upload-form-label-infoform-categories": "Rummadoù",
        "upload-form-label-infoform-date": "Deiziad",
+       "upload-form-label-own-work-message-generic-local": "Kadarnaat a ran emaon oc'h enporzhiañ ar restr-mañ en ur zoujañ d'an termenoù implijout ha d'ar reolennoù perc'henniezh a dalvez war {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Ma n'oc'h ket gouest da enporzhiañ ar restr-mañ en ur zoujañ da reolennoù implij {{SITENAME}}, serrit ar prenestr-mañ ha klaskit un doare all.",
+       "upload-form-label-not-own-work-local-generic-local": "Gallout a ri klask gant [[Special:Upload|ar bajenn enporzhiañ dre ziouer]] ivez.",
+       "upload-form-label-own-work-message-generic-foreign": "Kompren mat a ran emaon oc'h enporzhiañ ar restr-mañ en ur c'havlec'h rannet. Kadarnaat a ran e ran se en ur zoujañ d'an termenoù servij hag ar reolennoù war ar berc'henniezh.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Ma n'oc'h ket gouest da enporzhiañ ar restr-mañ en ur zoujañ da reolennoù ar c'havlec'h rannet, serrit ar prenestr-mañ ha klaskit un doare all.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Marteze hoc'h eus c'hoazh da glask en ur implijout [[Special:Upload|ar bajenn enporzhiañ war {{SITENAME}}]], ma c'hall ar restr-mañ bezañ enporzhiet eno en ur zoujañ d'o reolennoù implijout.",
        "backend-fail-stream": "Dibosupl eo lenn ar restr $1.",
        "backend-fail-backup": "Dibosupl enrollañ ar restr $1.",
        "backend-fail-notexists": "N'eus ket eus ar restr $1.",
        "backend-fail-read": "Dibosupl lenn ar restr $1.",
        "backend-fail-create": "Dibosupl eo krouiñ ar restr $1.",
        "backend-fail-maxsize": "Dibosupl skrivañ er restr $1 peogwir eo brasoc'h eget {{PLURAL:$2|un okted|$2 okted}}.",
-       "backend-fail-readonly": "Emañ an dermenell stokañ \"$1\" e mod lenn hepken. Setu aze an abeg a oa bet roet : \"$2\".",
+       "backend-fail-readonly": "Emañ an dermenell stokañ \"$1\" e mod lenn hepken. Setu aze an abeg a oa bet roet : <em>$2</em>.",
        "backend-fail-synced": "Emañ ar restr \"$1\" en ur stad direizhet en termenelloù stokañ diabarzh",
        "backend-fail-connect": "Dibosupl kevreañ ouzh termenell stokañ ar restr \"$1\".",
        "backend-fail-internal": "C'hoarvezet ez eus ur fazi dianav e termenell stokañ ar restr \"$1\".",
        "uploadstash-errclear": "N'eus ket bet gallet riñsañ ar restroù.",
        "uploadstash-refresh": "Freskaat roll ar restroù",
        "uploadstash-thumbnail": "gwelet ar munud",
+       "uploadstash-exception": "Dibosupl stokañ an enporzhiadenn er sanailh ($1) : \"$2\".",
        "invalid-chunk-offset": "Direizh eo offset ar rannad",
        "img-auth-accessdenied": "Moned nac'het",
        "img-auth-nopathinfo": "Mankout a ra ar PATH_INFO.\nN'eo ket kefluniet ho servijer evit reiñ an titour-mañ.\nMarteze eo diazezet war CGI ha n'hall ket skorañ img_auth.\nGwelet https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "listfiles-delete": "dilemel",
        "listfiles-summary": "Diskouez a ra ar bajenn dibar-mañ an holl restroù bet ezporzhiet.",
        "listfiles_search_for": "Klask anv ar skeudenn :",
+       "listfiles-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
        "imgfile": "restr",
        "listfiles": "Roll ar skeudennoù",
        "listfiles_thumb": "Munud",
        "filerevert-submit": "Disteuler",
        "filerevert-success": "'''Distroet eo bet [[Media:$1|$1]]''' da [stumm $4 an $3, $2].",
        "filerevert-badversion": "N'eus stumm lec'hel kent ebet eus ar restr-mañ d'ar mare spisaet.",
+       "filerevert-identical": "Heñvel-mik eo stumm a-vremañ ar restr ouzh an hini zo bet diuzet.",
        "filedelete": "Diverkañ $1",
        "filedelete-legend": "Diverkañ ar restr",
        "filedelete-intro": "War-nes diverkañ '''[[Media:$1|$1]]''' a-gevret gant e istor emaoc'h.",
        "filedelete-maintenance": "Evit ar mare eo diweredekaet an diverkañ hag an assevel restroù, amzer d'ober un tamm trezalc'h.",
        "filedelete-maintenance-title": "Dibosupl diverkañ ar restr",
        "mimesearch": "Klask MIME",
-       "mimesearch-summary": "Aotren a ra ar bajenn-mañ ar silañ restroù evit ar seurt restroù MIME. Enmont : seurt/isseurt, evel <code>skeudenn/jpeg</code>.",
+       "mimesearch-summary": "Aotren a ra ar bajenn-mañ silañ restroù dre o seurt MIME. Enmont : seurt danvez/isseurt pe seurt danvez, evel <code>skeudenn/jpeg</code>.",
        "mimetype": "Seurt MIME :",
        "download": "pellgargañ",
        "unwatchedpages": "Pajennoù n'int ket evezhiet",
        "listredirects": "Roll an adkasoù",
        "listduplicatedfiles": "Roll restroù gant doublennoù",
+       "listduplicatedfiles-summary": "Hemañ zo ur roll restroù m'eo stumm diwezhañ ur restr un eilad eus stumm diwezhañ ur restr bennak all. Ne vez kemeret e kont nemet ar restroù lec'hel.",
+       "listduplicatedfiles-entry": "[[$3|{{PLURAL:$2|un doubl|$2 doubl}}]] en deus [[:File:$1|$1]].",
        "unusedtemplates": "Patromoù dizimplij",
        "unusedtemplatestext": "Rollet eo amañ an holl bajennoù zo en esaouenn anv \"{{ns:template}}\" ha n'int ket implijet war pajenn ebet. Ho pet soñj da wiriañ mat hag-eñ n'eus ket liammoù all war-du ar patromoù-se a-raok diverkañ anezho.",
        "unusedtemplateswlh": "liammoù all",
        "statistics-users-active-desc": "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
        "pageswithprop": "Pajennoù gant ur perzh pajenn",
        "pageswithprop-legend": "Pajennoù gant ur perzh pajenn",
+       "pageswithprop-text": "Rollañ a ra ar bajenn-mañ ar pajennoù a ra gant ur perzh pajenn dibar",
        "pageswithprop-prop": "Anv ar perzh :",
        "pageswithprop-submit": "Mont",
        "pageswithprop-prophidden-long": "talvoud perzh testenn hir kuzhet ($1)",
+       "pageswithprop-prophidden-binary": "Talvoud perzh binarel kuzhet ($1)",
        "doubleredirects": "Adkasoù doubl",
        "doubleredirectstext": "Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.\nWar bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal \"gwirion\" a zlefe an adkas kentañ kas di.\nDiskoulmet eo bet an enmontoù <del>barrennet</del>.",
        "double-redirect-fixed-move": "Dilec'hiet eo [[$1]].\nHizivaet eo bet ent emgefre ha bremañ ez adkas da [[$2]].",
        "uncategorizedcategories": "Rummadoù dirumm",
        "uncategorizedimages": "Restroù hep rummad",
        "uncategorizedtemplates": "Patromoù hep rummad",
+       "uncategorized-categories-exceptionlist": " # Ur roll rummadoù zo ennañ na zlefent ket bezañ meneget war Special:UncategorizedCategories. Unan dre linenn, en ur gregiñ gant \"*\". Ne vez ket kemeret e kont al linennoù a grog gant un arouezenn all (zoken gant esaouennoù c'houllo). Ober gant \"#\" evit ouzhpennañ evezhiadennoù.",
        "unusedcategories": "Rummadoù dizimplij",
        "unusedimages": "Skeudennoù en o-unan",
        "wantedcategories": "Rummadoù goulennet a vank",
        "wantedpages": "Pajennoù goulennet ar muiañ",
+       "wantedpages-summary": "Roll ar pajennoù a vank, gant ar muiañ a liammoù o kas war o zu, hep kontañ ar pajennoù n'eus nemet adkasoù o kas war o zu. Evit kaout roll ar pajennoù a vank gant adkasoù o kas war o zu, sellet ouzh [[{{#special:BrokenRedirects}}|roll an adkasoù a-dreuz]].",
        "wantedpages-badtitle": "Titl direizh er strollad disoc'hoù : $1",
        "wantedfiles": "Restroù a vank",
        "wantedfiletext-cat": "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se. Ouzhpenn-se emañ renablet an holl bajennoù zo enno restroù n'eus ket anezho e [[:$1]].",
        "deadendpagestext": "Ar pajennoù da-heul n'int ket liammet ouzh pajenn ebet all eus {{SITENAME}}.",
        "protectedpages": "Pajennoù gwarezet",
        "protectedpages-indef": "Gwarezoù da badout hepken",
+       "protectedpages-summary": "Rollañ a ra ar bajenn-mañ ar pajennoù zo gwarezet evit ar mare. Evit kaout roll ar pajennoù n'haller ket krouiñ, sellet ouzh [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Gwarez dre skalierad hepken",
        "protectedpages-noredirect": "Kuzhat an adkasoù",
        "protectedpagesempty": "N'eus pajenn gwarezet ebet gant an arventennoù-mañ evit poent.",
        "protectedpages-unknown-timestamp": "Dianav",
        "protectedpages-unknown-performer": "Implijer dianav",
        "protectedtitles": "Titloù gwarezet",
+       "protectedtitles-summary": "Rollañ a ra ar bajenn-mañ an titloù n'haller ket implijout evit krouiñ pajennoù. Evit kaout roll ar pajennoù krouet gwarezet, sellet ouzh [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
        "protectedtitles-submit": "Diskwel an titloù",
        "listusers": "Roll an implijerien",
        "apihelp": "Skoazell an API",
        "apihelp-no-such-module": "N'eo ket bet kavet ar vodulenn \"$1\".",
        "apisandbox": "Poull-traezh API",
+       "apisandbox-jsonly": "Rekis eo JavaScript evit implijout poull-traezh an API.",
        "apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
-       "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ '''servij Web API MediaWiki'''.\nKit da deuler ur sell war [https://www.mediawiki.org/wiki/API:Main_page titouroù an API] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bennbajenn]. Dibabit un oberiadenn bennak evit gwelet skouerioù all",
+       "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ <strong>servij Web API MediaWiki</strong>.\nKit da deuler ur sell war [[mw:API:Main page|teuliadur API]] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bajenn zegemer]. Dibabit un oberiadenn bennak evit gwelet skouerioù all.\n\nNotit mat : ha pa vefe ar bajenn-mañ ur poull-traezh, an oberiadennoù a rit amañ a c'hall kemmañ ar wiki.",
+       "apisandbox-fullscreen": "Dispakañ ar banell",
+       "apisandbox-fullscreen-tooltip": "Brasaat panell ar poull-traezh evit leuniañ prenestr ar merdeer.",
        "apisandbox-unfullscreen": "Diskouez ar bajenn",
+       "apisandbox-unfullscreen-tooltip": "Bihanaat panell ar poull-traezh evit ma vefe hegerz liammoù merdeiñ MediaWiki.",
        "apisandbox-submit": "Sevel ar goulenn",
        "apisandbox-reset": "Riñsañ",
        "apisandbox-retry": "Klask en-dro",
+       "apisandbox-loading": "O kargañ titouroù modulenn \"$1\" an API...",
+       "apisandbox-load-error": "C'hoarvezet ez eus ur fazi en ur gargañ modulenn \"$1\" an API : $2",
+       "apisandbox-no-parameters": "N'eus arventenn ebet d'ar vodulenn API-mañ.",
        "apisandbox-helpurls": "Liammoù skoazell",
        "apisandbox-examples": "Skouerioù",
        "apisandbox-dynamic-parameters": "Arventenn ouzhpenn",
        "apisandbox-dynamic-parameters-add-label": "Ouzhpennañ un arventenn:",
        "apisandbox-dynamic-parameters-add-placeholder": "Anv an arventenn",
+       "apisandbox-dynamic-error-exists": "Bez' ez eus c'hoazh eus un arventenn anvet \"$1\".",
+       "apisandbox-deprecated-parameters": "Arventennoù dispredet",
+       "apisandbox-fetch-token": "Leuniañ emgefre ar jedouer",
+       "apisandbox-submit-invalid-fields-title": "Direizh eo maeziennoù zo",
+       "apisandbox-submit-invalid-fields-message": "Reizhit ar maeziennoù merket ha klaskit en-dro.",
        "apisandbox-results": "Disoc'hoù",
+       "apisandbox-sending-request": "O kas ur reked API...",
+       "apisandbox-loading-results": "O resev ur reked API...",
+       "apisandbox-results-error": "C'hoarvezet ez eus ur fazi en ur gargañ respont ar reked API : $1.",
+       "apisandbox-request-selectformat-label": "Diskouez roadennoù ar reked evel :",
+       "apisandbox-request-format-url-label": "Neudennad reked an URL",
        "apisandbox-request-url-label": "Goulenn URL :",
-       "apisandbox-request-time": "Pad ar goulenn: $1",
+       "apisandbox-request-json-label": "Goulenn JSON :",
+       "apisandbox-request-time": "Pad ar goulenn : {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Reizhañ ar jedouer ha kas en-dro",
+       "apisandbox-results-fixtoken-fail": "N'eus ket bet gallet adtapout ar jedouer \"$1\".",
+       "apisandbox-alert-page": "Direizh eo maeziennoù ar bajenn-mañ.",
+       "apisandbox-alert-field": "Talvoud ar vaezienn-mañ n'eo ket reizh.",
        "apisandbox-continue": "Kenderc'hel",
        "apisandbox-continue-clear": "Riñsañ",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} a [https://www.mediawiki.org/wiki/API:Query#Continuing_queries gendalc'ho] ar reked diwezhañ ; {{int:apisandbox-continue-clear}} a ziverko an arventennoù a denn d'ar c'hendalc'h.",
+       "apisandbox-param-limit": "Merkañ <kbd>max</kbd> evit ober gant ar vevenn vrasañ.",
        "apisandbox-multivalue-all-namespaces": "$1 (An holl esaouennoù anv)",
        "apisandbox-multivalue-all-values": "$1 (An holl dalvoudoù)",
        "booksources": "Oberennoù dave",
        "booksources-search": "Klask",
        "booksources-text": "Ur roll liammoù a gas da lec'hiennoù all ma werzher levrioù kozh ha nevez a gavot a-is; marteze e kavot eno titouroù pelloc'h war al levrioù a glaskit :",
        "booksources-invalid-isbn": "Evit doare n'eo ket reizh an ISBN merket; gwiriit ha n'oc'h ket faziet en ur eilañ adal ar vammenn orin.",
+       "magiclink-tracking-rfc": "Pajennoù a ra gant liammoù hud RFC",
+       "magiclink-tracking-rfc-desc": "Ober a ra ar bajenn-mañ gant liammoù hud RFC. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
+       "magiclink-tracking-pmid": "Pajennoù a ra gant liammoù hud PMID",
+       "magiclink-tracking-pmid-desc": "Ober a ra ar bajenn-mañ gant liammoù hud PMID. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
        "magiclink-tracking-isbn": "Pajennoù a ra gant liammoù burzhudus ISBN",
+       "magiclink-tracking-isbn-desc": "Ober a ra ar bajenn-mañ gant liammoù hud ISBN. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
        "specialloguserlabel": "Implijer :",
-       "speciallogtitlelabel": "Bukadenn (titl pe implijer) :",
+       "speciallogtitlelabel": "Pal (titl pe {{ns:user}}:anv implijer) :",
        "log": "Marilhoù",
        "logeventslist-submit": "Diskouez",
        "all-logs-page": "An holl varilhoù foran",
        "logempty": "Goullo eo istor ar bajenn-mañ.",
        "log-title-wildcard": "Klask an titloù a grog gant an destenn-mañ",
        "showhideselectedlogentries": "Diskouez/kuzhat penngerioù ar marilh bet diuzet",
+       "log-edit-tags": "Kemmañ tikedennoù an enmontoù marilh diuzet",
        "checkbox-select": "Diuzañ : $1",
        "checkbox-all": "An holl",
        "checkbox-none": "Hini ebet",
        "activeusers-intro": "Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.",
        "activeusers-count": "$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ",
        "activeusers-from": "Diskouez an implijerien adal :",
+       "activeusers-groups": "Diskouez an implijerien zo ezel eus ar strolladoù :",
+       "activeusers-excludegroups": "Skarzhañ an implijerien ezel eus ar strolladoù :",
        "activeusers-noresult": "N'eus bet kavet implijer ebet.",
+       "activeusers-submit": "Diskouez an implijerien oberiant",
        "listgrouprights": "Gwirioù ar strolladoù implijer",
        "listgrouprights-summary": "Da-heul ez eus ur roll eus ar strolladoù implijerien termenet war ar wiki-mañ, gant ar gwirioù moned stag outo.\nGallout a ra bezañ [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]] diwar-benn ar gwirioù hiniennel.",
        "listgrouprights-key": "Alc'hwez :\n* <span class=\"listgrouprights-granted\">Gwirioù grataet</span>\n* <span class=\"listgrouprights-revoked\">Gwirioù lamet</span>",
        "listgrouprights-removegroup-self": "Gallout a ra tennañ {{PLURAL:$2|ar strollad|strolladoù}} eus kont an-unan : $1",
        "listgrouprights-addgroup-self-all": "Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
+       "listgrouprights-namespaceprotection-header": "Strishadurioù esaouennoù anv",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
        "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
        "listgrants": "Aotreoù",
        "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
        "trackingcategories-desc": "Dezverkoù evit degemer rummadoù",
+       "restricted-displaytitle-ignored": "Pajennoù gant titloù diskwel lezet a-gostez",
+       "restricted-displaytitle-ignored-desc": "Ar bajenn-mañ zo dezhi un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> zo bet laosket a-gostez peogwir n'eo ket kevatal d'an titl zo d'ar bajenn bremañ.",
+       "noindex-category-desc": "Ar bajenn-mañ n'eo ket menegeret gant ar robotoù rak ar ger hud <code><nowiki>__NOINDEX__</nowiki></code> zo enni hag emañ en un esaouenn anv m'eo aotreet ar merkañ.",
        "broken-file-category-desc": "Er bajenn-mañ ez eus ul liamm restr torr (ul liamm da enframmañ ur restr pa n'eus ket eus ar restr-se).",
        "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
        "trackingcategories-disabled": "Diweredekaet eo ar rummad",
        "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
        "watchlist-hide": "Kuzhat",
        "watchlist-submit": "Diskouez",
+       "wlshowtime": "Prantad amzer war wel :",
        "wlshowhideminor": "kemmoù dister",
        "wlshowhidebots": "robotoù",
        "wlshowhideliu": "implijerien enrollet",
        "wlshowhideanons": "implijerien dizanv",
+       "wlshowhidepatr": "kemmoù gwiriet",
        "wlshowhidemine": "ma c'hemmoù",
+       "wlshowhidecategorization": "rummatadur ar bajenn",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "unwatching": "Paouez da evezhiañ...",
        "rollbacklinkcount": "disteurel $1 {{PLURAL:$1|kemm}}",
        "rollbacklinkcount-morethan": "disteurel ouzhpenn $1 {{PLURAL:$1|kemm}}",
        "rollbackfailed": "C'hwitet eo bet an distaoladenn",
+       "rollback-missingparam": "Arventennoù rekis d'ar reked a vank.",
+       "rollback-missingrevision": "Dibosupl kargañ roadennoù ar stumm.",
        "cantrollback": "Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ",
        "alreadyrolled": "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkemmet pe distaolet eo bet c'hoazh gant unan bennak all.\n\nAr c'hemm diwezhañ d'ar bajenn-mañ a oa bet graet gant [[User:$3|$3]] ([[User talk:$3|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Diverradenn ar c'hemm a oa : <em>$1</em>.",
        "rollback-success": "Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.",
        "sessionfailure-title": "Fazi dalc'h",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
+       "changecontentmodel": "Cheñch patrom danvez ur bajenn",
+       "changecontentmodel-legend": "Cheñch ar patrom danvez",
        "changecontentmodel-title-label": "Anv ar bajenn",
+       "changecontentmodel-model-label": "Patrom danvez nevez",
        "changecontentmodel-reason-label": "Abeg :",
        "changecontentmodel-submit": "Kemmañ",
+       "changecontentmodel-success-title": "Cheñchet eo bet ar patrom danvez",
+       "changecontentmodel-success-text": "Kemmet eo bet patrom danvez [[:$1]].",
+       "changecontentmodel-cannot-convert": "N'hall ket danvez [[:$1]] bezañ troet en ur seurt $2.",
+       "changecontentmodel-emptymodels-title": "N'eus patrom danvez hegerz ebet",
        "logentry-contentmodel-change-revertlink": "disteuler",
        "logentry-contentmodel-change-revert": "disteuler",
        "protectlogpage": "Log_gwareziñ",
        "block-log-flags-hiddenname": "anv implijer kuzhet",
        "range_block_disabled": "Diweredekaet eo bet ar stankañ stuc'hadoù IP.",
        "ipb_expiry_invalid": "amzer termen direizh.",
+       "ipb_expiry_old": "Tremenet eo an termen echuiñ.",
        "ipb_expiry_temp": "Peurbadus e rank bezañ bloc'hadoù an implijerien guzh.",
        "ipb_hide_invalid": "Ne c'haller ket dilemel ar gont-mañ : Ouzhpenn {{PLURAL:$1|ur c'hemm|$1 kemm}} zo enni.",
        "ipb_already_blocked": "Stanket eo \"$1\" dija",
        "thumbnail-temp-create": "Dibosupl krouiñ ur restr vunut padennek",
        "thumbnail-dest-create": "Dibosupl enrollañ ar munud.",
        "thumbnail_invalid_params": "Arventennoù direizh evit ar munud",
+       "thumbnail_toobigimagearea": "Restr brasoc'h e ventoù eget $1",
        "thumbnail_dest_directory": "Dibosupl krouiñ ar c'havlec'h pal",
        "thumbnail_image-type": "N'eo ket skoret ar seurt skeudennoù",
        "thumbnail_gd-library": "Kefluniadur diglok al levraoueg GD : dibosupl kavout an arc'hwel $1",
        "import-interwiki-history": "Eilañ holl stummoù istor ar bajenn-mañ",
        "import-interwiki-templates": "Lakaat e-barzh an holl batromoù",
        "import-interwiki-submit": "Enporzhiañ",
+       "import-mapping-default": "Enporzhiañ d'al lec'hiadurioù dre ziouer",
+       "import-mapping-namespace": "Enporzhiañ d'un esaouenn anv :",
        "import-upload-filename": "Anv ar restr :",
        "import-comment": "Notenn :",
        "importtext": "Ezporzhiit ar restr adal ar wiki orin en ur ober gant an arc'hwel [[Special:Export|ezporzhiañ]].\nEnrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|adweladenn}} enporzhiet eus $2",
        "javascripttest": "Amprouadenn JavaScript",
+       "javascripttest-pagetext-unknownaction": "Obererezh dianav \"$1\".",
        "javascripttest-qunit-intro": "Sellet ouzh [$1 an teulioù amprouiñ] e mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Ho pajenn}} implijer",
        "tooltip-pt-anonuserpage": "Ar bajenn implijer evit ar c'homlec'h IP implijet ganeoc'h",
        "tooltip-pt-preferences": "{{GENDER:|Ma}} fenndibaboù",
        "tooltip-pt-watchlist": "Roll ar pajennoù evezhiet ganeoc'h.",
        "tooltip-pt-mycontris": "Roll ho tegasadennoù",
+       "tooltip-pt-anoncontribs": "Ur roll eus ar c'hemmoù graet adalek ar chomlec'h IP-mañ",
        "tooltip-pt-login": "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ",
        "tooltip-pt-logout": "Digevreañ",
        "tooltip-pt-createaccount": "Erbedet eo deoc'h krouiñ ur gont ha kevreañ ; n'eo ket ret koulskoude.",
        "tooltip-feed-rss": "Magañ ar red RSS evit ar bajenn-mañ",
        "tooltip-feed-atom": "Magañ ar red Atom evit ar bajenn-mañ",
        "tooltip-t-contributions": "Gwelet roll degasadennoù {{GENDER:$1|this user}} an implijer-mañ",
-       "tooltip-t-emailuser": "Kas ur postel d'an implijer-mañ",
+       "tooltip-t-emailuser": "Kas ur postel d'an {{GENDER:$1|implijer-mañ|implijerez-mañ}}",
        "tooltip-t-info": "Titouroù ouzhpenn a-zivout ar bajenn-mañ",
        "tooltip-t-upload": "Enporzhiañ ur skeudenn pe ur restr media war ar servijer",
        "tooltip-t-specialpages": "Roll an holl bajennoù dibar",
        "lastmodifiedatby": "Kemmet eo bet ar bajenn-mañ da ziwezhañ da $2, d'an $1 gant $3",
        "othercontribs": "Diazezet war labour $1.",
        "others": "re all",
-       "siteusers": "$1 {{PLURAL:$2|implijer|implijer}} eus {{SITENAME}}",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|An implijer|An implijerez}}|{{GENDER:$1|An implijerien|An implijerezed}}}} $1 eus {{SITENAME}}",
        "anonusers": "{{PLURAL:$2|implijer dizanv|implijerien dizanv}} $1 eus {{SITENAME}}",
        "creditspage": "Pajennoù kredoù",
        "nocredits": "N'eus tamm titour kred hegerz ebet evit ar bajenn-mañ.",
        "pageinfo-robot-index": "Aotreet",
        "pageinfo-robot-noindex": "Diaotreet",
        "pageinfo-watchers": "Niver a dud o heuliañ",
+       "pageinfo-visiting-watchers": "Niver a dud oc'h evezhiañ ar bajenn-mañ o deus sellet ouzh ar c'hemmoù diwezhañ bet graet enni",
        "pageinfo-few-watchers": "Nebeutoc'h eget $1 {{PLURAL:$1|lenner}}",
        "pageinfo-redirects-name": "Niver a adkasoù war-zu ar bajenn-mañ",
        "pageinfo-subpages-name": "Ispajennoù eus ar bajenn-mañ",
        "pageinfo-contentpage-yes": "Ya",
        "pageinfo-protect-cascading-yes": "Ya",
        "pageinfo-category-info": "Titouroù ar rummad",
+       "pageinfo-category-total": "Niver hollek a izili",
        "pageinfo-category-pages": "Niver a bajennoù",
        "pageinfo-category-subcats": "Niver a isrummadoù",
        "pageinfo-category-files": "Niver a restroù",
        "patrol-log-page": "Log gwiriañ",
        "patrol-log-header": "Setu ur marilh eus ar stummoù patrouilhet.",
        "log-show-hide-patrol": "$1 istor ar stummoù gwiriet",
+       "log-show-hide-tag": "$1 marilh an dikedenn",
        "confirm-markpatrolled-button": "Mat eo",
        "deletedrevision": "Diverket stumm kozh $1.",
        "filedeleteerror-short": "Fazi e-ser diverkañ ar restr : $1",
        "exif-compression-4": "CCITT Strollad 4 kodañ ar pelleiler",
        "exif-copyrighted-true": "Pep gwir miret strizh",
        "exif-copyrighted-false": "Domani foran",
+       "exif-photometricinterpretation-1": "Gwenn ha du (0 zo evit du)",
        "exif-unknowndate": "Deiziad dianav",
        "exif-orientation-1": "Boutin",
        "exif-orientation-2": "Eilpennet a-hed",
        "confirmemail_body_set": "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP $1,\nen deus enrollet ur gont \"$2\" gant ar chomlec'h postel-mañ war lec'hienn {{SITENAME}}.\n\nEvit kadarnaat eo deoc'h ar gont-se ha gweredekaat en-dro\nan arc'hwelioù postelerezh war {{SITENAME}}, digorit al liamm-mañ en ho merdeer :\n\n$3\n\nMa n'eo *ket* deoc'h ar gont heuilhit al liamm-mañ\nevit nullañ kadarnaat ar chomlec'h postel :\n\n$5\n\nMont a raio ar c'hod-mañ d'e dermen d'ar $4.",
        "confirmemail_invalidated": "Nullet eo bet kadarnaat ar chomlec'h postel",
        "invalidateemail": "Nullañ kadarnaat ar postel",
+       "notificationemail_subject_changed": "Cheñchet eo bet ar chomlec'h postel enrollet e {{SITENAME}}",
+       "notificationemail_subject_removed": "Lamet eo bet ar chomlec'h postel enrollet e {{SITENAME}}",
        "scarytranscludedisabled": "[Diweredekaet eo an treuzkludañ etrewiki]",
        "scarytranscludefailed": "[N'eus ket bet gallet tapout ar patrom evit $1]",
        "scarytranscludefailed-httpstatus": "[c'hwitet adtapout ar patrom evit $1: HTTP $2]",
        "version-extensions": "Astennoù staliet",
        "version-skins": "Gwiskadurioù staliet",
        "version-specialpages": "Pajennoù dibar",
-       "version-parserhooks": "Galvoù dielfennañ",
+       "version-parserhooks": "Astennoù an dielfenner",
        "version-variables": "Argemmennoù",
        "version-antispam": "Mirout ouzh ar strob",
        "version-other": "Diseurt",
        "version-mediahandlers": "Merer danvez liesvedia",
-       "version-hooks": "Galvoù",
-       "version-parser-extensiontags": "Balizenn dielfennañ o tont eus an astennoù",
-       "version-parser-function-hooks": "Galv an arc'hwelioù dielfennañ",
+       "version-hooks": "Krogoù",
+       "version-parser-extensiontags": "Tikedenn astennet an dielfenner ereadurel",
+       "version-parser-function-hooks": "Arc'hwelioù astennet an dielfenner ereadurel",
        "version-hook-name": "Anv ar galv",
        "version-hook-subscribedby": "Termenet gant",
        "version-version": "($1)",
        "blankpage": "Pajenn c'houllo",
        "intentionallyblankpage": "A-ratozh e leusker gwenn ar bajenn-mañ",
        "external_image_whitelist": "  #Lezel al linenn-mañ tre evel m'emañ<pre>\n#Merkañ an tammoù bommoù reoliek (ar rann zo etre ar // nemetken) a-is\n#Klotañ a raint gant URLoù ar skeudennoù diavaez (gourliammet)\n#En em ziskwel evel skeudennoù a raio ar re a glot, evit ar re all e vo diskwelet ul liamm war-du ar skeudenn nemetken\n#Sellet e vo ouzh a linennoù a grog gant # evel ouzh notennoù\n#Kizidik eo ar roll-mañ ouzh an diforc'h etre lizherennoù bihan ha lizherennoù bras\n\n#Merkit holl rannoù ar bommoù reoliek a-us d'al linenn-mañ. Lezit al linenn ziwezhañ-mañ tre evel m'emañ</pre>",
-       "tags": "Balizennoù ar c'hemmoù reizh",
-       "tag-filter": "Silañ ar [[Special:Tags|balizennoù]] :",
+       "tags": "Tikedennoù ar c'hemmoù reizh",
+       "tag-filter": "Silañ an [[Special:Tags|tikedennoù]] :",
        "tag-filter-submit": "Silañ",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Balizenn}}]]: $2)",
-       "tags-title": "Balizennoù",
-       "tags-intro": "Rollañ a ra ar bajenn-mañ ar balizennoù a c'hall ar meziant implijout da verkañ kemmoù hag an dalvoudegezh anezho.",
-       "tags-tag": "Anv ar valizenn",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Dikedenn|Tikedenn}}]] : $2)",
+       "tag-mw-contentmodelchange": "cheñch ar patrom danvez",
+       "tags-title": "Tikedennoù",
+       "tags-intro": "Rollañ a ra ar bajenn-mañ an tikedennoù a c'hall ar meziant implijout da verkañ kemmoù hag o zalvoudegezh.",
+       "tags-tag": "Anv an dikedenn",
        "tags-display-header": "Neuz e rolloù ar c'hemmoù",
-       "tags-description-header": "Deskrivadur klok ar valizenn",
+       "tags-description-header": "Deskrivadur klok an dalvoudegezh",
        "tags-source-header": "Mammenn",
        "tags-active-header": "Oberiant ?",
        "tags-hitcount-header": "Kemmoù balizennet",
        "tags-actions-header": "Oberoù",
        "tags-active-yes": "Ya",
        "tags-active-no": "Ket",
+       "tags-source-extension": "Termenet gant ar meziant",
+       "tags-source-none": "N'emañ ket en implij ken",
        "tags-edit": "aozañ",
        "tags-delete": "diverkañ",
        "tags-activate": "gweredekaat",
        "tags-deactivate": "diweredekaat",
        "tags-hitcount": "$1 {{PLURAL:$1|kemm|kemm}}",
+       "tags-manage-no-permission": "N'oc'h ket aotreet da verañ ar c'hemmañ tikedennoù.",
+       "tags-manage-blocked": "N'hallit ket merañ ar c'hemmañ tikedennoù e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
        "tags-create-heading": "Krouiñ un dikedenn nevez",
        "tags-create-tag-name": "Anv an dikedenn :",
        "tags-create-reason": "Abeg :",
        "tags-create-submit": "Krouiñ",
        "tags-create-no-name": "Rekis eo merkañ anv un dikedenn.",
+       "tags-create-already-exists": "Bez' ez eus eus an tikedenn \"$1\" c'hoazh.",
+       "tags-create-warnings-below": "Kenderc'hel da grouiñ an dikedenn a fell deoc'h ?",
        "tags-delete-title": "Diverkañ an dikedenn",
        "tags-delete-reason": "Abeg :",
+       "tags-delete-not-found": "N'eus ket eus an dikedenn \"$1\".",
+       "tags-activate-title": "Gweredekaat an dikedenn",
        "tags-activate-reason": "Abeg :",
        "tags-activate-submit": "Gweredekaat",
+       "tags-deactivate-title": "Diweredekaat an dikedenn",
        "tags-deactivate-reason": "Abeg :",
        "tags-deactivate-submit": "Diweredekaat",
+       "tags-edit-title": "Kemmañ an tikedennoù",
+       "tags-edit-manage-link": "Merañ an tikedennoù",
        "tags-edit-existing-tags": "Tikedennoù zo anezho :",
        "tags-edit-existing-tags-none": "<em>Hini ebet</em>",
        "tags-edit-new-tags": "Tikedennoù nevez :",
        "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "rightsnone": "(netra)",
        "revdelete-summary": "diverradenn eus ar c'hemmoù",
+       "rightslogentry-temporary-group": "$1 (da c'hortoz, betek $2)",
        "feedback-adding": "Oc'h ouzhpennañ ho soñj war ar bajenn...",
        "feedback-back": "Distreiñ",
        "feedback-bugcheck": "Eus ar c'hentañ ! Gwiriit mat n'emañ ket e-touez an [$1 draen diskoachet c'hoazh].",
        "api-error-emptypage": "N'eo ket aotreet krouiñ pajennoù goullo.",
        "api-error-publishfailed": "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
        "api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
-       "api-error-unknown-warning": "Kemenn diwall dianav : $1",
+       "api-error-unknown-warning": "Kemenn-diwall dianav : \"$1\".",
        "api-error-unknownerror": "Fazi dianav : \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|eilenn|eilenn}}",
        "duration-minutes": "$1 {{PLURAL:$1|munut|munut}}",
        "expand_templates_html_output": "Disoc'h HTML kriz",
        "expand_templates_ok": "Mat eo",
        "expand_templates_remove_comments": "Lemel an notennoù kuit",
-       "expand_templates_remove_nowiki": "Diverkañ a ra ar balizennoù <nowiki> en disoc'h",
+       "expand_templates_remove_nowiki": "Diverkañ a ra an tikedennoù <nowiki> en disoc'h",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
        "pagelang-language": "Yezh",
        "pagelang-use-default": "Implijout ar yezh dre ziouer",
        "pagelang-select-lang": "Dibab ar yezh",
+       "pagelang-reason": "Abeg",
        "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.",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
-       "log-name-pagelang": "Cheñch yezh",
+       "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 evit $3 eus $4 da $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn $3 eus $4 da $5.",
        "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",
        "special-characters-group-ipa": "LFE (IPA)",
        "special-characters-group-symbols": "Arouezennoù",
        "special-characters-group-greek": "Gresianek",
+       "special-characters-group-greekextended": "Gresianeg astennet",
        "special-characters-group-cyrillic": "Kirillek",
        "special-characters-group-arabic": "Arabeg",
        "special-characters-group-arabicextended": "Arabeg astennet",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
        "special-characters-group-khmer": "Khmer",
+       "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...",
+       "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.",
        "randomrootpage": "Pajenn wrizienn dargouezhek",
        "log-action-filter-block": "Seurt bloc'had :",
+       "log-action-filter-contentmodel": "Mod kemmañ ar patrom danvez :",
+       "log-action-filter-delete": "Mod diverkañ :",
+       "log-action-filter-import": "Seurt enporzhiadur :",
+       "log-action-filter-managetags": "Mod embreger ar merañ tikedennoù :",
+       "log-action-filter-move": "Mod dilec'hiañ :",
+       "log-action-filter-newusers": "Seurt krouidigezh kont :",
+       "log-action-filter-patrol": "Mod evezhiañ :",
+       "log-action-filter-protect": "Mod gwareziñ :",
+       "log-action-filter-rights": "Mod kemmañ ar gwirioù :",
+       "log-action-filter-suppress": "Mod dilemel :",
+       "log-action-filter-upload": "Mod enporzhiañ :",
        "log-action-filter-all": "An holl",
        "log-action-filter-block-block": "Stankañ",
+       "log-action-filter-block-reblock": "Stankañ ar c'hemm",
        "log-action-filter-block-unblock": "Distankañ",
+       "log-action-filter-contentmodel-change": "Cheñch ar patrom danvez",
+       "log-action-filter-contentmodel-new": "Krouiñ pajennoù gant ur patrom danvez n'eo ket raktermenet",
+       "log-action-filter-delete-delete": "Diverkañ pajennoù",
+       "log-action-filter-delete-delete_redir": "Adkas ar frikañ",
+       "log-action-filter-delete-restore": "Diziverkañ pajennoù",
+       "log-action-filter-delete-event": "Diverkañ ar marilh",
+       "log-action-filter-delete-revision": "Diverkañ an adweladennoù",
+       "log-action-filter-import-interwiki": "Enporzh Treuzwiki",
+       "log-action-filter-import-upload": "Enporzh dre bellgarg XML",
+       "log-action-filter-managetags-create": "Krouiñ tikedenn",
+       "log-action-filter-managetags-delete": "Diverkañ tikedenn",
+       "log-action-filter-managetags-activate": "Gweredekaat tikedenn",
+       "log-action-filter-managetags-deactivate": "Diweredekaat tikedenn",
+       "log-action-filter-move-move": "Dilec'hiañ hep frikañ an adkasoù",
+       "log-action-filter-move-move_redir": "Dilec'hiañ en ur frikañ an adkasoù",
+       "log-action-filter-newusers-create": "Krouiñ gant un implijer dizanv",
+       "log-action-filter-newusers-create2": "Krouiñ gant un implijer enrollet",
+       "log-action-filter-newusers-autocreate": "Krouiñ ent emgefre",
+       "log-action-filter-newusers-byemail": "Krouiñ gant ur ger-tremen kaset dre bostel",
+       "log-action-filter-patrol-patrol": "Gwiriet gant an dorn",
+       "log-action-filter-patrol-autopatrol": "Gwiriet ent emgefre",
        "log-action-filter-protect-protect": "Gwarez",
+       "log-action-filter-protect-modify": "Cheñchamant er gwarez",
        "log-action-filter-protect-unprotect": "Diwarez",
+       "log-action-filter-protect-move_prot": "Gwarez dilec'hiañ",
+       "log-action-filter-rights-rights": "Cheñchamant graet gant an dorn",
        "log-action-filter-rights-autopromote": "Kemm emgefre",
+       "log-action-filter-suppress-event": "Diverkañ marilhoù",
+       "log-action-filter-suppress-revision": "Diverkañ adweladennoù",
+       "log-action-filter-suppress-delete": "Diverkañ pajennoù",
+       "log-action-filter-suppress-block": "Diverkañ implijerien dre stankadennoù",
+       "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-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
        "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-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-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
        "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
        "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
        "authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+       "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-retype-help": "Adkadarnaat ar ger-tremen.",
        "authmanager-email-label": "Postel",
        "authmanager-email-help": "Chomlec'h postel",
        "authmanager-realname-help": "Anv gwir an implijer",
        "authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
        "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-request-label": "Kontoù a zlefe bezañ liammet",
        "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
        "authprovider-resetpass-skip-label": "Lammat",
        "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
        "specialpage-securitylevel-not-allowed-title": "Berzet",
        "authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
        "authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+       "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",
        "cannotauth-not-allowed": "N'oc'h ket aotreet d'ober gant ar bajenn-mañ",
        "changecredentials": "Kemmañ an titouroù kred",
        "changecredentials-submit": "Kemmañ an titouroù kred",
        "changecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "changecredentials-success": "Cheñchet eo bet ho titouroù anaout.",
        "removecredentials": "Lemel an titouroù kred",
        "removecredentials-submit": "Lemel an aotreoù",
        "removecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "removecredentials-success": "Lamet kuit eo bet ho titouroù anaout.",
        "credentialsform-provider": "Seurt titouroù kred :",
        "credentialsform-account": "Anv ar gont :",
        "cannotlink-no-provider-title": "N'eus kont ebet da liammañ",
        "linkaccounts-submit": "Liammañ ar c'hontoù",
        "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.",
+       "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"
 }
index 4b000e2..3bef8c9 100644 (file)
@@ -23,7 +23,8 @@
                        "Emir Mujadzic",
                        "Srdjan m",
                        "Semso98",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podvuci veze:",
@@ -40,7 +41,7 @@
        "tog-watchcreations": "Dodaj stranice i datoteke koje napravim na moj spisak praćenih članaka",
        "tog-watchdefault": "Dodaj stranice i datoteke koje uređujem na moj spisak praćenih članaka",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenih članaka",
-       "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenih članaka",
+       "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem na moj spisak praćenja",
        "tog-watchuploads": "Dodaj datoteke koje postavim na moj spisak praćenja",
        "tog-watchrollback": "Sve stranice za koje sam izvršio povrat izmjena stavi na spisak praćenja",
        "tog-minordefault": "Označi sve izmjene manjim isprva",
@@ -74,7 +75,7 @@
        "underline-default": "Prema predodređenim postavkama teme ili preglednika",
        "editfont-style": "Stil fonta u okviru za uređivanje:",
        "editfont-default": "Po postavkama preglednika",
-       "editfont-monospace": "Slova sa jednostrukim razmakom",
+       "editfont-monospace": "Neproporcionalni font",
        "editfont-sansserif": "Beserifni font",
        "editfont-serif": "Serifni font",
        "sunday": "nedjelja",
        "thursday": "četvrtak",
        "friday": "petak",
        "saturday": "subota",
-       "sun": "Ned",
-       "mon": "Pon",
-       "tue": "Uto",
-       "wed": "Sri",
-       "thu": "Ä\8cet",
-       "fri": "Pet",
-       "sat": "Sub",
+       "sun": "ned",
+       "mon": "pon",
+       "tue": "uto",
+       "wed": "sri",
+       "thu": "Ä\8det",
+       "fri": "pet",
+       "sat": "sub",
        "january": "januar",
        "february": "februar",
        "march": "mart",
        "anontalk": "Razgovor",
        "navigation": "Navigacija",
        "and": "&#32;i",
-       "qbfind": "Pronađite",
+       "qbfind": "Pronađi",
        "qbbrowse": "Potraži",
        "qbedit": "Uredi",
        "qbpageoptions": "Opcije stranice",
        "searcharticle": "Idi",
        "history": "Historija stranice",
        "history_short": "Historija",
+       "history_small": "historija",
        "updatedmarker": "promjene od moje posljednje posjete",
        "printableversion": "Za štampanje",
        "permalink": "Trajni link",
        "viewdeleted_short": "Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}",
        "protect": "Zaštiti",
        "protect_change": "promijeni",
-       "protectthispage": "Zaštitite ovu stranicu",
+       "protectthispage": "Zaštiti ovu stranicu",
        "unprotect": "Promijeni zaštitu",
        "unprotectthispage": "Promijeni zaštitu ove stranice",
        "newpage": "Nova stranica",
        "views": "Pregledi",
        "toolbox": "Alati",
        "tool-link-userrights": "Promijeni {{GENDER:$1|korisničke}} grupe",
+       "tool-link-userrights-readonly": "Vidi {{GENDER:$1|korisničke}} grupe",
        "tool-link-emailuser": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici}}",
        "userpage": "Pogledaj korisničku stranicu",
        "projectpage": "Pogledaj stranicu projekta",
-       "imagepage": "Pogledajte stranicu datoteke",
+       "imagepage": "Pogledaj stranicu datoteke",
        "mediawikipage": "Pogledaj stranicu sa porukama",
-       "templatepage": "Pogledajte stranicu za šablone",
+       "templatepage": "Pogledaj stranicu za šablone",
        "viewhelppage": "Pogledajte stranicu za pomoć",
        "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledaj razgovor",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena na dan $1 u $2.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "pool-servererror": "Usluga brojača poola nije dostupna ($1).",
        "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O {{GRAMMAR:dativ|{{SITENAME}}}}",
-       "aboutpage": "Project:O_projektu_{{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",
        "currentevents": "Novosti",
        "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
-       "laggedslavemode": "'''Upozorenje''': Stranica, možda, nije ažurirana.",
+       "laggedslavemode": "<strong>Upozorenje:</strong> Moguće je da stranica nije ažurirana.",
        "readonly": "Baza je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
        "readonlytext": "Baza podataka trenutno je zaključana za nove unose i druge izmjene, vjerovatno zbog rutinskog održavanja, nakon čega će biti vraćena u uobičajeno stanje.\n\nSistemski administrator koji ju je zaključao naveo je sljedeće objašnjenje: $1",
-       "missing-article": "U bazi podataka nije pronađen tekst stranice tražen pod nazivom \"$1\" $2.\n\nDo ovoga dolazi kad se prati pomjeranje ili historija linka za stranicu koja je pobrisana.\n\n\nU slučaju da se ne radi o gore navedenom moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] s navođenjem tačne adrese stranice.",
-       "missingarticle-rev": "(revizija#: $1)",
+       "missing-article": "U bazi podataka nije pronađen tekst stranice koji je trebao biti pronađen pod nazivom \"$1\" $2.\n\nNajčešći uzrok ove greške jest zastarjela razlika izmjena ili link ka obrisanoj stranici.\n\nU slučaju da se ne radi o gore navedenom moguće je da ste pronašli grešku u programu.\nMolimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] uz odgovarajuću adresu stranice.",
+       "missingarticle-rev": "(izmjena#: $1)",
        "missingarticle-diff": "(Razlika: $1, $2)",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Interna greška: $1",
        "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
-       "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
-       "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
-       "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
+       "filecopyerror": "Ne mogu kopirati datoteku \"$1\" na \"$2\".",
+       "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
+       "filedeleteerror": "Ne mogu obrisati datoteku \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
-       "filenotfound": "Ne može se naći datoteka \"$1\".",
+       "filenotfound": "Ne mogu pronaći datoteku \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
-       "formerror": "Greška: ne može se poslati upitnik",
-       "badarticleerror": "Ova akcija ne može biti izvršena na ovoj stranici.",
-       "cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je neko već obrisao.",
-       "cannotdelete-title": "Ne mogu izbrisati stranicu \"$1\"",
+       "formerror": "Greška: ne mogu poslati upitnik.",
+       "badarticleerror": "Ova radnja se ne može izvršiti na ovoj stranici.",
+       "cannotdelete": "Ne mogu obrisati stranicu ili datoteku \"$1\".\nMoguće je da ju je neko već obrisao.",
+       "cannotdelete-title": "Ne mogu obrisati stranicu \"$1\"",
        "delete-hook-aborted": "Brisanje je prekinuo softverski priključak.\nNije ponuđeno nikakvo objašnjenje.",
        "no-null-revision": "Ne mogu napraviti novu ništavnu reviziju za stranicu \"$1\"",
        "badtitle": "Loš naslov",
        "virus-scanfailed": "skeniranje nije uspjelo (code $1)",
        "virus-unknownscanner": "nepoznati anti-virus program:",
        "logouttext": "'''Sad ste odjavljeni.'''\n\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
+       "cannotlogoutnow-title": "Odjava trenutno nije moguća",
        "welcomeuser": "Dobro došli, $1",
        "welcomecreation-msg": "Vaš nalog je napravljen.\nNe zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].",
        "yourname": "Korisničko ime:",
        "createacct-yourpasswordagain-ph": "Unesite lozinku opet",
        "userlogin-remembermypassword": "Ostavi me prijavljenog/-u",
        "userlogin-signwithsecure": "Koristite sigurnu konekciju",
+       "cannotlogin-title": "Prijava nije moguća",
+       "cannotlogin-text": "Prijava nija moguća.",
+       "cannotloginnow-title": "Prijava trenutno nije moguća",
+       "cannotcreateaccount-title": "Pravljenje računa nije moguće",
+       "cannotcreateaccount-text": "Direktno pravljenje računa nije omogućeno na ovom wikiju.",
        "yourdomainname": "Vaš domen:",
        "password-change-forbidden": "Ne možete da promjenite lozinku na ovom wikiju.",
        "externaldberror": "Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.",
        "login": "Prijavi me",
+       "login-security": "Potvrdite svoj identitet",
        "nav-login-createaccount": "Prijavi se / Registruj se",
-       "userlogin": "Prijavi se / Registruj se",
+       "userlogin": "Prijavi se / napravi račun",
        "userloginnocreate": "Prijavi se",
        "logout": "Odjavi me",
        "userlogout": "Odjavi me",
        "userlogin-reauth": "Morate se ponovo prijaviti da bismo potvrdili da ste zaista {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Napravi još jedan račun",
        "createacct-emailrequired": "Adresa e-pošte",
-       "createacct-emailoptional": "Adresa e-pošte (opcionalno)",
+       "createacct-emailoptional": "Adresa e-pošte (neobavezno)",
        "createacct-email-ph": "Unesite Vašu adresu e-pоšte",
        "createacct-another-email-ph": "Unesite adresu e-pošte",
        "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adrеsu e-pošte",
+       "createaccountmail-help": "Može se koristiti da se nekome napravi račun bez da se sazna lozinka.",
        "createacct-realname": "Pravo ime (opcionalno)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan korisnički račun?",
-       "createacct-submit": "Napravite svoj korisnički račun",
+       "createacct-reason-help": "Poruka koja se prikazuje u zapisniku stvaranja korisničkih računa",
+       "createacct-submit": "Napravi račun",
        "createacct-another-submit": "Napravi korisnički račun",
+       "createacct-continue-submit": "Nastavi sa stvaranjem računa",
+       "createacct-another-continue-submit": "Nastavi sa stvaranjem računa",
        "createacct-benefit-heading": "{{GRAMMAR:akuzativ|{{SITENAME}}}} stvaraju ljudi poput Vas.",
-       "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
-       "createacct-benefit-body3": "nedavnih {{PLURAL:$1|doprinosa}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|nedavni korisnik|nedavnih korisnika}}",
        "badretype": "Lozinke koje ste unijeli se ne poklapaju",
        "usernameinprogress": "Račun za ovo korisničko ime već se pravi. Molimo sačekajte.",
        "userexists": "Korisničko ime je već u upotrebi.\nIzaberite drugo.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Došlo je do greške pri otvaranju naloga",
-       "createaccounterror": "Ne može se napraviti račun: $1",
-       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) da bi se korisnici prijavili.\nVi ste isključili kolačiće na Vašem računaru.\nMolimo Vas da ih uključite, a onda se prijavite sa svojim novim korisničkim imenom i lozinkom.",
-       "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
+       "createaccounterror": "Ne mogu napraviti račun: $1",
+       "nocookiesnew": "Korisnički račun je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih pa se onda prijavite s novim korisničkim imenom i lozinkom.",
+       "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih i pokušajte ponovo.",
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
+       "createacct-loginerror": "Račun je uspješno napravljen, ali Vas nije bilo moguće automatski prijaviti. Prijavite se [[Special:UserLogin|ručno]].",
        "noname": "Niste izabrali ispravno korisničko ime.",
-       "loginsuccesstitle": "Prijavljen",
+       "loginsuccesstitle": "Prijava uspješna",
        "loginsuccess": "<strong>Prijavili ste se na {{GRAMMAR:akuzativ|{{SITENAME}}}} kao \"$1\".</strong>",
        "nosuchuser": "Ne postoji korisnik s imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite jeste li ga tačno upisali ili [[Special:CreateAccount|otvorite novi račun]].",
        "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "nouserspecified": "Morate izabrati korisničko ime.",
        "login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dopuštena.",
        "wrongpassword": "Lozinka koju ste unijeli je netačna.\nPokušate ponovno.",
-       "wrongpasswordempty": "Lozinka koju ste unijeli je bila prazna.\nMolimo Vas da pokušate ponovno.",
+       "wrongpasswordempty": "Niste upisali lozinku.\nPokušajte ponovo.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "passwordtoopopular": "Ovo je često korištena lozinka i ne može se koristiti. Molimo Vas da izaberete jaču lozinku.",
        "eauthentsent": "Na navedenu adresu e-pošte poslana je poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
        "throttled-mailpassword": "Već Vam je poslana e-poruka za promjenu lozinke u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedna e-poruka za promjenu lozinke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Greška pri slanju e-pošte: $1",
-       "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
+       "acct_creation_throttle_hit": "Posjetioci ovog wikija koji koriste Vašu IP-adresu već su napravili {{PLURAL:$1|$1 račun|$1 računa}} u posljednjih $2, što je najveći dozvoljeni broj u tom vremenskom periodu.\nZbog toga posjetioci s ove IP-adrese trenutno ne mogu praviti više računa.",
        "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
        "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od sljedećih.",
        "noemailprefs": "Unesite e-mail adresu za osposobljavanje slijedećih usluga.",
-       "emailconfirmlink": "Potvrdite Vašu e-mail adresu",
+       "emailconfirmlink": "Potvrdite svoju adresu e-pošte",
        "invalidemailaddress": "Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.\nMolimo vas da unesete ispravnu adresu ili ostavite prazno polje.",
        "cannotchangeemail": "Na ovom wikiju ne možete promijeniti e-mail adresu računa.",
        "emaildisabled": "Ova web-stranica ne može da šalje e-poruke.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "pt-login": "Prijavi me",
        "pt-login-button": "Prijavi me",
+       "pt-login-continue-button": "Nastavi prijavljivanje",
        "pt-createaccount": "Napravi korisnički račun",
        "pt-userlogout": "Odjavi me",
        "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
        "resetpass_submit": "Postavi lozinku i prijavi se",
        "changepassword-success": "Vaša lozinka je promijenjena.",
        "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "botpasswords": "Lozinke botova",
+       "botpasswords-disabled": "Lozinke botova su onemogućene.",
+       "botpasswords-no-central-id": "Da biste koristili lozinke botova, morate biti prijavljeni na središnji račun.",
+       "botpasswords-existing": "Postojeće lozinke botova",
+       "botpasswords-createnew": "Napravi novu lozinku bota",
+       "botpasswords-editexisting": "Uredi postojeću lozinku bota",
+       "botpasswords-label-appid": "Ime bota:",
+       "botpasswords-label-create": "Napravi",
+       "botpasswords-label-update": "Ažuriraj",
+       "botpasswords-label-cancel": "Otkaži",
+       "botpasswords-label-delete": "Obriši",
+       "botpasswords-label-resetpassword": "Ponovo postavi lozinku",
+       "botpasswords-label-grants": "Primjenjive dozvole:",
+       "botpasswords-label-grants-column": "Odobreno",
+       "botpasswords-bad-appid": "Ime bota \"$1\" nije ispravno.",
+       "botpasswords-insert-failed": "Ne mogu dodati bota pod nazivom \"$1\". Možda je već dodano?",
+       "botpasswords-update-failed": "Ne mogu ažurirati bota pod nazivom \"$1\". Možda je obrisan?",
+       "botpasswords-created-title": "Napravljena lozinka bota",
+       "botpasswords-created-body": "Napravljena lozinka za bota \"$1\" korisnika \"$2\".",
+       "botpasswords-updated-title": "Ažurirana lozinka bota",
+       "botpasswords-updated-body": "Ažurirana lozinka za bota \"$1\" korisnika \"$2\".",
+       "botpasswords-deleted-title": "Obrisana lozinka bota",
        "resetpass_forbidden": "Lozinke ne mogu biti promijenjene",
+       "resetpass_forbidden-reason": "Lozinke ne mogu biti promijenjene: $1",
        "resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici direktno.",
        "resetpass-submit-loggedin": "Promijeni lozinku",
        "resetpass-submit-cancel": "Odustani",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
        "passwordreset-emailsentemail": "Ako je ova adresa e-pošte povezana s Vašim računom, podsjetnik o lozinci bit će Vam poslan na adresu e-pošte.",
+       "passwordreset-nocaller": "Mora se navesti pozivalac",
+       "passwordreset-nosuchcaller": "Pozivalac ne postoji: $1",
+       "passwordreset-invalidemail": "Neispravna adresa e-pošte",
        "changeemail": "Promjena ili uklanjanje e-adrese",
        "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
        "changeemail-no-info": "Morate biti prijavljeni za direktan pristup ovoj stranici.",
        "headline_sample": "Naslov",
        "headline_tip": "Podnaslov",
        "nowiki_sample": "Dodaj neformatirani tekst ovdje",
-       "nowiki_tip": "Ignoriši viki formatiranje teksta",
+       "nowiki_tip": "Zanemari wikiformatiranje",
        "image_sample": "ime_slike.jpg",
        "image_tip": "Uklopljena slika",
        "media_sample": "ime_medija_fajla.ogg",
        "media_tip": "Putanja ka multimedijalnoj datoteci",
-       "sig_tip": "Vaš potpis sa trenutnim vremenom",
+       "sig_tip": "Vaš potpis s trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
        "subject": "Tema:",
        "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
-       "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
+       "missingsummary": "<strong>Napomena:</strong> Niste unijeli sažetak izmjene.\nAko ponovo kliknete na \"{{int:savearticle}}\", Vaša izmjena će biti sačuvana bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
-       "missingcommenttext": "Molimo unesite komentar ispod.",
+       "missingcommenttext": "Unesite komentar ispod.",
        "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pregled sažetka:",
        "subject-preview": "Pregled teme:",
        "autoblockedtext": "Vaša IP-adresa automatski je blokirana jer ju je koristio drugi korisnik, a blokirao ju je $1.\nNaveden je sljedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati sa $1 ili nekim drugim iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"pošalji e-mail ovom korisniku\" sve dok ne unesete validnu e-mail adresu pri registraciji u Vašim [[Special:Preferences|korisničkim postavkama]] i dok niste spriječeni (blokadom) da je koristite.\n\nVaša trenutna IP-adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Morate biti $1 da biste uređivali stranice.",
-       "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego počnete mijenjati stranice.\nMolimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Preferences|korisničkih opcija]].",
+       "confirmedittext": "Morate potvrditi svoju adresu e-pošte prije nego počnete mijenjati stranice.\nPostavite i potvrdite svoju adresu e-pošte u [[Special:Preferences|korisničkim postavkama]].",
        "nosuchsectiontitle": "Ne mogu pronaći sekciju",
        "nosuchsectiontext": "Pokušali ste uređivati sekciju koja ne postoji.\nMožda je premještena ili obrisana dok ste pregledavali stranicu.",
        "loginreqtitle": "Potrebna je prijava",
        "loginreqlink": "prijavljeni",
        "loginreqpagetext": "Morate biti $1 da biste vidjeli druge stranice.",
        "accmailtitle": "Šifra poslana.",
-       "accmailtext": "Nasumično odabrana šifra za [[User talk:$1|$1]] je poslata na adresu $2.\n\nŠifra/lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
+       "accmailtext": "Nasumično odabrana lozinka za [[User talk:$1|$1]] poslana je na $2. Lozinka se <em>[[Special:ChangePassword|može promijeniti]]</em> nakon prijave.",
        "newarticle": "(Novi)",
        "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako Vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite na dugme \"Nazad\" (''Back'') u Vašem internetskom pregledniku.",
        "anontalkpagetext": "----\n<em>Ovo je stranica za razgovor s anonimnim korisnikom koji još nije napravio račun ili ga ne koristi.</em>\nZbog toga moramo koristiti brojčanu IP-adresu kako bismo ga prepoznali.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i smatrate da su Vam upućene nebitne primjedbe, molimo Vas da [[Special:CreateAccount|napravite račun]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu s ostalim anonimnim korisnicima.",
        "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisnicima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu]</span>.",
        "noarticletext-nopermission": "Trenutno nema teksta na ovoj stranici.\nMožete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo se obično dešava kad pratite zastarjelu vezu na stranicu koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu brisanja].",
-       "userpage-userdoesnotexist": "Korisnički račun \"<nowiki>$1</nowiki>\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.",
-       "userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registrovan.",
+       "userpage-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.\nRazmislite želite li zaista napraviti/izmijeniti ovu stranicu.",
+       "userpage-userdoesnotexist-view": "Korisnički račun \"$1\" nije registriran.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nPosljednje stavke zapisnika blokiranja možete pogledati ispod:",
        "clearyourcache": "<strong>Napomena:</strong> Nakon što sačuvate izmjene, možda ćete morati osvježiti keš preglednika da biste vidjeli izmjene.\n* <strong>Firefox / Safari:</strong> Držite <em>Shift</em> i kliknite na <em>Reload</em> ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Macu)\n* <strong>Google Chrome:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Macu)\n* <strong>Internet Explorer:</strong> Držite <em>Ctrl</em> i kliknite na <em>Refresh</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Idite na <em>Menu → Settings</em> (<em>Opera → Preferences</em> na Macu) i zatim <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi CSS prije nego što sačuvate.",
        "userjsyoucanpreview": "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JavaScript prije nego što sačuvate.",
-       "usercsspreview": "'''Zapamtite ovo je samo izgled Vašeg CSS-a.'''\n'''Ovaj pregled još uvijek nije sačuvan!'''",
-       "userjspreview": "'''Zapamtite ovo je samo izgled vaše JavaScript-e, još uvijek nije sačuvan!'''",
+       "usercsspreview": "<strong>Zapamtite da je ovo samo pregled Vašeg CSS-a.\nStranica još nije sačuvana!</strong>",
+       "userjspreview": "<strong>Zapamtite da je ovo samo pregled Vašeg JavaScripta.\nStranica još nije sačuvana!</strong>",
        "sitecsspreview": "'''Zapamtite ovo je samo izgled ovog CSS-a.'''\n'''Još uvijek nije sačuvan!'''",
        "sitejspreview": "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''\n'''Još uvijek nije sačuvan!'''",
-       "userinvalidcssjstitle": "'''Upozorenje:''' Ne postoji interfejs pod imenom \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Upozorenje:</strong> Ne postoji tema \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Osvježeno)",
        "note": "'''Pažnja:'''",
        "previewnote": "<strong>Ne zaboravite da je ovo samo pregled.</strong>\nVaše izmjene još nisu sačuvane!",
        "continue-editing": "Idi na područje uređivanja",
-       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju\nizgledati ako kliknete \"Sačuvaj članak\".",
+       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju izgledati ako odlučite sačuvati stranicu.",
        "session_fail_preview": "Izvinjavamo se! Nismo mogli obraditi Vašu izmjenu zbog gubitka podataka o prijavi.\n\nMožda ste odjavljeni. <strong>Provjerite jeste li prijavljeni i pokušajte ponovo</strong>.\nAko i dalje ne radi, pokušajte se [[Special:UserLogout|odjaviti]] i ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
        "session_fail_preview_html": "'''Žao nam je! Nismo mogli da obradimo vašu izmjenu zbog gubitka podataka.'''\n\n''Zbog toga što {{SITENAME}} ima omogućen izvorni HTML, predpregled je sakriven kao predostrožnost protiv JavaScript napada.''\n\n'''Ako ste pokušali da napravite pravu izmjenu, molimo pokušajte ponovo. Ako i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
        "token_suffix_mismatch": "'''Vaša izmjena nije prihvaćena jer je Vaš web preglednik ubacio znakove interpunkcije u token uređivanja.\nIzmjena je odbačena da bi se spriječilo uništavanje teksta stranice.\nTo se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.'''",
        "editing": "Uređujete $1",
        "creating": "Pravljenje stranice $1",
        "editingsection": "Uređujete $1 (dio)",
-       "editingcomment": "Uređujete $1 (nova sekcija)",
+       "editingcomment": "Uređujete $1 (novi odlomak)",
        "editconflict": "Sukob izmjena: $1",
        "explainconflict": "Neko drugi je promijenio ovu stranicu otkad ste je Vi počeli mijenjati.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene prikazane su u donjem tekstu.\nMorat ćete unijeti svoje promjene u postojeći tekst.\n'''Samo''' tekst u gornjem tekstualnom polju bit će sačuvan kad\nkliknete \"{{int:savearticle}}\".",
        "yourtext": "Vaš tekst",
        "copyrightwarning2": "Zapamtite da svi doprinosi na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE AUTORSKIM PRAVOM ZAŠTIĆENE TEKSTOVE BEZ DOZVOLE!'''",
        "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: Tekst, koji ste poslali, je dug {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je veće od maksimuma, koji iznosi {{PLURAL:$2|jedan kilobajt|$2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
-       "readonlywarning": "'''PAŽNJA: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.'''\nMožda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.\n\nAdministrator koji je zaključao bazu je naveo slijedeće objašnjenje: $1",
+       "readonlywarning": "<strong>Upozorenje: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.</strong>\nMožda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.\n\nAdministrator koji je zaključao bazu je naveo sljedeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u zapisniku je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
        "permissionserrorstext": "Nemate dopuštenje za ovu radnju iz {{PLURAL:$1|sljedećeg razloga|sljedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dopuštenje da $2, iz {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
        "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je njen model sadržaja <code>$1</code>, a trenutni model sadržaja stranice je <code>$2</code>.",
-       "recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden zapisnik brisanja i premještanja s obrazloženjem:",
+       "recreate-moveddeleted-warn": "<strong>Upozorenje: Ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite je li prikladno nastaviti s uređivanjem ove stranice.\nOvdje je naveden zapisnik brisanja i premještanja:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nZapisnik brisanja i premještanja stranice je prikazan ispod kao referenca.",
        "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u prethodna 24 sata).\nNiže su navedeni zapisnici brisanja i premještanja.",
        "log-fulllog": "Prikaži cijeli zapisnik",
        "invalid-content-data": "Nevaljani podaci sadržaja",
        "content-not-allowed-here": "Sadržaj napisan u obliku \"$1\" nije dozvoljen na stranici [[$2]]",
        "editwarning-warning": "Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.\nAko ste prijavljeni, možete isključiti ovo upozorenje u Sekciji za \"{{int:prefs-editing}}\" vaših opcija.",
+       "editpage-invalidcontentmodel-title": "Model sadržaja nije podržan",
+       "editpage-invalidcontentmodel-text": "Model sadržaja \"$1\" nije podržan.",
        "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
        "editpage-notsupportedcontentformat-text": "Format sadržaja $1 nije podržan za model sadržaja $2.",
        "content-model-wikitext": "wikitekst",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prazan objekat",
        "content-json-empty-array": "Prazan niz",
+       "deprecated-self-close-category": "Stranice s neispravnim samozatvorenim HTML oznakama",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] sa više od jedne vrijednosti za parametar \"$3\". Koristit će se samo posljednja navedena vrijednost.",
        "duplicate-args-category": "Stranice sa istim argumentima kod poziva šablona",
        "duplicate-args-category-desc": "Stranica sadrži pozive šablona koji koriste argumente dvojnike, kao što su <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ili <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "cur": "tren",
-       "next": "slijed",
+       "next": "sljed",
        "last": "preth",
        "page_first": "prva",
        "page_last": "posljednja",
-       "histlegend": "Odabir razlika: označite radio dugme verzija koje uspoređujete i pritistnite enter ili dugme na dnu. <br />\nObjašnjenje: '''(tren)''' = razlika sa trenutnom verzijom,\n'''(preth)''' = razlika sa prethodnom verzijom, '''m''' = mala izmjena.",
+       "histlegend": "Odabir razlika: označite radio dugme verzija koje uspoređujete i pritistnite enter ili dugme na dnu. <br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika sa trenutnom verzijom, <strong>({{int:last}})</strong> = razlika sa prethodnom verzijom, <strong>{{int:minoreditletter}}</strong> = mala izmjena.",
        "history-fieldset-title": "Pretraga historije",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "historysize": "({{PLURAL:$1|1 bajt|$1 bajta|$1 bajtova}})",
        "historyempty": "(prazno)",
        "history-feed-title": "Historija izmjena",
-       "history-feed-description": "Historija promjena ove stranice na wikiju",
+       "history-feed-description": "Historija izmjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
-       "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
+       "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je obrisana s wikija ili je preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
        "history-edit-tags": "Uredi oznake izabranih verzija",
        "rev-deleted-comment": "(sažetak izmjene uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(stavka zapisa obrisana)",
+       "rev-deleted-event": "(detalji unosa uklonjeni)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
-       "rev-deleted-text-permission": "Revizija ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
+       "rev-deleted-text-permission": "Izmjena ove stranice je <strong>obrisana</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
        "rev-suppressed-text-permission": "Revizija ove stranice je <strong>prekrivena</strong>.\nDetalji se mogu naći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku prekrivanja].",
-       "rev-deleted-text-unhide": "Izmjena ove stranice je <strong>obrisana</strong>.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nIpak možete [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
-       "rev-suppressed-text-unhide": "Ova revizija stranice je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].\nVi i dalje možete [$1 vidjeti ovu reviziju] ako želite.",
+       "rev-deleted-text-unhide": "Izmjena ove stranice je <strong>obrisana</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nIpak možete [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
+       "rev-suppressed-text-unhide": "Izmjena ove stranice je <strong>sakrivena</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].\nIpak možete [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
        "rev-deleted-text-view": "Revizija ove stranice je '''obrisana'''.\nVi je možete vidjeti; detalji o tome mogu se vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
-       "rev-suppressed-text-view": "Ova revizija stranice je '''uklonjena'''.\nVi je možete vidjeti; možete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].",
+       "rev-suppressed-text-view": "Izmjena ove stranice je <strong>sakrivena</strong>.\nMožete je pogledati; detalje možete pronaći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].",
        "rev-deleted-no-diff": "Ne možete vidjeti ovu razliku jer je jedna od izmjena '''obrisana'''.\nDetalji se nalaze u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
        "rev-suppressed-no-diff": "Ne možete vidjeti ove razlike jer je jedna od revizija '''obrisana'''.",
-       "rev-deleted-unhide-diff": "Jedna od revizija u ovom pregledu razlika je '''obrisana'''.\nMožete pregledati detalje u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nVi još uvijek možete [$1 vidjeti ove razlike] ako želite nastaviti.",
-       "rev-suppressed-unhide-diff": "Jedna od revizija ove razlike je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku uklanjanja].\nVi i dalje možete [$1 vidjeti ove razlike] ako želite nastaviti.",
-       "rev-deleted-diff-view": "Jedna od revizija u ovoj razlici je '''obrisana'''.\nVi možete vidjeti ovu razliku; detalji o tome mogu se vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
-       "rev-suppressed-diff-view": "Jedna od revizija u ovoj razlici je '''sakrivena'''.\nVi možete vidjeti ovu razliku; detalji se mogu vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].",
+       "rev-deleted-unhide-diff": "Jedna od izmjena u ovom pregledu razlika je <strong>obrisana</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nIpak možete [$1 vidjeti ovaj pregled razlika] ako želite nastaviti.",
+       "rev-suppressed-unhide-diff": "Jedna od izmjena u ovom pregledu razlika je <strong>sakrivena</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].\nIpak možete [$1 vidjeti ovaj pregled razlika] ako želite nastaviti.",
+       "rev-deleted-diff-view": "Jedna od izmjena u ovom pregledu razlika je <strong>obrisana</strong>.\nMožete pogledati razliku izmjena; detalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
+       "rev-suppressed-diff-view": "Jedna od izmjena u ovom pregledu razlika je <strong>sakrivena</strong>.\nMožete pogledati razliku izmjena; detalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].",
        "rev-delundel": "pokaži/sakrij",
        "rev-showdeleted": "prikaži",
-       "revisiondelete": "Obriši/vrati revizije",
+       "revisiondelete": "Obriši/vrati izmjene",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
        "revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
-       "revdelete-selected-text": "{{PLURAL:$1|Odabrana revizija|Odabrane revizije}} od [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmjena|Izabrane izmjene}} stranice [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Odabrana vezija datoteke|Odabrane verzije datoteke}} [[:$2]]:",
-       "logdelete-selected": "{{PLURAL:$1|Označena stavka zapisa|Označene stavke zapisa}}:",
-       "revdelete-text-text": "Obrisane revizije i dalje su prikazane u historiji stranice, ali dijelovi njihovog sadržaja neće biti dostupni javnosti.",
+       "logdelete-selected": "{{PLURAL:$1|Izabrana stavka zapisnika|Izabrane stavke zapisnika}}:",
+       "revdelete-text-text": "Obrisane izmjene i dalje će biti vidljive u historiji stranice, ali dijelovi njihovog sadržaja neće biti dostupni javnosti.",
        "revdelete-text-file": "Obrisane verzije datoteke i dalje su prikazane u historiji datoteke, ali dijelovi njihovog sadržaja nisu dostupni javnosti.",
        "logdelete-text": "Obrisani događaji zapisnika i dalje se pojavljuju u zapisniku, ali dijelovi njihovih sadržaja nisu dostupni javnosti.",
-       "revdelete-text-others": "Drugi administratori će i dalje moći pristupiti sakrivenom sadržaju i vratiti ga, bez obzira na postavljena dodatna ograničenja.",
-       "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
+       "revdelete-text-others": "Ostali administratori i dalje će moći pristupiti sakrivenom sadržaju i vratiti ga, osim ako se postave dodatna ograničenja.",
+       "revdelete-confirm": "Potvrdite da namjeravate ovo uraditi, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Ograničenja bi trebala biti korištena <strong>samo</strong> u sijedećim slučajevima:\n* Potencijalni klevetnički podaci\n* Osjetljive korisničke informacije\n*: <em>kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
-       "revdelete-hide-text": "Tekst revizije",
+       "revdelete-hide-text": "Tekst izmjene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij cilj i parametre",
-       "revdelete-hide-comment": "Uredi sažetak",
-       "revdelete-hide-user": "Korisničko ime urednika/IP",
+       "revdelete-hide-comment": "Sažetak izmjene",
+       "revdelete-hide-user": "Korisničko ime urednika/IP-adresa",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "revdelete-radio-same": "(ne mijenjaj)",
        "revdelete-radio-set": "Sakriveno",
        "revdelete-suppress": "Sakrij podatke od administratora kao i od drugih",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim revizijama",
        "revdelete-log": "Razlog:",
-       "revdelete-submit": "Primijeni na odabrane {{PLURAL:$1|reviziju|revizije}}",
+       "revdelete-submit": "Primijeni na {{PLURAL:$1|izabranu izmjenu|izabrane izmjene}}",
        "revdelete-success": "'''Vidljivost izmjene je ažurirana.'''",
-       "revdelete-failure": "'''Vidljivost revizije nije mogla biti ažurirana:'''\n$1",
+       "revdelete-failure": "Ne mogu ažurirati vidljivost izmjene:\n$1",
        "logdelete-success": "Postavljena je vidljivost unosa u zapisniku.",
        "logdelete-failure": "'''Zapisnik vidljivosti nije mogao biti postavljen:'''\n$1",
-       "revdel-restore": "Promijeni dostupnost",
+       "revdel-restore": "promijeni vidljivost",
        "pagehist": "Historija stranice",
-       "deletedhist": "Izbrisana historija",
+       "deletedhist": "Obrisana historija",
        "revdelete-hide-current": "Greška pri sakrivanju stavke od $2, $1: ovo je trenutna verzija.\nNe može biti sakrivena.",
        "revdelete-show-no-access": "Greška pri prikazivanju stavke od $2, $1: ova stavka je označena kao \"zaštićena\".\nNemate pristup do ove stavke.",
        "revdelete-modify-no-access": "Greška pri izmjeni stavke od $2, $1: ova stavka je označena kao \"zaštićena\".\nNemate pristup ovoj stavci.",
        "revdelete-modify-missing": "Greška pri mijenjanju stavke ID $1: nedostaje u bazi podataka!",
        "revdelete-no-change": "'''Upozorenje:''' stavka od $2, $1 već posjeduje zatražene postavke vidljivosti.",
-       "revdelete-concurrent-change": "Greška pri mijenjanju stavke od $2, $1: njen status je izmijenjen od strane nekog drugog dok ste je pokušavali mijenjati.\nMolimo provjerite zapise.",
+       "revdelete-concurrent-change": "Greška pri mijenjanju stavke od $2, $1: Izgleda da je neko drugi promijenio njen status dok ste je pokušavali mijenjati.\nProvjerite zapisnike.",
        "revdelete-only-restricted": "Greška pri sakrivanju stavke od dana $2, $1: ne možete ukloniti stavke od pregledavanja administratora bez da odaberete neku od drugih opcija za uklanjanje.",
        "revdelete-reason-dropdown": "*Uobičajeni razlozi brisanja\n** Kršenje autorskih prava\n** Neprikladan komentar ili lični podac\n** Neprikladno korisničko ime\n** Uvredljivi podaci",
        "revdelete-otherreason": "Drugi/dodatni razlog:",
        "revdelete-reasonotherlist": "Ostali razlozi",
        "revdelete-edit-reasonlist": "Uredi razloge brisanja",
-       "revdelete-offender": "Autor revizije:",
-       "suppressionlog": "Zapisi sakrivanja",
+       "revdelete-offender": "Autor izmjene:",
+       "suppressionlog": "Zapisnik sakrivanja",
        "suppressionlogtext": "Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. \nVidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.",
        "mergehistory": "Spoji historije stranice",
        "mergehistory-header": "Ova stranica Vam omogućuje spajanje revizija historije neke izvorne stranice u novu stranicu. Zapamtite da će ova promjena ostaviti nepromjenjen sadržaj historije stranice.",
        "mergehistory-list": "Historija izmjena koja se može spojiti",
        "mergehistory-merge": "Slijedeće revizije stranice [[:$1]] mogu biti spojene u [[:$2]].\nKoristite dugmiće u stupcu da bi ste spojili revizije koje su napravljene prije navedenog vremena.\nKorištenje navigacionih linkova će resetovati ovaj stupac.",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
-       "mergehistory-submit": "Spoji revizije",
-       "mergehistory-empty": "Nema revizija za spajanje.",
+       "mergehistory-submit": "Spoji izmjene",
+       "mergehistory-empty": "Nema izmjena za spajanje.",
        "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene|izmjena}} stranice $1 uspješno je spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+       "mergehistory-fail-bad-timestamp": "Vremenska oznaka nije ispravna.",
+       "mergehistory-fail-invalid-source": "Izvorna stranica nije ispravna.",
+       "mergehistory-fail-invalid-dest": "Odredišna stranica nije ispravna.",
+       "mergehistory-fail-no-change": "Spajanje historije nije spojilo nijednu izmjenu. Provjerite parametre stranice i vremena.",
+       "mergehistory-fail-permission": "Nemate dopuštenje da spojite historiju.",
+       "mergehistory-fail-self-merge": "Izvorna i odredišna stranica su iste.",
        "mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "showhideselectedversions": "Prikaži/sakrij izabrane izmjene",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije}} istog korisnika)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuizmjena|Nisu prikazane $1 međuizmjene|Nije prikazano $1 međuizmjena}} istog korisnika)",
        "diff-multi-otherusers": "(Nije prikazana {{PLURAL:$1|jedna međuverzija|$1 međuverzija}} {{PLURAL:$2|drugog korisnika|$2 korisnika}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})",
        "difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
+       "search-interwiki-more-results": "više rezultata",
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "searchall": "sve",
        "search-external": "Vanjska pretraga",
        "searchdisabled": "Pretraga na stranici {{SITENAME}} je onemogućena.\nU međuvremenu možete tražiti preko Googlea.\nUpamtite da ispisi stranice {{SITENAME}} mogu biti zastarjeli.",
        "search-error": "Desila se greška prilikom pretraživanja: $1",
+       "search-warning": "Došlo je do upozorenja prilikom pretraživanja: $1",
        "preferences": "Postavke",
        "mypreferences": "Postavke",
        "prefs-edits": "Broj izmjena:",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-edits-max": "Najveći broj: 1000",
        "prefs-watchlist-token": "Žeton praćenih članaka:",
-       "prefs-misc": "Ostala podešavanja",
+       "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
        "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
        "youremail": "Adresa e-pošte:",
        "username": "{{GENDER:$1|Korisničko}} ime:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Vrijeme registracije:",
        "yourrealname": "Vaše pravo ime:",
        "yourlanguage": "Jezik:",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ovih podešavanja nije obavezno.\nSoftver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova će informacija biti javna.",
-       "email": "E-mail",
+       "email": "E-pošta",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "Adresa e-pošte nije obavezna, ali je potrebna u slučaju ponovnog postavljanja šifre, ako je zaboravite.",
        "prefs-help-email-others": "Također možete dopustiti drugim korisnicima da vas kontaktiraju preko linka na lijevoj strani vaše stranice ili stranice za razgovor.\nVaša adresa e-pošte neće biti prikazana drugim korisnicima koji vas kontaktiraju.",
        "userrights": "Postavke korisničkih prava",
        "userrights-lookup-user": "Izaberi korisnika",
        "userrights-user-editname": "Upišite korisničko ime:",
-       "editusergroup": "Uredi korisničke grupe",
-       "editinguser": "Mijenjate korisnička prava korisnika <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Uredi korisničke grupe",
+       "editusergroup": "Učitaj korisničke grupe",
+       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Pregledavate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Uredi {{GENDER:$1|korisničke}} grupe",
+       "userrights-viewusergroup": "Vidi {{GENDER:$1|korisničke}} grupe",
        "saveusergroups": "Sačuvaj {{GENDER:$1|korisničke}} grupe",
        "userrights-groupsmember": "Član:",
        "userrights-groupsmember-auto": "Uključeni član od:",
-       "userrights-groups-help": "Možete promijeniti grupe kojima ovaj korisnik pripada:\n* Označeni kvadratić znači da je korisnik u toj grupi.\n* Neoznačen kvadratić znači da korisnik nije u toj grupi.\n* Oznaka * (zvjezdica) označava da Vi ne možete izbrisati ovu grupu ako je dodate i obrnutno.",
+       "userrights-groups-help": "Možete promijeniti grupe kojima ovaj korisnik pripada:\n* Označeni kvadratić znači da je korisnik u toj grupi.\n* Neoznačeni kvadratić znači da korisnik nije u toj grupi.\n* Zvjezdica (*) označava da ne možete ukloniti grupu nakon što je dodate i obrnuto.\n* Taraba (#) označava da jedino možete odložiti vrijeme isteka ove grupe; ne možete ga ubrzati.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
+       "userrights-expiry-current": "Ističe $1",
+       "userrights-expiry-none": "Ne ističe",
+       "userrights-expiry": "Ističe:",
+       "userrights-expiry-existing": "Postojeće vrijeme isticanja: $3, $2",
+       "userrights-expiry-othertime": "Drugo vrijeme:",
+       "userrights-expiry-options": "1 dan:1 day,1 sedmica:1 week,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godina:1 year",
+       "userrights-invalid-expiry": "Vrijeme isticanja grupe \"$1\" nije ispravno.",
+       "userrights-expiry-in-past": "Vrijeme isticanja grupe \"$1\" je u prošlosti.",
+       "userrights-cannot-shorten-expiry": "Ne možete ubrzati vrijeme isteka grupe \"$1\". Jedino je mogu ubrzati korisnici koji mogu dodavati i uklanjati ovu grupu.",
        "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
        "group": "Grupa:",
        "group-user": "Korisnici",
-       "group-autoconfirmed": "Potvrđeni korisnici",
+       "group-autoconfirmed": "Automatski potvrđeni korisnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
        "group-suppress": "Skrivači",
        "group-all": "(sve)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica}}",
-       "group-autoconfirmed-member": "Potvrđeni korisnik",
-       "group-bot-member": "bot",
+       "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
        "group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
-       "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
+       "grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
        "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
-       "right-createpage": "Pravljenje stranica (neuključujući stranice za razgovor)",
+       "right-createpage": "Pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "Pravljenje stranica za razgovor",
-       "right-createaccount": "Pravljenje korisničkog računa",
-       "right-minoredit": "Označavanje izmjena kao malih",
+       "right-createaccount": "Pravljenje novih korisničkih računa",
+       "right-minoredit": "Označavanje izmjena manjim",
        "right-move": "Premještanje stranica",
-       "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
-       "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
-       "right-move-categorypages": "Pomakni stranice kategorije",
+       "right-move-subpages": "Premještanje stranica s njihovim podstranicama",
+       "right-move-rootuserpages": "Premještanje osnovnih korisničkih stranica",
+       "right-move-categorypages": "Premještanje kategorija",
        "right-movefile": "Premještanje datoteka",
-       "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
+       "right-suppressredirect": "Premještanje stranica bez ostavljanja preusmjerenja",
        "right-upload": "Postavljanje datoteka",
-       "right-reupload": "Postavljanje nove verzije datoteke",
-       "right-reupload-own": "Postavljanje nove verzije datoteke koju je postavio korisnik",
-       "right-reupload-shared": "Postavljanje novih lokalnih verzija datoteka identičnih onima u zajedničkoj ostavi",
+       "right-reupload": "Postavljanje novih verzija datoteka",
+       "right-reupload-own": "Postavljanje novih verzija vlastitih datoteka",
+       "right-reupload-shared": "Lokalno premošćivanje datoteka sa zajedničke ostave",
        "right-upload_by_url": "Postavljanje datoteke sa URL adrese",
-       "right-purge": "Osvježavanje keša za stranice bez konfirmacije",
-       "right-autoconfirmed": "Bez ograničavanja stavki za IP adrese",
+       "right-purge": "Osvježavanje keša stranice bez potvrde",
+       "right-autoconfirmed": "Izbjegavanje ograničenja stavki za IP adrese",
        "right-bot": "Postavljen kao automatski proces",
-       "right-nominornewtalk": "Male izmjene na stranici za razgovor ne uzrokuju prikazivanje oznake ''nova poruka'' na stranici za razgovor",
+       "right-nominornewtalk": "Izbjegavanje prikazivanja obavještenja o novim porukama kad je označeno da je izmjena manja",
        "right-apihighlimits": "Korištenje viših ograničenja u API upitima",
-       "right-writeapi": "Korištenje opcije ''write API''",
+       "right-writeapi": "Korištenje API-ja za pisanje",
        "right-delete": "Brisanje stranica",
        "right-bigdelete": "Brisanje stranica sa velikom historijom",
-       "right-deletelogentry": "Brisanje i vraćanje određenih zapisa u evidenciji",
-       "right-deleterevision": "Brisanje i vraćanje određenih revizija stranice",
-       "right-deletedhistory": "Pregled stavki obrisane historije, bez povezanog teksta",
-       "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
+       "right-deletelogentry": "Brisanje i vraćanje određenih stavki u zapisniku",
+       "right-deleterevision": "Brisanje i vraćanje određenih izmjena stranice",
+       "right-deletedhistory": "Pregledanje stavki obrisane historije, bez povezanog teksta",
+       "right-deletedtext": "Pregledanje obrisanog teksta i izmjena između obrisanih izmjena",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
+       "right-suppressrevision": "Pregledanje, sakrivanje i vraćanje određenih verzija stranica od svih korisnika",
        "right-viewsuppressed": "Pregledaj izmjene skrivene od svih korisnika",
-       "right-suppressionlog": "Gledanje privatnih zapisa",
-       "right-block": "Blokiranje uređivanja drugih korisnika",
-       "right-blockemail": "Blokiranje korisnika da šalje e-mail",
-       "right-hideuser": "Blokiranje korisničkog imena, i njegovo sakrivanje od javnosti",
-       "right-ipblock-exempt": "Zaobilaženje IP blokada, autoblokada i blokada IP grupe",
-       "right-unblockself": "Deblokiraj samog sebe",
-       "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
-       "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
+       "right-suppressionlog": "Pregledanje privatnih zapisnika",
+       "right-block": "Blokiranje mogućnosti uređivanja drugim korisnicima",
+       "right-blockemail": "Blokiranje korisnikove mogućnosti da šalje e-poštu",
+       "right-hideuser": "Blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
+       "right-ipblock-exempt": "Zaobilaženje IP-blokada, autoblokada i blokada opsega",
+       "right-unblockself": "Deblokiranje samog sebe",
+       "right-protect": "Mijenjanje nivoâ zaštite i uređivanje stranica pod prenosivom zaštitom",
+       "right-editprotected": "Uređivanje stranica pod zaštitom \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Uređivanje stranica pod zaštitom \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
        "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
-       "right-editusercss": "Uređivanje CSS datoteka drugih korisnika",
-       "right-edituserjs": "Uređivanje JS datoteka drugih korisnika",
-       "right-editmyusercss": "Uredite svoje vlastite korisničke CSS datoteke",
-       "right-editmyuserjs": "Uredite vlastite korisničke JavaScript datoteke",
-       "right-viewmywatchlist": "Pogledaj svoj spisak praćenih stranica",
-       "right-editmywatchlist": "Uredite vlastiti spisak praćenja. Važno je spomenuti da će neke radnje dodati stranice na spisak, čak i bez ovog prava.",
-       "right-viewmyprivateinfo": "Pogledajte Vaše privatne podatke (npr, adresa e-pošte, pravo ime)",
-       "right-editmyprivateinfo": "Uredite svoje privatne podatke (npr. adresa e-pošte, pravo ime)",
-       "right-editmyoptions": "Uredite svoje postavke",
+       "right-editusercss": "Uređivanje tuđih CSS datoteka",
+       "right-edituserjs": "Uređivanje tuđih JavaScript datoteka",
+       "right-editmyusercss": "Uređivanje vlastitih CSS datoteka",
+       "right-editmyuserjs": "Uređivanje vlastitih JavaScript datoteka",
+       "right-viewmywatchlist": "Pregledanje vlastitog spiska praćenja",
+       "right-editmywatchlist": "Uređivanje vlastitog spiska praćenja. Važno je spomenuti da će neke radnje dodati stranice na spisak, čak i bez ovog prava.",
+       "right-viewmyprivateinfo": "Pregledanje vlastitih ličnih podataka (npr, adresa e-pošte, pravo ime)",
+       "right-editmyprivateinfo": "Uređivanje vlastitih ličnih podataka (npr. adresa e-pošte, pravo ime)",
+       "right-editmyoptions": "Uređivanje vlastitih postavki",
        "right-rollback": "Brzo vraćanje izmjena posljednjeg korisnika koji je uređivao određenu stranicu",
        "right-markbotedits": "Označavanje vraćenih izmjena kao izmjene bota",
        "right-noratelimit": "Izbjegavanje ograničenja uzrokovanih brzinom",
-       "right-import": "Uvoz stranica iz drugih wikija",
-       "right-importupload": "Uvoz stranica putem postavljanja datoteke",
-       "right-patrol": "Označavanje izmjena drugih korisnika patroliranim",
-       "right-autopatrol": "Vlastite izmjene se automatski označavaju kao patrolirane",
+       "right-import": "Uvoženje stranica iz drugih wikija",
+       "right-importupload": "Uvoženje stranica putem postavljanja datoteke",
+       "right-patrol": "Označavanje tuđih izmjena patroliranim",
+       "right-autopatrol": "Automatsko označavanje vlastitih izmjena patroliranim",
        "right-patrolmarks": "Pregled oznaka patroliranja u spisku nedavnih izmjena",
-       "right-unwatchedpages": "Gledanje spiska nepraćenih stranica",
+       "right-unwatchedpages": "Pregledanje spiska nepraćenih stranica",
        "right-mergehistory": "Spajanje historije stranica",
        "right-userrights": "Uređivanje svih korisničkih prava",
        "right-userrights-interwiki": "Uređivanje korisničkih prava korisnika na drugim wikijima",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
-       "right-sendemail": "Slanje e-maila drugim korisnicima",
-       "right-managechangetags": "Napravi i (de)aktiviraj [[Special:Tags|oznake]]",
-       "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
-       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
+       "right-sendemail": "Slanje e-pošte drugim korisnicima",
+       "right-managechangetags": "Pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
+       "right-applychangetags": "Primjenjivanje [[Special:Tags|oznaka]] na nečije izmjene",
+       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima u zapisnicima",
+       "right-deletechangetags": "Brisanje [[Special:Tags|oznaka]] iz baze podataka",
        "grant-group-page-interaction": "Upravljanje stranicama",
+       "grant-group-file-interaction": "Rad s medijskim datotekama",
        "grant-group-watchlist-interaction": "Upravljanje Vašim spiskom praćenja",
+       "grant-group-email": "Slanje e-pošte",
        "grant-group-high-volume": "Izvršavanje velikog broja radnji",
        "grant-group-customization": "Prilagodbe i postavke",
+       "grant-group-administration": "Izvršavanje administrativnih radnji",
+       "grant-group-private-information": "Pristupanje Vašim ličnim podacima",
        "grant-group-other": "Raznovrsno djelovanje",
+       "grant-blockusers": "Blokiranje i deblokiranje korisnika",
+       "grant-createaccount": "Stvaranje računa",
        "grant-createeditmovepage": "Pravljenje, uređivanje i premještanje stranica",
+       "grant-delete": "Brisanje stranica, izmjena i unosa u zapisnicima",
+       "grant-editinterface": "Uređivanje imenskog prostora MediaWiki i korisničkih CSS/JavaScript stranica",
        "grant-editmycssjs": "Uređivanje Vašeg korisničkog CSS-a ili JavaScripta",
        "grant-editmyoptions": "Uređivanje Vaših postavki",
        "grant-editmywatchlist": "Uređivanje Vašeg spiska praćenja",
        "grant-editpage": "Uređivanje postojećih stranica",
        "grant-editprotected": "Uređivanje zaštićenih stranica",
        "grant-highvolume": "Veliki broj izmjena",
+       "grant-oversight": "Skrivanje korisnika i izmjena",
        "grant-patrol": "Patroliranje izmjena stranica",
+       "grant-privateinfo": "Pristupanje ličnim podacima",
+       "grant-protect": "Dodavanje i uklanjanje zaštita sa stranica",
+       "grant-rollback": "Vraćanje izmjena",
+       "grant-sendemail": "Slanje e-pošte drugim korisnicima",
        "grant-uploadeditmovefile": "Postavljanje, zamjena i premještanje datoteka",
        "grant-uploadfile": "Postavljanje novih datoteka",
        "grant-basic": "Osnovna prava",
+       "grant-viewdeleted": "Pregledanje obrisanih datoteka i stranica",
        "grant-viewmywatchlist": "Pregled Vašeg spiska praćenja",
+       "grant-viewrestrictedlogs": "Pregledanje ograničenih unosa u zapisniku",
        "newuserlogpage": "Zapisnik novih korisnika",
        "newuserlogpagetext": "Ovo je zapisnik o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "rightslogtext": "Ovo je zapisnik promjena korisničkih prava.",
        "action-read": "čitate ovu stranicu",
-       "action-edit": "uređujete ovu stranicu",
+       "action-edit": "uredite ovu stranicu",
        "action-createpage": "napravite ovu stranicu",
-       "action-createtalk": "pravite stranice za razgovor",
+       "action-createtalk": "napravite ovu stranicu za razgovor",
        "action-createaccount": "napravite ovaj korisnički račun",
        "action-history": "gledate historiju ove stranice",
-       "action-minoredit": "da označite ovu izmjenu kao malu",
+       "action-minoredit": "označite ovu izmjenu manjom",
        "action-move": "premjestite ovu stranicu",
-       "action-move-subpages": "premjestite ovu stranicu, i njene podstranice",
-       "action-move-rootuserpages": "premjestite stranice osnovnog korisnika",
-       "action-move-categorypages": "pomakni stranice kategorije",
-       "action-movefile": "premjesti ovu datoteku",
-       "action-upload": "postavljate ovu datoteku",
-       "action-reupload": "stavite novu verziju postojeće datoteke",
-       "action-reupload-shared": "postavite ovu datoteku iz zajedničke ostave",
+       "action-move-subpages": "premjestite ovu stranicu i njene podstranice",
+       "action-move-rootuserpages": "premještate osnovne korisničke stranice",
+       "action-move-categorypages": "premještate kategorije",
+       "action-movefile": "premjestite ovu datoteku",
+       "action-upload": "postavite ovu datoteku",
+       "action-reupload": "postavite novu verziju postojeće datoteke",
+       "action-reupload-shared": "premostite ovu datoteku sa zajedničke ostave",
        "action-upload_by_url": "postavite ovu datoteku putem URL adrese",
-       "action-writeapi": "koristite ''write API'' opciju",
+       "action-writeapi": "koristite API za pisanje",
        "action-delete": "obrišete ovu stranicu",
-       "action-deleterevision": "obrišete ovu reviziju",
-       "action-deletedhistory": "gledate obrisanu historiju ove stranice",
+       "action-deleterevision": "brišete izmjene",
+       "action-deletelogentry": "brišete stavke u zapisniku",
+       "action-deletedhistory": "pregledate obrisanu historiju ove stranice",
+       "action-deletedtext": "pregledate obrisani tekst izmjene",
        "action-browsearchive": "pretražujete obrisane stranice",
-       "action-undelete": "vratite ovu stranicu",
-       "action-suppressrevision": "pregledate i vratite ovu skrivenu reviziju",
-       "action-suppressionlog": "vidite ovaj privatni zapis",
-       "action-block": "blokirate uređivanje ovog korisnika",
-       "action-protect": "promijeniti nivo zaštite za ovu stranicu",
-       "action-rollback": "brzo vraćanje izmjena posljednjeg korisnika koji je uređivao određenu stranicu",
-       "action-import": "uvozite stranice iz druge wiki",
-       "action-importupload": "uvoz stranica putem postavljanja datoteke",
-       "action-patrol": "označite izmjene drugih kao patrolirane",
-       "action-autopatrol": "da Vaše izmjene budu označene kao patrolirane",
+       "action-undelete": "vraćate stranice",
+       "action-suppressrevision": "pregledate i vraćate sakrivene izmjene",
+       "action-suppressionlog": "pregledate ovaj privatni zapisnik",
+       "action-block": "blokirate mogućnost uređivanja ovom korisniku",
+       "action-protect": "promijenite nivoe zaštite ove stranice",
+       "action-rollback": "brzo vratite izmjenu posljednjeg korisnika koji je uređivao određenu stranicu",
+       "action-import": "uvozite stranice iz drugih wikija",
+       "action-importupload": "uvozite stranice putem postavljanja datoteke",
+       "action-patrol": "označite tuđe izmjene patroliranim",
+       "action-autopatrol": "označite vlastite izmjene patroliranim",
        "action-unwatchedpages": "pregledate spisak nepraćenih stranica",
        "action-mergehistory": "spajate historiju ove stranice",
        "action-userrights": "uređujete sva korisnička prava",
        "action-userrights-interwiki": "uređujete korisnička prava korisnika na drugim wikijima",
        "action-siteadmin": "zaključavate ili otključavate bazu podataka",
-       "action-sendemail": "pošalji e-mail poruke",
-       "action-editmywatchlist": "uredite svoj spisak praćenih stranica",
-       "action-viewmywatchlist": "pogledajte svoj spisak praćenih stranica",
-       "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
-       "action-editmyprivateinfo": "uredite svoje privatne podatke",
-       "action-editcontentmodel": "uredi model sadržaja stranice",
+       "action-sendemail": "šaljete e-poštu",
+       "action-editmyoptions": "uređujete vlastite postavke",
+       "action-editmywatchlist": "uredite vlastiti spisak praćenja",
+       "action-viewmywatchlist": "pregledate vlastiti spisak praćenja",
+       "action-viewmyprivateinfo": "pregledate vlastite lične podatke",
+       "action-editmyprivateinfo": "uređujete vlastite lične podatke",
+       "action-editcontentmodel": "uređujete model sadržaja stranice",
        "action-managechangetags": "pravite i (de)aktivirate oznake",
-       "action-applychangetags": "dodate oznake uz ve izmjene",
+       "action-applychangetags": "dodate oznake uz vlastite izmjene",
        "action-changetags": "dodate ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
-       "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
+       "action-deletechangetags": "brišete oznake iz baze podataka",
+       "action-purge": "osvježite keš ove stranice",
+       "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges": "Nedavne izmjene",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-activefilters": "Aktivni filteri",
+       "rcfilters-restore-default-filters": "Vrati predodređene filtere",
+       "rcfilters-clear-all-filters": "Ukloni sve filtere",
+       "rcfilters-invalid-filter": "Neispravan filter",
+       "rcfilters-empty-filter": "Nema aktivnih filtera. Svi doprinosi su prikazani.",
+       "rcfilters-filterlist-title": "Filteri",
+       "rcfilters-filterlist-noresults": "Nema filtera",
+       "rcfilters-filter-registered-label": "Registrirani",
+       "rcfilters-filter-registered-description": "Prijavljeni korisnici.",
+       "rcfilters-filter-unregistered-label": "Anonimni",
+       "rcfilters-filter-unregistered-description": "Neprijavljeni korisnici.",
+       "rcfilters-filtergroup-authorship": "Autorstvo izmjena",
+       "rcfilters-filter-editsbyself-label": "Vlastite izmjene",
+       "rcfilters-filter-editsbyself-description": "Izmjene koje ste Vi napravili.",
+       "rcfilters-filter-editsbyother-label": "Tuđe izmjene",
+       "rcfilters-filter-editsbyother-description": "Izmjene koje su napravili drugi korisnici (ne Vi).",
+       "rcfilters-filtergroup-userExpLevel": "Korisničko iskustvo (samo za registrirane)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Novajlije",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Manje od 10 izmjena i 4 dana aktivnosti.",
+       "rcfilters-filter-userExpLevel-learner-label": "Učenici",
+       "rcfilters-filter-userExpLevel-learner-description": "Više dana aktivnosti i izmjena od \"novajlija\", ali manje od \"iskusnih korisnika\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Iskusni korisnici",
+       "rcfilters-filter-userExpLevel-experienced-description": "Preko 30 dana aktivnosti i 500 izmjena.",
+       "rcfilters-filtergroup-automated": "Automatski doprinosi",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Izmjene napravljene automatiziranim alatima.",
+       "rcfilters-filter-humans-label": "Čovjek (ne bot)",
+       "rcfilters-filter-humans-description": "Izmjene koje su napravili ljudi.",
+       "rcfilters-filtergroup-significance": "Značaj",
+       "rcfilters-filter-minor-label": "Manje izmjene",
+       "rcfilters-filter-minor-description": "Izmjene koje je njihov autor označio manjim.",
+       "rcfilters-filter-major-label": "Obične izmjene",
+       "rcfilters-filter-major-description": "Izmjene koje nisu označene manjim.",
+       "rcfilters-filtergroup-changetype": "Vrsta izmjene",
+       "rcfilters-filter-pageedits-label": "Izmjene stranica",
+       "rcfilters-filter-pageedits-description": "Izmjene wiki sadržaja, rasprava, opisa kategorija....",
+       "rcfilters-filter-newpages-label": "Stvaranje stranica",
+       "rcfilters-filter-newpages-description": "Izmjene kojima se stvaraju nove stranice.",
+       "rcfilters-filter-categorization-label": "Izmjene kategorija",
+       "rcfilters-filter-categorization-description": "Izmjene kojima se dodavaju ili uklanjaju kategorije.",
+       "rcfilters-filter-logactions-label": "Zapisane radnje",
+       "rcfilters-filter-logactions-description": "Administrativne radnje, pravljenje računa, brisanje stranica, postavljenje datoteka....",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmjene počev od $3 u $2",
        "rcshowhideminor": "$1 manje izmjene",
        "rcshowhidebots": "$1 botove",
        "rcshowhidebots-show": "Prikaži",
        "rcshowhidebots-hide": "Sakrij",
-       "rcshowhideliu": "$1 registrovane korisnike",
+       "rcshowhideliu": "$1 registrirane korisnike",
        "rcshowhideliu-show": "Prikaži",
        "rcshowhideliu-hide": "Sakrij",
        "rcshowhideanons": "$1 anonimne korisnike",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
-       "recentchanges-page-added-to-category": "[[:$1]] dodana je u kategoriju",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}}]] su dodane u kategoriju",
-       "recentchanges-page-removed-from-category": "[[:$1]] je uklonjena iz kategorije",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}} su uklonjene iz kategorije",
+       "recentchanges-page-added-to-category": "Stranica [[:$1]] dodana je u kategoriju",
+       "recentchanges-page-added-to-category-bundled": "Stranica [[:$1]] dodana je u kategoriju, [[Special:WhatLinksHere/$1|ovu stranicu sadrže druge stranice]]",
+       "recentchanges-page-removed-from-category": "Stranica [[:$1]] uklonjena je iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "Stranica [[:$1]] uklonjena je iz kategorije, [[Special:WhatLinksHere/$1|ovu stranicu sadrže druge stranice]]",
        "autochange-username": "Automatska promjena MediaWikija",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "unknown-error": "Desila se nepoznata greška.",
        "tmp-create-error": "Nije moguće napraviti privremenu datoteku.",
        "tmp-write-error": "Greška pri pisanju privremene datoteke.",
-       "large-file": "Preporučeno je da datoteke nisu veće od $1;\nOva datoteka je velika $2.",
+       "large-file": "Preporučeno je da datoteke ne budu veće od $1;\nova datoteka je velika $2.",
        "largefileserver": "Ova datoteka je veća nego što je dozvoljeno u postavkama servera.",
        "emptyfile": "Datoteka koju ste poslali je prazna. Ovo je moguće zbog greške u imenu datoteke. Molimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.",
        "windows-nonascii-filename": "Ova wiki ne podržava imena datoteka sa posebnim znacima.",
        "uploadwarning": "Upozorenje pri postavljanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
-       "uploaddisabled": "Slanje fajlova je isključeno",
+       "uploaddisabled": "Postavljanje datoteka je onemogućeno.",
        "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.",
        "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
-       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor \"$1\".",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Nije moguće raščlaniti XML postavljene datoteke.",
        "uploadvirus": "Datoteka sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati da se zaobiđu sigurnosne zabrane.",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne sa ove domene.",
+       "upload-dialog-disabled": "Onemogućeno je postavljanje datoteka pomoću ovog dijaloga.",
        "upload-dialog-title": "Postavi datoteku",
        "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-back": "Nazad",
        "upload-dialog-button-done": "Gotovo",
        "upload-dialog-button-save": "Sačuvaj",
        "upload-dialog-button-upload": "Postavi",
        "backend-fail-hashes": "Nisam našao datoteku disperzije radi usporedbe.",
        "backend-fail-notsame": "Već postoji različita datoteka $1.",
        "backend-fail-invalidpath": "$1 nije valjana putanja za skladištenje.",
-       "backend-fail-delete": "Ne može se izbrisati datoteka $1.",
+       "backend-fail-delete": "Ne mogu obrisati datoteku \"$1\".",
        "backend-fail-describe": "Ne mogu promijeniti metapodatke za datoteku \"$1\".",
        "backend-fail-alreadyexists": "Datoteka $1 već postoji.",
        "backend-fail-store": "Ne može se spremiti datoteka $1 na $2.",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži medije po imenu:",
-       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
+       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_thumb": "Smanjeni pregled",
        "file-anchor-link": "Datoteka",
        "filehist": "Historija datoteke",
        "filehist-help": "Kliknite na datum/vrijeme da vidite verziju datoteke iz tog vremena.",
-       "filehist-deleteall": "izbriši sve",
+       "filehist-deleteall": "obriši sve",
        "filehist-deleteone": "obriši",
        "filehist-revert": "vrati",
        "filehist-current": "trenutno",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''Datoteka [[Media:$1|$1]]''' je vraćena na [$4 verziju od $3, $2].",
        "filerevert-badversion": "Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.",
+       "filerevert-identical": "Trenutna verzija datoteke identična je izabranoj.",
        "filedelete": "Obriši $1",
        "filedelete-legend": "Obriši datoteku",
        "filedelete-intro": "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
        "listduplicatedfiles": "Spisak duplih datoteka",
        "listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Prikazane su samo lokalne datoteke.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
-       "unusedtemplates": "Nekorišteni šabloni",
+       "unusedtemplates": "Neiskorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "randompage": "Slučajna stranica",
        "statistics-files": "Broj postavljenih datoteka",
        "statistics-edits": "Broj izmjena od kako je instalirana {{SITENAME}}",
        "statistics-edits-average": "Prosječno izmjena po stranici",
-       "statistics-users": "Registrovani [[Special:ListUsers|korisnici]]",
+       "statistics-users": "Registrirani [[Special:ListUsers|korisnici]]",
        "statistics-users-active": "Aktivni korisnici",
        "statistics-users-active-desc": "Korisnici koji su izvršili akciju u toku {{PLURAL:$1|posljednjeg dana|posljednja $1 dana|posljednjih $1 dana}}",
        "pageswithprop": "Stranice sa svojstvom stranice",
        "brokenredirectstext": "Sljedeća preusmjerenja vode na nepostojeće stranice:",
        "brokenredirects-edit": "uredi",
        "brokenredirects-delete": "obriši",
-       "withoutinterwiki": "Članci bez interwiki linkova",
+       "withoutinterwiki": "Stranice bez jezičkih linkova",
        "withoutinterwiki-summary": "Slijedeće stranice nemaju linkove prema verzijama na drugim jezicima.",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Prikaži",
-       "fewestrevisions": "Stranice sa najmanje izmjena",
+       "fewestrevisions": "Stranice s najmanje izmjena",
        "nbytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
-       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije}}",
+       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}",
        "ninterwikis": "$1 {{PLURAL:$1|međujezična veza|međujezične veze}}",
-       "nlinks": "$1 {{PLURAL:$1|veza|veze}}",
-       "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nlinks": "$1 {{PLURAL:$1|linka|linka|linkova}}",
+       "nmembers": "$1 {{PLURAL:$1|član|člana|članova}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|verzija|verzije|verzija}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "specialpage-empty": "Nema rezultata za ovaj izvještaj.",
        "lonelypages": "Siročad",
        "lonelypagestext": "Sljedeće stranice nisu povezane niti su uključene transkluzijom u druge stranice na {{GRAMMAR:dativ|{{SITENAME}}}}.",
-       "uncategorizedpages": "Nekategorisane stranice",
-       "uncategorizedcategories": "Nekategorisane kategorije",
-       "uncategorizedimages": "Slike bez kategorije",
-       "uncategorizedtemplates": "Šabloni bez kategorije",
+       "uncategorizedpages": "Nekategorizirane stranice",
+       "uncategorizedcategories": "Nekategorizirane kategorije",
+       "uncategorizedimages": "Nekategorizirane datoteke",
+       "uncategorizedtemplates": "Nekategorizirani šabloni",
        "unusedcategories": "Neiskorištene kategorije",
        "unusedimages": "Nekorištene slike",
        "wantedcategories": "Tražene kategorije",
-       "wantedpages": "Najpotrebnije stranice",
+       "wantedpages": "Tražene stranice",
        "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
-       "wantedfiletext-cat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze u [[:$1]].",
+       "wantedfiletext-cat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako postoje. Takve datoteke će biti <del>precrtane</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke nalaze se u [[:$1]].",
        "wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
-       "wantedfiletext-nocat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> sa spiska.",
+       "wantedfiletext-nocat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako postoje. Takve datoteke će biti <del>precrtane</del> sa spiska.",
        "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
-       "wantedtemplates": "Potrebni šabloni",
-       "mostlinked": "Članci sa najviše linkova",
-       "mostlinkedcategories": "Kategorije sa najviše linkova",
+       "wantedtemplates": "Traženi šabloni",
+       "mostlinked": "Stranice s najviše linkova",
+       "mostlinkedcategories": "Kategorije s najviše linkova",
        "mostlinkedtemplates": "Najviše uključene stranice",
-       "mostcategories": "Članci sa najviše kategorija",
+       "mostcategories": "Stranice s najviše kategorija",
        "mostimages": "Datoteke s najviše veza",
        "mostinterwikis": "Stranice sa najviše međuwikija",
-       "mostrevisions": "Članci sa najviše izmjena",
-       "prefixindex": "Sve stranice sa prefiksom",
+       "mostrevisions": "Stranice s najviše izmjena",
+       "prefixindex": "Sve stranice s prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
        "prefixindex-submit": "Prikaži",
        "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
-       "longpages": "Dugačke stranice",
-       "deadendpages": "Stranice bez unutrašnjih veza",
-       "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
+       "longpages": "Duge stranice",
+       "deadendpages": "Stranice bez unutrašnjih linkova",
+       "deadendpagestext": "Sljedeće stranice nisu povezane s drugim stranicama na {{GRAMMAR:dativ|{{SITENAME}}}}.",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničena zaštićenja",
        "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-performer": "Zaštita korisnika",
        "protectedpages-params": "Parametri zaštite",
        "protectedpages-reason": "Razlog",
+       "protectedpages-submit": "Prikaži stranice",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nijedan naslov članka trenutno nije zaštićen ovim parametrima.",
+       "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
+       "apisandbox-unfullscreen": "Prikaži stranicu",
+       "apisandbox-reset": "Očisti",
+       "apisandbox-retry": "Pokušaj ponovo",
+       "apisandbox-loading": "Učitavam podatke o API modulu \"$1\"...",
+       "apisandbox-examples": "Primjeri",
+       "apisandbox-dynamic-parameters": "Dodatni parametri",
+       "apisandbox-dynamic-parameters-add-label": "Dodaj parametar:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Ime parametra",
+       "apisandbox-dynamic-error-exists": "Parametar pod nazivom \"$1\" već postoji.",
+       "apisandbox-deprecated-parameters": "Zastarjeli parametri",
+       "apisandbox-fetch-token": "Automatski ispuni žeton",
+       "apisandbox-submit-invalid-fields-title": "Neka polja nisu ispravna",
+       "apisandbox-submit-invalid-fields-message": "Ispravite naznačena polja i pokušajte ponovo.",
+       "apisandbox-results": "Rezultati",
+       "apisandbox-continue": "Nastavi",
+       "apisandbox-continue-clear": "Očisti",
+       "apisandbox-multivalue-all-values": "$1 (sve vrijednosti)",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-search": "Traži",
        "alllogstext": "Skupni prikaz svih dostupnih zapisnika sa {{GRAMMAR:genitiv|{{SITENAME}}}}.\nMožete suziti prikaz izabiranjem specifičnog zapisnika, korisničkog imena (razlikovati velika i mala slova) ili izmijenjenog članka (također treba razlikovati velika i mala slova).",
        "logempty": "Nema zatraženih stavki u zapisniku.",
        "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
-       "showhideselectedlogentries": "Pokaži/sakrij izabrane zapise u evidenciji",
+       "showhideselectedlogentries": "Pokaži/sakrij izabrane unose u zapisniku",
        "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "checkbox-select": "Izaberi: $1",
        "checkbox-all": "Sve",
        "cachedspecial-refresh-now": "Pogledaj najnoviju.",
        "categories": "Kategorije",
        "categories-submit": "Prikaži",
-       "categoriespagetext": "{{PLURAL:$1|Slijedeća kategorija sadrži|Slijedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nVidi također [[Special:WantedCategories|zatražene kategorije]].",
+       "categoriespagetext": "{{PLURAL:$1|Sljedeća kategorija sadrži|Sljedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nTakođer pogledajte [[Special:WantedCategories|zatražene kategorije]].",
        "categoriesfrom": "Prikaži kategorije počev od:",
-       "deletedcontributions": "Obrisani doprinosi korisnika",
+       "deletedcontributions": "Obrisani korisnički doprinosi",
        "deletedcontributions-title": "Obrisani doprinosi korisnika",
        "sp-deletedcontributions-contribs": "doprinosi",
        "linksearch": "Pretraga vanjskih linkova",
        "activeusers-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike koji počinju sa:",
        "activeusers-noresult": "Nije pronađen korisnik.",
+       "activeusers-submit": "Prikaži aktivne korisnike",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pripadajućim pravima pristupa.\nMoguće je da o svakoj grupi postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
        "listgrouprights-rights": "Prava",
        "listgrouprights-helppage": "Help:Prava grupe",
        "listgrouprights-members": "(spisak članova)",
-       "listgrouprights-addgroup": "Mogu dodati {{PLURAL:$2|grupu|grupe}}: $1",
-       "listgrouprights-removegroup": "Mogu ukloniti {{PLURAL:$2|grupu|grupe}}: $1",
+       "listgrouprights-addgroup": "Dodavanje {{PLURAL:$2|sljedeće grupe|sljedećih grupa}}: $1",
+       "listgrouprights-removegroup": "Uklanjanje {{PLURAL:$2|sljedeće grupe|sljedećih grupa}}: $1",
        "listgrouprights-addgroup-all": "Može dodavati sve grupe",
        "listgrouprights-removegroup-all": "Može ukloniti sve grupe",
        "listgrouprights-addgroup-self": "Može dodati {{PLURAL:$2|grupu|grupe|grupa}} na svoj račun: $1",
        "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
+       "listgrants": "Dozvole",
        "listgrants-summary": "Ovo je spisak OAuth dozvola s odgovarajućim pravima uz svaku dozvolu s desne strane. Korisnici aplikacijama mogu odobriti da koriste njihov korisnički račun ali uz ograničena prava u zavisnosti od tog koju dozvolu im korisnik omogući. Međutim, aplikacija koja se koristi korisničkim računom ne može koristiti prava koja korisnik ne posjeduje. Moguće je da postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.",
-       "trackingcategories": "Praćenje kategorija",
+       "listgrants-grant": "Dozvola",
+       "listgrants-rights": "Prava",
+       "trackingcategories": "Kategorije za praćenje",
        "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
        "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
        "emailccsubject": "Kopiraj Vašu poruku za $1: $2",
        "emailsent": "Poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s {{GRAMMAR:genitiv|{{SITENAME}}}}. Ako {{GENDER:$2|odgovorite}} na ovu e-poruku, {{GENDER:$2|Vaša}} će se poruka direktno poslati {{GENDER:$1|originalnom pošiljaocu|originalnoj pošiljatejici}} i otkrit ćete {{GENDER:$1|mu|joj}} {{GENDER:$2|svoju}} adresu e-pošte.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja",
        "mywatchlist": "Spisak praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
+       "watchlistanontext": "Morate biti prijavljeni da biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
        "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na Vaš [[Special:Watchlist|spisak praćenja]].",
        "removedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor uklonjeni su s Vašeg [[Special:Watchlist|spiska praćenja]].",
        "removedwatchtext-talk": "\"[[:$1]]\" i njoj pridružena stranica uklonjene su s Vašeg [[Special:Watchlist|spiska praćenja]].",
        "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
-       "watch": "Prati članak",
+       "watch": "Prati",
        "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prestani pratiti",
        "unwatchthispage": "Prestani pratiti",
-       "notanarticle": "Nije članak",
-       "notvisiblerev": "Revizija je obrisana",
+       "notanarticle": "Nije stranica sa sadržajem",
+       "notvisiblerev": "Obrisana je posljednja izmjena drugog korisnika",
        "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na Vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "Uključeno je obavještenje e-poštom.",
        "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili prikazane su <strong>podebljanim slovima</strong>.",
-       "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su <strong>$1</strong> posljednje izmjene|su <strong>$1</strong> posljednjih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "wlshowtime": "Vremensko razdoblje za prikaz:",
        "wlshowhideminor": "manje izmjene",
        "wlshowhidebots": "botove",
-       "wlshowhideliu": "registrovane korisnike",
+       "wlshowhideliu": "registrirane korisnike",
        "wlshowhideanons": "anonimne korisnike",
        "wlshowhidepatr": "patrolirane izmjene",
        "wlshowhidemine": "moje izmjene",
+       "wlshowhidecategorization": "kategorizaciju stranica",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "unwatching": "Ne pratim...",
        "enotif_anon_editor": "anonimni korisnik $1",
        "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "napravljena",
-       "changed": "promijenjena",
+       "changed": "izmijenjena",
        "deletepage": "Obriši stranicu",
-       "confirm": "Potvrdite",
+       "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: \"$1\"",
        "excontentauthor": "sadržaj je bio: \"$1\", a jedini urednik \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: \"$1\"",
        "delete-toobig": "Ova stranica ima veliku historiju promjena, preko $1 {{PLURAL:$1|revizije|revizija}}.\nBrisanje takvih stranica nije dopušteno da bi se spriječilo slučajno preopterećenje servera na kojem je {{SITENAME}}.",
        "delete-warning-toobig": "Ova stranica ima veliku historiju izmjena, preko $1 {{PLURAL:$1|izmjene|izmjena}}.\nNjeno brisanje može dovesti do opterećenja operacione baze na {{SITENAME}};\nnastavite s oprezom.",
        "deleteprotected": "Ne možete obrisati ovu stranicu jer je zaštićena.",
-       "deleting-backlinks-warning": "'''Upozorenje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge stranice]] sadrže link ili vode na stranicu koju brišete.",
+       "deleting-backlinks-warning": "<strong>Upozorenje:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge stranice]] sadrže link ili vode na stranicu koju brišete.",
        "rollback": "Vrati izmjene",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}",
        "rollbacklinkcount-morethan": "vrati više od $1 {{PLURAL:$1|izmjene|izmjene|izmjena}}",
        "rollbackfailed": "Neuspješno vraćanje",
+       "rollback-missingrevision": "Ne mogu učitati podatke o izmjeni.",
        "cantrollback": "Ne mogu vratiti izmjenu;\nposljednji autor je ujedno i jedini.",
        "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko je već izmijenio ili vratio članak na prethodnu provjerenu verziju.\n\nPosljednju izmjenu napravio je korisnik [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: <em>$1</em>.",
        "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
        "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
        "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "changecontentmodel-emptymodels-title": "Nema dostupnih modela sadržaja",
+       "changecontentmodel-emptymodels-text": "Model sadržaja stranice [[:$1]] ne može se pretvoriti ni u jednu drugu vrstu.",
        "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
        "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|napravio|napravila}} je stranicu $3 s nestandardnim modelom sadržaja \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
        "logentry-contentmodel-change-revertlink": "vrati",
        "logentry-contentmodel-change-revert": "vrati",
        "unprotectedarticle": "uklonjena zaštita sa stranice \"[[$1]]\"",
        "movedarticleprotection": "podešavanja zaštite premještena sa \"[[$2]]\" na \"[[$1]]\"",
        "protectedarticle-comment": "{{GENDER:$2|Zaštitio|Zaštitila}} je stranicu \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Promijenjen nivo zaštite}} za \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Uklonjena zaštita}} sa stranice \"[[$1]]\"",
        "protect-title": "Mijenjate nivo zašite za \"$1\"",
        "protect-title-notallowed": "Pregled stepena zaštite za \"$1\"",
        "prot_1movedto2": "članak [[$1]] premješten na [[$2]]",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje izmjena",
        "undeleteextrahelp": "Da biste vratili cijelu historiju stranice, ostavite sve kućice neoznačene i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.\nDa biste vratili određene izmjene, označite ih i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjena je obrisano}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjene su obrisane|izmjena je obrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve će izmjene biti vraćene u njenu historiju.\nAko je u međuvremenu napravljena nova izmjena s istim nazivom, vraćene izmjene pojavit će se u njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje neće biti izvršeno ako je rezultat toga djelomično brisanje posljednje izmjene.\nU takvim slučajevima morate isključiti ili otkriti najnoviju obrisanu izmjenu.",
        "undeletehistorynoadmin": "Ova stranica je obrisana.\nRazlog za brisanje se nalazi ispod, zajedno s detaljima o korisniku koji je mijenjao stranicu prije brisanja.\nTekst obrisanih verzija dostupan je samo administratorima.",
        "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": "'''$1 je vraćena'''\n\nProvjerite [[Special:Log/delete|zapis brisanja]] za zapise najskorijih brisanja i vraćanja.",
+       "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.",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "undelete-search-box": "Pretraga obrisanih stranica",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(glavni)",
-       "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
+       "contributions": "{{GENDER:$1|Korisnički}} doprinosi",
        "contributions-title": "Doprinosi korisnika $1",
        "mycontris": "Doprinosi",
        "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
-       "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
+       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
+       "nocontribs": "Nema izmjena koje odgovaraju navedenim kriterijima.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "year": "Od godine (i ranije):",
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sljedeći članci vode na '''[[:$1]]''':",
+       "linkshere": "Sljedeće stranice vode na <strong>[[:$1]]</strong>:",
        "nolinkshere": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong>.",
        "nolinkshere-ns": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong> u izabranom imenskom prostoru.",
        "isredirect": "preusmjerenje",
-       "istemplate": "šablon",
+       "istemplate": "uključivanje",
        "isimage": "veza na datoteku",
        "whatlinkshere-prev": "{{PLURAL:$1|prethodni|prethodna|prethodnih}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|sljedeći|sljedeća|sljedećih}} $1",
        "whatlinkshere-hidelinks": "$1 linkove",
        "whatlinkshere-hideimages": "$1 linkova do datoteke",
        "whatlinkshere-filters": "Filteri",
+       "whatlinkshere-submit": "Idi",
        "autoblockid": "Automatska blokada #$1",
        "block": "Blokiraj korisnika",
        "unblock": "Odblokiraj korisnika",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
        "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "još $1",
        "unblockip": "Odblokiraj korisnika",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili\npravo pisanja ranije blokiranoj IP adresi\nili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocklink": "deblokiraj",
        "change-blocklink": "promijeni blokadu",
        "contribslink": "doprinosi",
-       "emaillink": "pošalji e-mail",
+       "emaillink": "pošalji e-poruku",
        "autoblocker": "Automatski ste blokirani jer dijelite IP-adresu sa \"[[User:$1|$1]]\".\nRazlog za blokiranje korisnika $1 je ''$2''",
        "blocklogpage": "Zapisnik blokiranja",
        "blocklog-showlog": "Ovaj korisnik je ranije blokiran. Zapisnik blokiranja je prikazan ispod kao referenca:",
        "unblock-hideuser": "Ne možete deblokirati ovog korisnika jer je njegovo korisničko ime sakriveno.",
        "ipb_cant_unblock": "Greška: Blokirani ID $1 nije pronađen. Možda je korisnik već deblokiran.",
        "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može se deblokirati.\nMeđutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.",
-       "ip_range_invalid": "Netačan raspon IP adresa.",
+       "ip_range_invalid": "Netačan opseg IP-adresa.",
        "ip_range_toolarge": "Nisu dopuštene blokade veće od /$1.",
        "proxyblocker": "Zaštita od proxya",
        "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proxy.\nMolimo vas da kontaktirate vašeg davatelja internetskih usluga ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.",
        "cant-see-hidden-user": "Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.",
        "ipbblocked": "Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani",
        "ipbnounblockself": "Nije Vam dopušteno da deblokirate samog sebe",
-       "lockdb": "Zaključajte bazu",
-       "unlockdb": "Otključaj bazu",
-       "lockdbtext": "Zaključavanje baze će svim korisnicima ukinuti mogućnost izmjene stranica,\npromjene korisničkih podešavanja, izmjene praćenih članaka, i svega ostalog\nšto zahtjeva promjene u bazi.\nMolimo Vas da potvrdite da je ovo zaista ono što namjeravate da uradite, i da ćete\notkučati bazu kad završite posao oko njenog održavanja.",
+       "lockdb": "Zaključavanje baze podataka",
+       "unlockdb": "Otključavanje baze podataka",
+       "lockdbtext": "Zaključavanje baze će svim korisnicima ukinuti mogućnost izmjene stranica,\nkorisničkih postavki, praćenih članaka i svega ostalog\nšto zahtijeva izmjenu u bazi.\nPotvrdite da je ovo zaista ono što namjeravate uraditi i da ćete\notkučati bazu kad završite posao oko njenog održavanja.",
        "unlockdbtext": "Otključavanje baze će svim korisnicima vratiti mogućnost\nizmjene stranica, promjene korisničkih stranica, izmjene spiska praćenih članaka,\ni svega ostalog što zahtjeva promjene u bazi.\nMolimo Vas da potvrdite da je ovo zaista ono što namijeravate da uradite.",
-       "lockconfirm": "Da, zaista želim da zaključam bazu.",
-       "unlockconfirm": "Da, zaista želim da otključam bazu.",
-       "lockbtn": "Zaključajte bazu",
+       "lockconfirm": "Da, zaista želim zaključati bazu.",
+       "unlockconfirm": "Da, zaista želim otključati bazu.",
+       "lockbtn": "Zaključaj bazu",
        "unlockbtn": "Otključaj bazu",
        "locknoconfirm": "Niste potvrdili svoju namjeru.",
        "lockdbsuccesssub": "Baza je zaključana",
        "unlockdbsuccesssub": "Baza je otključana",
-       "lockdbsuccesstext": "{{SITENAME}} baza podataka je zaključana. <br /> Sjetite se da je otključate kad završite sa održavanjem.",
+       "lockdbsuccesstext": "Baza podataka je zaključana.<br />\nNe zaboravite je [[Special:UnlockDB|otključati]] nakon što završite s održavanjem.",
        "unlockdbsuccesstext": "{{SITENAME}} baza podataka je otključana.",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "movepagetalktext": "Ako označite ovu kutijicu, odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena na novi naziv, osim ako već postoji sadržaj na odredišnoj stranici za razgovor.\n\nU tom slučaju, morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
        "moveuserpage-warning": "<strong>Upozorenje:</strong> Premještate korisničku stranicu. Imajte u vidu da će samo stranica biti premještena, a sam korisnik <em>neće</em> biti preimenovan.",
        "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
-       "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
+       "movenologintext": "Morate biti registrirani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještanje datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (bez podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
        "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
        "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
+       "cant-move-subpages": "Nemate dopuštenje da premještate podstranice.",
+       "namespace-nosubpages": "Imenski prostor \"$1\" ne dozvoljava podstranice.",
        "newtitle": "Novi naslov:",
        "move-watch": "Prati izvornu i odredišnu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "movelogpagetext": "Ispod je spisak premještenih stranica.",
        "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}",
        "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
+       "movesubpagetalktext": "Odgovarajuća stranica za razgovor ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
        "move-leave-redirect": "Ostavi preusmjerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je mogu premještati samo korisnici sa ovlastima administratora.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "semiprotectedpagemovewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo registrovani korisnici.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
-       "move-over-sharedrepo": "== Datoteka postoji ==\n[[:$1]] postoji na dijeljenom repozitorijumu. Premještanje datoteke na ovaj naslov će prepisati dijeljenu datoteku.",
+       "move-over-sharedrepo": "[[:$1]] postoji na dijeljenom skladištu. Premještanje datoteke na ovaj naslov zamijenit će dijeljenu datoteku.",
        "file-exists-sharedrepo": "Ime datoteke koje ste odabrali je već korišteno u dijeljenom repozitorijumu.\nMolimo odaberite drugo ime.",
-       "export": "Izvezite stranice",
+       "export": "Izvoz stranica",
        "exporttext": "Možete izvesti tekst i historiju jedne ili više stranica uklopljene u XML kod.\nOvo se može uvesti u drugi wiki koristeći MediaWiki preko [[Special:Import|stranice uvoza]].\n\nZa izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutnu verziju zajedno sa svim ranijim, ili samo trenutnu verziju sa informacijom o zadnjoj promjeni.\n\nU drugom slučaju možete koristiti i vezu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Izvezi sve stranice",
-       "exportcuronly": "Uključite samo trenutnu reviziju, ne cijelu historiju",
+       "exportcuronly": "Uključi samo trenutnu verziju, ne cijelu historiju",
        "exportnohistory": "----\n'''Pažnja:''' Izvoz cjelokupne historije stranica preko ovog obrasca je onemogućeno iz tehničkih razloga.",
        "exportlistauthors": "Uključi cjelokupan spisak doprinosilaca za svaku stranicu",
        "export-submit": "Izvezi",
        "export-download": "Spremi kao datoteku",
        "export-templates": "Uključi šablone",
        "export-pagelinks": "Uključi povezane stranice do dubine od:",
+       "export-manual": "Ručno dodaj stranice:",
        "allmessages": "Sve sistemske poruke",
        "allmessagesname": "Naziv",
-       "allmessagesdefault": "Uobičajeni tekst",
+       "allmessagesdefault": "Predodređeni tekst",
        "allmessagescurrent": "Trenutni tekst",
-       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u imenskom prostoru MediaWiki.\nPosjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je <i>wgUseDatabaseMessages</i> isključen.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter po stanju podešavanja:",
        "thumbnail-dest-create": "Ne mogu da sačuvam smanjenu sliku (\"thumbnail\") na destinaciju",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
        "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
-       "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
+       "thumbnail_dest_directory": "Ne mogu napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Datoteka ne dostaje: $1",
        "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
-       "importtext": "Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na Vašem računaru i pošaljite ovdje.",
-       "importstart": "Uvoz stranica...",
-       "import-revision-count": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
+       "importtext": "Izvezite datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na svoj računar i postavite je ovdje.",
+       "importstart": "Uvozim stranice...",
+       "import-revision-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "importnopages": "Nema stranica za uvoz.",
        "imported-log-entries": "{{PLURAL:$1|Uvezena $1 stavka zapisnika|Uvezene $1 stavke zapisnika|Uvezeno $1 stavki zapisnika}}.",
-       "importfailed": "Uvoz nije uspjeo: $1",
+       "importfailed": "Uvoz nije uspio: $1",
        "importunknownsource": "Nepoznat izvorni tip uvoza",
-       "importcantopen": "Ne može se otvoriti uvozna datoteka",
+       "importcantopen": "Ne mogu otvoriti datoteku za uvoz",
        "importbadinterwiki": "Loš interwiki link",
        "importsuccess": "Uspješno ste uvezli stranicu!",
-       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
+       "importnosources": "Nije definiran međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
        "importnofile": "Uvozna datoteka nije postavljena.",
        "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća nego što je dopušteno.",
        "importuploaderrorpartial": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je samo djelimično postavljena.",
        "xml-error-string": "$1 na liniji $2, kolona $3 (bajt $4): $5",
        "import-upload": "Postavljanje XML podataka",
        "import-token-mismatch": "Izgubljeni podaci sesije. Molimo pokušajte ponovno.",
-       "import-invalid-interwiki": "Ne može se uvesti iz navedenog wikija.",
+       "import-invalid-interwiki": "Ne mogu uvesti iz navedenog wikija.",
        "import-error-edit": "Stranica \"$1\" nije uvezena jer vam nije dopušteno da je uređujete.",
        "import-error-create": "Stranica \"$1\" nije uvezena jer vam nije dozvoljeno da je napravite.",
        "import-error-interwiki": "Stranica \"$1\" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).",
        "import-rootpage-nosubpage": "Imenski prostor \"$1\" osnovne stranice ne dozvoljava podstranice.",
        "importlogpage": "Zapisnik uvoza",
        "importlogpagetext": "Administrativni uvozi stranica sa historijom izmjena sa drugih wikija.",
-       "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena jedna revizija|Uvezene $1 revizije|Uvezeno $1 revizija}}",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena $1 revizija|Uvezene $1 revizije|Uvezeno $1 revizija}} od $2",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena jedna izmjena|Uvezene $1 izmjene|Uvezeno $1 izmjena}}",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena $1 izmjena|Uvezene $1 izmjene|Uvezeno $1 izmjena}} sa $2",
        "javascripttest": "Testiranje JavaScript-e",
        "javascripttest-pagetext-unknownaction": "Nepoznata radnja \"$1\".",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
        "tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
-       "tooltip-p-logo": "Glavna stranica",
+       "tooltip-p-logo": "Posjetite početnu stranicu",
        "tooltip-n-mainpage": "Posjetite početnu stranicu",
        "tooltip-n-mainpage-description": "Posjetite početnu stranicu",
        "tooltip-n-portal": "O projektu, šta možete da uradite, gdje se šta nalazi",
        "tooltip-ca-nstab-category": "Pogledajte stranicu kategorije",
        "tooltip-minoredit": "Označi kao manju izmjenu",
        "tooltip-save": "Sačuvaj moje izmjene",
+       "tooltip-publish": "Objavi svoje izmjene",
        "tooltip-preview": "Pregledajte svoje izmjene. Preporučeno pri bilo kakvom uređivanju!",
        "tooltip-diff": "Prikaži moje izmjene u tekstu",
        "tooltip-compareselectedversions": "Uporedi razliku između dvije izabrane verzije ove stranice",
        "print.css": "/* CSS umetnut ovdje uticat će na izgled isprintane stranice */",
        "common.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
-       "siteuser": "{{SITENAME}} korisnik $1",
+       "siteuser": "{{SITENAME}} {{GENDER:$2|korisnik|korisnica}} $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
        "lastmodifiedatby": "Ovu stranicu posljednji je put {{GENDER:$4|izmijenio|izmijenila}} $3 dana $1 u $2.",
        "othercontribs": "Bazirano na radu od strane korisnika $1.",
        "others": "ostali",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|korisnik|korisnika}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|korisnik|korisnica}}|korisnici}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni korisnik|anonimni korisnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Autori ove stranice nisu navedeni.",
        "pageinfo-length": "Dužina stranice (u bajtovima)",
        "pageinfo-article-id": "ID stranice",
        "pageinfo-language": "Jezik sadržaja stranice",
+       "pageinfo-language-change": "promijeni",
        "pageinfo-content-model": "Model sadržaj stranice",
+       "pageinfo-content-model-change": "promijeni",
        "pageinfo-robot-policy": "Indeksiranje od strane robota",
        "pageinfo-robot-index": "Dozvoljeno",
        "pageinfo-robot-noindex": "Nije dozvoljeno",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj potkategorija",
        "pageinfo-category-files": "Broj datoteka",
+       "pageinfo-user-id": "Korisnički ID",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi stranicu kao patroliranu",
        "markaspatrolledtext-file": "Označi ovu verziju datoteke kao patroliranu",
        "markedaspatrolled": "Označeno kao patrolirano",
-       "markedaspatrolledtext": "Izabrana revizija [[:$1]] je bila označena kao patrolirana.",
+       "markedaspatrolledtext": "Izabrana izmjena stranice [[:$1]] označena je patroliranom.",
        "rcpatroldisabled": "Patroliranje nedavnih izmjena onemogućeno",
        "rcpatroldisabledtext": "Funkcija patroliranja nedavnih izmjena je trenutno isključena.",
-       "markedaspatrollederror": "Ne može se označiti kao patrolirano",
-       "markedaspatrollederrortext": "Morate naglasiti reviziju koju treba označiti kao patroliranu.",
+       "markedaspatrollederror": "Ne mogu označiti kao patrolirano",
+       "markedaspatrollederrortext": "Morate izabrati izmjenu koju želite označiti patroliranom.",
        "markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
-       "markedaspatrollednotify": "Ova izmjena na stranici „$1“ je označena kao pregledana.",
+       "markedaspatrollednotify": "Ova izmjena na stranici $1 označena je kao patrolirana.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
-       "log-show-hide-patrol": "$1 zapis patroliranja",
+       "log-show-hide-patrol": "$1 zapisnik patroliranja",
        "log-show-hide-tag": "$1 zapisnik oznaka",
-       "deletedrevision": "Obrisana stara revizija $1",
+       "confirm-markpatrolled-button": "U redu",
+       "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 patroliranom?",
+       "deletedrevision": "Obrisana stara izmjena $1",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1",
        "filedelete-missing": "Datoteka \"$1\" ne može biti obrisana, jer ne postoji.",
        "previousdiff": "← Starija izmjena",
        "nextdiff": "Novija izmjena →",
        "mediawarning": "'''Upozorenje''': Ova datoteka sadrži loš kod, njegovim izvršavanjem možete da ugrozite Vaš sistem.",
-       "imagemaxsize": "Ograničenje veličine slike:<br />''(za stranice opisa datoteke)''",
+       "imagemaxsize": "Ograničenje veličine slike:<br /><em>(za stranice opisa datoteke)</em>",
        "thumbsize": "Veličina umanjenog prikaza:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|stranica|stranice|stranica}}",
        "file-info": "veličina datoteke: $1, MIME tip: $2",
        "file-no-thumb-animation": "'''Napomena: Zbog tehničkih ograničenja minijature ove datoteke neće biti animirane.'''",
        "file-no-thumb-animation-gif": "'''Napomena: Zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće biti animirane.'''",
        "newimages": "Galerija novih slika",
-       "imagelisttext": "Ispod je spisak od '''$1''' {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
+       "imagelisttext": "Ispod je spisak od <strong>$1</strong> {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
        "newimages-summary": "Ova posebna stranica prikazuje nedavno postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
        "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
+       "newimages-hidepatrolled": "Sakrij patrolirana postavljanja",
        "noimages": "Nema ništa.",
+       "gallery-slideshow-toggle": "Uključi/isključi sličice",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "sp-newimages-showfrom": "Prikaz novih datoteka počev od $2, $1",
        "bad_image_list": "Koristi se sljedeći format:\n\nRazmatraju se samo stavke u spisku (linije koje počinju sa *).\nPrvi link u liniji mora biti povezan sa lošom slikom.\nSvi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje se slike pojavljuju ''inline''.",
        "metadata": "Metapodaci",
        "metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerovatno dodala digitalna kamera ili skener u procesu snimanja, odnosno digitalizacije. Ako je datoteka mijenjana, podaci možda nisu u skladu sa stvarnim stanjem.",
-       "metadata-expand": "Pokaži sve detalje",
-       "metadata-collapse": "Sakrij dodatne podatke",
+       "metadata-expand": "Prikaži detalje",
+       "metadata-collapse": "Sakrij detalje",
        "metadata-fields": "Polja metapodataka slika su prikazani ispod slike će biti uključeni u prikaz stranice slike kada je sakrivena tabela metapodataka. U suprotnom će biti sakrivena po postavkama.\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": "Širina",
        "exif-imagelength": "Visina",
        "exif-spectralsensitivity": "Spektralna osjetljivost",
        "exif-isospeedratings": "Rejting ISO brzine",
        "exif-shutterspeedvalue": "Brzina APEX okidača",
-       "exif-aperturevalue": "APEX otvor",
-       "exif-brightnessvalue": "APEX osvijetljenost",
+       "exif-aperturevalue": "Otvor blende",
+       "exif-brightnessvalue": "Osvijetljenost",
        "exif-exposurebiasvalue": "Kompozicija ekspozicije",
        "exif-maxaperturevalue": "Najveći broj otvora blende",
        "exif-subjectdistance": "Udaljenost objekta",
        "exif-gpslongituderef": "Istočna ili zapadna dužina",
        "exif-gpslongitude": "Dužina",
        "exif-gpsaltituderef": "Referenca visine",
-       "exif-gpsaltitude": "Nadmorska visina",
+       "exif-gpsaltitude": "Visina",
        "exif-gpstimestamp": "GPS vrijeme (atomski sat)",
        "exif-gpssatellites": "Sateliti korišteni pri mjerenju",
        "exif-gpsstatus": "Status prijemnika",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
-       "confirmemail_text": "Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. Aktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu. Pošta uključuje link koji sadrži kod; učitajte link u Vaš preglednik da bi ste potvrdili da je adresa Vaše e-pošte validna.",
-       "confirmemail_pending": "Konfirmacioni kod Vam je već poslan putem e-maila;\nako ste nedavno otvorili Vaš račun, trebali bi pričekati par minuta da poslana pošta stigne, prije nego što ponovno zahtijevate novi kod.",
+       "confirmemail_text": "{{SITENAME}} zahtijeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte.\nAktivirajte dugme ispod kako biste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje link koji sadrži kod;\nučitajte link u Vaš preglednik da biste potvrdili da je adresa Vaše e-pošte validna.",
+       "confirmemail_pending": "Potvrdni kod Vam je već poslan e-poštom;\nako ste nedavno otvorili račun, trebali biste pričekati nekoliko minuta da poslana pošta stigne, prije nego što ponovo zahtijevate novi kod.",
        "confirmemail_send": "Pošaljite kod za potvrdu",
        "confirmemail_sent": "E-pošta za potvrđivanje poslata.",
        "confirmemail_oncreate": "Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.\nTaj kod nije neophodan za prijavljivanje, ali Vam ne potreban kako bi ste omogućili funkcije wikija zasnovane na e-mailu.",
-       "confirmemail_sendfailed": "{{SITENAME}} Vam ne može poslati poštu za potvrđivanje. Provjerite adresu zbog nepravilnih karaktera.\n\nPovratna pošta: $1",
+       "confirmemail_sendfailed": "{{SITENAME}} Vam ne može poslati potvrdnu e-poruku.\nProvjerite sadrži li adresa nedopuštene znakove.\n\nGreška: $1",
        "confirmemail_invalid": "Netačan kod za potvrdu. Moguće je da je kod istekao.",
        "confirmemail_needlogin": "Morate biti $1 da biste potvrdili adresu vaše e-pošte.",
        "confirmemail_success": "Adresa vaše e-pošte je potvrđena. Možete sad da se prijavite i uživate u viki.",
        "confirmemail_loggedin": "Adresa Vaše e-pošte je potvrđena.",
-       "confirmemail_subject": "{{SITENAME}} – adresa e-pošte za potvrđivanje",
+       "confirmemail_subject": "Potvrda adrese e-pošte na {{GRAMMAR:dativ|{{SITENAME}}}}",
        "confirmemail_body": "Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog \"$2\" sa ovom adresom e-pošte na {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada vama i da aktivirate mogućnost e-pošte na {{SITENAME}}, otvorite ovaj link u vašem pregledniku:\n\n$3\n\nAko ovo niste vi, pratite ovaj link da prekinete prijavu:\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_changed": "Neko, vjerovatno Vi, je sa IP adrese $1\nje promijenio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_set": "Neko, vjerovatno Vi, je sa IP adrese $1\npostavio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj račun stvarno pripada Vama i da aktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kôd za potvrdu će isteći u $4.",
        "scarytranscludefailed": "[Neuspješno preusmjerenje šablona na $1]",
        "scarytranscludefailed-httpstatus": "[Preuzimanje šablona nije uspjelo za $1: HTTP $2]",
        "scarytranscludetoolong": "[URL je predugačak]",
-       "deletedwhileediting": "'''Upozorenje''': Ova stranica je obrisana prije nego što ste počeli uređivati!",
-       "confirmrecreate": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) obrisao je ovaj članak pošto ste počeli uređivanje s razlogom:\n: ''$2''\n\nMolimo Vas da potvrdite da stvarno želite ponovo napraviti ovaj članak.",
-       "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) obrisao je ovaj članak nakon što ste ga počeli uređivati. Molimo Vas da potvrdite da stvarno želite ponovo napraviti ovaj članak.",
+       "deletedwhileediting": "<strong>Upozorenje:</strong> Ova stranica je obrisana prije nego što ste počeli uređivati!",
+       "confirmrecreate": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao|obrisala}} je ovu stranicu nakon što ste je počeli uređivati iz sljedećeg razloga:\n: <em>$2</em>\n\nPotvrdite da stvarno želite ponovo napraviti ovu stranicu.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao|obrisala}} je ovu stranicu nakon što ste je počeli uređivati. Potvrdite da stvarno želite ponovo napraviti ovu stranicu.",
        "recreate": "Ponovno napravi",
        "unit-pixel": "px",
        "confirm_purge_button": "U redu",
        "confirm-purge-top": "Da li želite obrisati keš ove stranice?",
        "confirm-purge-bottom": "Ispražnjava keš stranice i prikazuje najsvježiju verziju.",
        "confirm-watch-button": "U redu",
-       "confirm-watch-top": "Dodajte ovu stranu na Vaš spisak praćenih članaka",
+       "confirm-watch-top": "Dodati ovu stranicu na spisak praćenja?",
        "confirm-unwatch-button": "U redu",
-       "confirm-unwatch-top": "Izbrišite ovu stranu sa Vašeg spiska praćenih članaka",
+       "confirm-unwatch-top": "Ukloniti ovu stranicu sa spiska praćenja?",
+       "confirm-rollback-button": "U redu",
+       "confirm-rollback-top": "Ukloniti izmjene na ovoj stranici?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← prethodna stranica",
        "imgmultipagenext": "slijedeća stranica →",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "KSV",
+       "timezone-local": "Lokalno",
        "duplicate-defaultsort": "Upozorenje: Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
        "duplicate-displaytitle": "<strong>Upozorenje:</strong> Prikazivani naslov \"$2\" poništava prethodni naslov \"$1\".",
+       "restricted-displaytitle": "<strong>Upozorenje:</strong> Naslov za prikaz \"$1\" zanemaren je jer ne odgovara stvarnom naslovu stranice.",
        "invalid-indicator-name": "<strong>Greška:</strong> <code>Imena</code> pokazatelja stanja strance ne smiju biti prazna.",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja",
        "version-libraries-license": "Licenca",
        "version-libraries-description": "Opis",
        "version-libraries-authors": "Autori",
-       "redirect": "Preusmjerenje na datoteku, korisnika, stranicu ili oznaku izmjene",
+       "redirect": "Preusmjerenje na datoteku, korisnika, stranicu, izmjenu ili zapisnik",
        "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (datog imena), stranicu (date oznake izmjene) ili korisničku stranicu (datog numeričkog identifikatora korisnika). Oznake se koriste na sljedeći način: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ili [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Idi",
        "redirect-lookup": "Tip vrijednosti:",
        "tag-filter": "Filter [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filter",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|oznaka|oznake}}]]: $2)",
+       "tag-mw-contentmodelchange": "promjena modela sadržaja",
        "tags-title": "Oznake",
        "tags-intro": "Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo značenje.",
        "tags-tag": "Naziv oznake",
        "tags-source-manual": "Ručno postavili korisnici ili botovi",
        "tags-source-none": "Više se ne koristi",
        "tags-edit": "uređivanje",
-       "tags-delete": "izbriši",
+       "tags-delete": "obriši",
        "tags-activate": "aktiviraj",
        "tags-deactivate": "dekativiraj",
        "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "tags-manage-no-permission": "Nemate pravo upravljati promjenama oznaka.",
+       "tags-manage-blocked": "Ne možete mijenjati oznake za promjenu dok {{GENDER:$1|ste}} blokirani.",
        "tags-create-heading": "Napravi novu oznaku",
        "tags-create-explanation": "Predoređeno je da će korisnici i botovi moći koristiti novonapravljene oznake.",
        "tags-create-tag-name": "Naziv oznake:",
        "tags-create-already-exists": "Oznaka \"$1\" već postoji.",
        "tags-create-warnings-above": "{{PLURAL:$2|Dogodila se sljedeća greška|Dogodile su se sljedeće greške}} pri stvaranju oznake \"$1\":",
        "tags-create-warnings-below": "Želite li nastaviti stvaranje oznake?",
-       "tags-delete-title": "Izbriši oznaku",
+       "tags-delete-title": "Brisanje oznaka",
        "tags-delete-explanation-initial": "Brišete oznaku \"$1\" iz baze podataka.",
        "tags-delete-explanation-in-use": "Bit će obrisana sa {{PLURAL:$2|$2 verzije ili unosa u zapisniku|svih $2 verzija i/ili unosa u zapisniku}} na kojima se trenutno koristi.",
        "tags-delete-explanation-warning": "Ova radnja se <strong>ne može povratiti</strong> te se <strong>ne može poništiti</strong>. Ovo ne mogu uraditi čak ni administratori baze podataka. Budite sigurni da je ovo oznaka koju želite obrisati.",
        "tags-delete-not-allowed": "Oznake koje su definirane proširenjem se ne mogu obrisati ukoliko to proširenje isključivo ne dopušta.",
        "tags-delete-not-found": "Oznaka \"$1\" ne postoji.",
        "tags-delete-too-many-uses": "Oznaka \"$1\" je primjenjena na više od {{PLURAL:$2|revizija|revizijǎ}}, što znači da se ne može obrisati.",
-       "tags-delete-warnings-after-delete": "Oznaka \"$1\" uspješno je obrisana. Međutim, došlo je do {{PLURAL:$2|sljedećeg upozorenja|sljedećih upozorenja}}:",
+       "tags-delete-warnings-after-delete": "Oznaka \"$1\" je obrisana. Međutim, došlo je do {{PLURAL:$2|sljedećeg upozorenja|sljedećih upozorenja}}:",
+       "tags-delete-no-permission": "Nemate dopuštenje da brišete oznake za promjenu.",
        "tags-activate-title": "Aktiviraj oznaku",
        "tags-activate-question": "Aktivirate oznaku \"$1\".",
        "tags-activate-reason": "Razlog:",
        "tags-deactivate-not-allowed": "Nije moguće deaktivirati oznaku \"$1\".",
        "tags-deactivate-submit": "Deaktiviraj",
        "tags-apply-no-permission": "Nemate dopuštenja da dodate izmjenske oznake zajedno s vašim promjenama.",
-       "tags-apply-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-apply-not-allowed-one": "Nije dozvoljeno da se oznaka \"$1\" ručno dodaje.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
        "tags-update-no-permission": "Nemate dopuštenje da dodate ili uklonite izmjenske oznake sa zasebnih verzija ili zapisničkih unosa.",
-       "tags-update-add-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-update-add-not-allowed-one": "Nije dozvoljeno da se oznaka \"$1\" ručno dodaje.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
        "tags-update-remove-not-allowed-one": "Oznaka \"$1\" se ne može ručno ukloniti.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno ukloni|Sljedeće oznake ne dozvoljavaju da se ručno uklone}}: $1",
        "tags-edit-title": "Uredi oznake",
        "tags-edit-manage-link": "Upravljaj oznakama",
-       "tags-edit-revision-selected": "{{PLURAL:$1|Izabrana verzija|Izabrane verzije}} od [[:$2]]:",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Izabrana verzija|Izabrane verzije}} stranice [[:$2]]:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|Izabran unos zapisnika|Izabrani unosi zapisnika}}:",
        "tags-edit-revision-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove verzije|svih $1 verzija}}",
        "tags-edit-logentry-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove zapisničke stavke|svih $1 zapisničkih stavki}}",
        "htmlform-cloner-create": "Dodaj još",
        "htmlform-cloner-delete": "Ukloni",
        "htmlform-cloner-required": "Potrebna je barem jedna vrijednost.",
+       "htmlform-date-placeholder": "GGGG-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "GGGG-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "Ne mogu prepoznati uneseni format datuma. Koristite format GGGG-MM-DD.",
+       "htmlform-time-invalid": "Ne mogu prepoznati uneseni format vremena. Koristite format GGGG-MM-DD.",
+       "htmlform-datetime-invalid": "Ne mogu prepoznati uneseni format za datum i vrijeme. Koristite format GGGG-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "Navedena vrijednost je prije najranijeg dopuštenog datuma – $1.",
+       "htmlform-date-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog datuma – $1.",
+       "htmlform-time-toolow": "Navedena vrijednost je prije najranijeg dopuštenog vremena – $1.",
+       "htmlform-time-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog vremena – $1.",
+       "htmlform-datetime-toolow": "Navedena vrijednost je prije najranijeg dopuštenog datuma i vremena – $1.",
+       "htmlform-datetime-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog datuma i vremena – $1.",
        "htmlform-title-badnamespace": "[[:$1]] nije u imenskom prostoru \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Stranica \"$1\" se ne može napraviti",
        "htmlform-title-not-exists": "$1 ne postoji.",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "revdelete-restricted": "primijenjena ograničenja za administratore",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
-       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 postavljanjem datoteke",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 postavljanjem datoteke ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 sa $5 ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|spojio|spojila}} je $3 u $4 (sve do izmjene $5)",
        "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 bez ostavljanja preusmjerenja",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zaštitio|zaštitila}} je $3 $4 [prenosiva zaštita]",
        "logentry-protect-modify": "$1 {{GENDER:$2|promijenio|promijenila}} je stepen zaštite za $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|promijenio|promijenila}} je nivo zaštite za $3 $4 [prenosiva zaštita]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe za $3 iz $4 u $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe {{GENDER:$6|korisnika|korisnice}} $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|postavio|postavila}} је novu verziju $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|postavio|postavila}} је $3",
        "log-name-managetags": "Zapisnik upravljanja oznaka",
-       "log-description-managetags": "Ovaj zapisnik sadrži spisak izmjena u vezi [[Special:Tags|oznaka]]. Zapisnik sadrži samo radnje izvršene od strane administratora; unosi za oznake napravljene ili obrisane od strane wiki softvera se ne nalaze u ovom zapisniku.",
+       "log-description-managetags": "Ovaj zapisnik sadrži spisak izmjena u vezi s [[Special:Tags|oznakama]]. Zapisnik sadrži samo radnje koje su ručno izvršili administratori; unosi za oznake koje je napravio ili obrisao wiki softver ne nalaze se u ovom zapisniku.",
        "logentry-managetags-create": "$1 {{GENDER:$2|napravio|napravila}} je oznaku \"$4\"",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je oznaku \"$4\" (uklonjena je iz $5 {{PLURAL:$5|izmjene ili zapisnika|izmjena i/ili zapisnikǎ}})",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je oznaku \"$4\" (uklonjena je iz $5 {{PLURAL:$5|izmjene ili zapisnika|izmjena i/ili zapisnika}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|aktivirao|aktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivirao|deaktivirala}} je oznaku \"$4\" za upotrebu od strane korisnika i botova",
        "log-name-tag": "Zapisnik oznaka",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na zapisničkom unosu $5 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
        "rightsnone": "(nema)",
        "revdelete-summary": "sažetak",
+       "rightslogentry-temporary-group": "$1 (privremeno, do $2)",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "feedback-back": "Nazad",
        "feedback-bugcheck": "Odlično! Molimo provjerite da se ne radi o nekom [$1 poznatom \"bugu\"].",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
        "api-error-publishfailed": "Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.",
        "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.",
-       "api-error-unknown-warning": "Nepoznato upozorenje: $1",
+       "api-error-unknown-warning": "Nepoznato upozorenje: \"$1\".",
        "api-error-unknownerror": "Nepoznata greška: \"$1\"",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|minuta}}",
        "pagelang-language": "Jezik",
        "pagelang-use-default": "Koristi podrazumijevani jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "pagelang-reason": "Razlog",
+       "pagelang-submit": "Pošalji",
+       "pagelang-nonexistent-page": "Stranica $1 ne postoji.",
+       "pagelang-unchanged-language": "Stranica $1 već je postavljena na jezik $2.",
+       "pagelang-unchanged-language-default": "Stranica $1 već je postavljena na predodređeni jezik sadržaja ovog wikija.",
+       "pagelang-db-failed": "Baza podataka nije uspjela promijeniti jezik stranice.",
        "right-pagelang": "promjena jezika stranice",
        "action-pagelang": "promijenite jezik stranice",
        "log-name-pagelang": "Zapisnik promjene jezika",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Statistike o tipovima poslanih datoteka. Ovdje su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajt|$1 bajtova}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Ukupna veličina datoteke ovog odlomka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ukupna veličina svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).",
        "mediastatistics-table-mimetype": "MIME tip",
        "mediastatistics-table-extensions": "Moguća proširenja",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-header-text": "Tekstualno",
        "mediastatistics-header-executable": "Izvršni",
        "mediastatistics-header-archive": "Kompresovani formati",
+       "mediastatistics-header-total": "Sve datoteke",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|prateća tačka uklonjena je|pratećih tački uklonjeno je}} iz JSON-a",
        "json-error-unknown": "Dogodio se problem s JSON-om. Greška: $1",
        "json-error-depth": "Prekoračena je maksimalna dubina",
        "special-characters-group-arabicextended": "prošireni arapski",
        "special-characters-group-persian": "Perzijski",
        "special-characters-group-hebrew": "hebrejski",
-       "special-characters-group-bangla": "bangladeški",
+       "special-characters-group-bangla": "bengalski",
        "special-characters-group-tamil": "tamilski",
        "special-characters-group-telugu": "telugu",
        "special-characters-group-sinhala": "sinhalski",
-       "special-characters-group-gujarati": "gujarati",
+       "special-characters-group-gujarati": "guarati",
        "special-characters-group-devanagari": "devanagari",
        "special-characters-group-thai": "tajlandski",
        "special-characters-group-lao": "laoski",
        "special-characters-title-emdash": "duga crta",
        "special-characters-title-minus": "minus",
        "mw-widgets-dateinput-no-date": "Nikakav datum nije izabran",
+       "mw-widgets-mediasearch-noresults": "Nema rezultata.",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
-       "randomrootpage": "Slučajna root stranica",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategoriju...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj više...",
+       "sessionmanager-tie": "Ne možete istovremeno koristiti nekoliko vrsta provjera autentičnosti: $1.",
+       "randomrootpage": "Slučajna korijenska stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
        "log-action-filter-contentmodel": "Vrsta izmjene modela sadržaja:",
        "log-action-filter-delete": "Vrsta brisanja:",
        "log-action-filter-patrol": "Vrsta patroliranja:",
        "log-action-filter-protect": "Vrsta zaštite:",
        "log-action-filter-rights": "Vrsta izmjene korisničkih prava:",
+       "log-action-filter-suppress": "Vrsta skrivanja:",
        "log-action-filter-upload": "Vrsta postavljanja:",
        "log-action-filter-all": "Sve",
        "log-action-filter-block-block": "Blokiranje",
        "log-action-filter-contentmodel-change": "Izmjena modela sadržaja",
        "log-action-filter-contentmodel-new": "Nova stranica s nestandardnim modelom sadržaja",
        "log-action-filter-delete-delete": "Brisanje stranice",
+       "log-action-filter-delete-delete_redir": "Prepisivanje preusmjerenja",
        "log-action-filter-delete-restore": "Vraćanje obrisane stranice",
        "log-action-filter-delete-event": "Brisanje unosa u zapisniku",
        "log-action-filter-delete-revision": "Brisanje izmjene",
        "log-action-filter-protect-move_prot": "Premještanje zaštite",
        "log-action-filter-rights-rights": "Ručna izmjena",
        "log-action-filter-rights-autopromote": "Automatska izmjena",
+       "log-action-filter-suppress-event": "Skrivanje unosa u zapisniku",
+       "log-action-filter-suppress-revision": "Skrivanje izmjene",
+       "log-action-filter-suppress-delete": "Skrivanje stranice",
+       "log-action-filter-suppress-block": "Skrivanje korisnika blokiranjem",
+       "log-action-filter-suppress-reblock": "Skrivanje korisnika ponovnim blokiranjem",
        "log-action-filter-upload-upload": "Nova datoteka",
-       "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke"
+       "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke",
+       "authmanager-create-disabled": "Onemogućeno pravljenje računa.",
+       "authmanager-create-from-login": "Popunite polja da biste napravili račun.",
+       "authmanager-create-not-in-progress": "Pravljenje računa nije u toku ili su podaci o sesiji izgubljeni. Počnite ispočetka.",
+       "authmanager-authplugin-setpass-failed-title": "Promjena lozinke nije uspjela",
+       "authmanager-authplugin-setpass-bad-domain": "Neispravna domena.",
+       "authmanager-autocreate-noperm": "Automatsko pravljenje računa nije dozvoljeno.",
+       "authmanager-autocreate-exception": "Automatsko pravljenje računa privremeno je onemogućeno zbog prijašnjih greški.",
+       "authmanager-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
+       "authmanager-email-help": "Adresa e-pošte",
+       "authmanager-realname-label": "Pravo ime",
+       "authmanager-realname-help": "Korisnikovo pravo ime",
+       "authmanager-provider-temporarypassword": "Privremena lozinka",
+       "authprovider-resetpass-skip-label": "Preskoči",
+       "specialpage-securitylevel-not-allowed-title": "Nije dozvoljeno",
+       "specialpage-securitylevel-not-allowed": "Žao nam je, nije Vam dozvoljeno korištenje ove stranice jer ne možemo potvrditi Vaš identitet.",
+       "cannotauth-not-allowed-title": "Pristup odbijen",
+       "cannotauth-not-allowed": "Nije Vam dozvoljeno da koristite ovu stranicu",
+       "changecredentials": "Promjena akreditiva",
+       "changecredentials-submit": "Promijeni akreditive",
+       "changecredentials-invalidsubpage": "$1 nije ispravna vrsta akreditiva.",
+       "credentialsform-account": "Naziv računa:",
+       "cannotlink-no-provider-title": "Nema spojivih računa",
+       "cannotlink-no-provider": "Nema spojivih računa.",
+       "linkaccounts": "Spajanje računa",
+       "linkaccounts-success-text": "Račun je spojen.",
+       "linkaccounts-submit": "Spoji račune",
+       "unlinkaccounts": "Razdvajanje računa",
+       "unlinkaccounts-success": "Račun je razdvojen.",
+       "restrictionsfield-badip": "Neispravna IP-adresa ili opseg: $1",
+       "restrictionsfield-label": "Dozvoljeni IP-opsezi:",
+       "revid": "izmjena $1",
+       "pageid": "ID stranice $1"
 }
index e89bd81..140bbf4 100644 (file)
@@ -55,7 +55,8 @@
                        "KRLS",
                        "Jaumeortola",
                        "Kippelboy",
-                       "Syum90"
+                       "Syum90",
+                       "Xð"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "unprotectthispage": "Desprotegeix aquesta pàgina",
        "newpage": "Pàgina nova",
        "talkpage": "Discussió",
-       "talkpagelinktext": "Discussió",
+       "talkpagelinktext": "discussió",
        "specialpage": "Pàgina especial",
        "personaltools": "Eines de l'usuari",
        "articlepage": "Mostra la pàgina",
        "search-interwiki-caption": "Projectes germans",
        "search-interwiki-default": "Resultats de $1:",
        "search-interwiki-more": "(més)",
+       "search-interwiki-more-results": "més resultats",
        "search-relatedarticle": "Relacionat",
        "searchrelated": "relacionat",
        "searchall": "tots",
        "editusergroup": "Carrega els grups d'usuari",
        "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
        "viewinguserrights": "Visualització del drets de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edita els grups d'usuaris",
-       "userrights-viewusergroup": "Mostra els grups d'usuari",
+       "userrights-editusergroup": "Edita els grups de l'{{GENDER:$1|usuari|usuària}}",
+       "userrights-viewusergroup": "Mostra els grups de l'{{GENDER:$1|usuari|usuària}}",
        "saveusergroups": "Desa els grups d'{{GENDER:$1|usuari}}",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "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-highlightbutton-title": "Ressalta els resultats",
+       "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-filterlist-noresults": "No s'ha trobat cap filtre",
        "rcfilters-filtergroup-registration": "Registre d'usuari",
        "rcfilters-filter-registered-label": "Registrats",
        "rcfilters-filter-categorization-label": "Canvis de categoria",
        "rcfilters-filter-categorization-description": "Registres de pàgines afegides o suprimides de les categories.",
        "rcfilters-filter-logactions-label": "Accions registrades",
+       "rcfilters-filter-logactions-description": "Accions administratives, creacions de comptes, eliminacions de pàgines, càrregues...",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3, $2",
        "rcshowhideminor": "$1 edicions menors",
        "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’esdeveniments <code>$1=\"$2\"</code> en fitxers SVG.",
        "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb dades no segures: destinació URI <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
        "uploaded-animate-svg": "S'ha trobat l'etiqueta «animate» que pot estar canviant l'href mitjançant l'atribut <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
-       "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
+       "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"<nowiki>$1</nowiki>\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "uploadjava": "El fitxer és un arxiu ZIP que conté un fitxer .class de Java. No està permesa la càrrega de fitxers Java, perquè poden passar per alt les restriccions de seguretat.",
        "apisandbox-reset": "Neteja",
        "apisandbox-retry": "Torna a provar",
        "apisandbox-loading": "S'està carregant la informació del mòdul d'API «$1»...",
+       "apisandbox-no-parameters": "Aquest mòdul API no té paràmetres.",
        "apisandbox-helpurls": "Enllaços d'ajuda",
        "apisandbox-examples": "Exemples",
        "apisandbox-dynamic-parameters": "Paràmetres adicionals",
        "apisandbox-sending-request": "S'està enviant una sol·licitud API...",
        "apisandbox-loading-results": "S'estan reben els resultats de l'API...",
        "apisandbox-results-error": "S'ha produït un error en carregar la resposta de la consulta de l'API: $1.",
+       "apisandbox-request-selectformat-label": "Mostra les dades de sol·licitud com:",
+       "apisandbox-request-format-url-label": "Cadena de consulta de l'URL",
        "apisandbox-request-url-label": "Sol·licita URL:",
        "apisandbox-request-json-label": "JSON de sol·licitud:",
        "apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
        "svg-long-error": "El fitxer SVG no és vàlid: $1",
        "show-big-image": "Fitxer original",
        "show-big-image-preview": "Mida d'aquesta previsualització: $1.",
+       "show-big-image-preview-differ": "Mida d'aquesta previsualització $3 del fitxer $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altra resolució|Altres resolucions}}: $1.",
        "show-big-image-size": "$1 × $2 píxels",
        "file-info-gif-looped": "en bucle",
        "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-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».",
        "tags-activate-reason": "Motiu:",
        "tags-deactivate-not-allowed": "No és possible desactivar l'etiqueta «$1».",
        "tags-deactivate-submit": "Desactiva",
        "tags-apply-no-permission": "No teniu permís per canviar etiquetes juntament amb altres canvis.",
+       "tags-apply-blocked": "No podeu aplicar etiquetes de canvis amb els vostres canvis mentre estigueu {{GENDER:$1|blocat|blocada}}.",
        "tags-apply-not-allowed-one": "No es permet aplicar l'etiqueta «$1» manualment.",
        "tags-apply-not-allowed-multi": "No es permet aplicar manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-no-permission": "No teniu permisos per a afegir o suprimir etiquetes de canvi de revisions individuals o entrades de registre.",
+       "tags-update-blocked": "No podeu afegir o suprimir etiquetes de canvis mentre estigueu {{GENDER:$1|blocat|blocada}}.",
        "tags-update-add-not-allowed-one": "No es permet afegir manualment l'etiqueta «$1».",
        "tags-update-add-not-allowed-multi": "No es permet afegir manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-remove-not-allowed-one": "No es permet treure l’etiqueta «$1».",
        "log-name-tag": "Registre d'etiquetes",
        "rightsnone": "(cap)",
        "revdelete-summary": "el resum d'edició",
+       "rightslogentry-temporary-group": "$1 (temporal, fins a $2)",
        "feedback-adding": "S'està afegint el comentari a la pàgina...",
        "feedback-back": "Enrere",
        "feedback-bugcheck": "Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].",
        "mw-widgets-titleinput-description-new-page": "la pàgina no existeix encara",
        "mw-widgets-titleinput-description-redirect": "redirigeix a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Afegeix una categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Afegeix-ne més...",
        "sessionmanager-tie": "No es poden combinar diferents tipus de sol·licituds d'autenticació: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basades en galetes",
        "authprovider-resetpass-skip-label": "Omet",
        "authprovider-resetpass-skip-help": "Omet el restabliment de contrasenya.",
        "specialpage-securitylevel-not-allowed-title": "No permès",
+       "specialpage-securitylevel-not-allowed": "Ho sentim, no podeu utilitzar la pàgina perquè no es pot verificar la vostra identitat.",
        "authpage-cannot-login": "No s'ha pogut iniciar la sessió.",
        "authpage-cannot-login-continue": "No es pot continuar amb l'inicio de sessió. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-create": "No s'ha pogut iniciar la creació del compte.",
        "authpage-cannot-create-continue": "No es pot prosseguir la creació del compte. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-link": "No s'ha pogut iniciar l'enllaç del compte.",
+       "authpage-cannot-link-continue": "No es pot continuar amb l'enllaç del compte. Possiblement s'ha esgotat el temps de la vostra sessió.",
        "cannotauth-not-allowed-title": "S'ha denegat el permís",
        "cannotauth-not-allowed": "No teniu permisos per utilitzar la pàgina",
        "changecredentials": "Canvi de dades credencials",
        "changecredentials-submit": "Canvia les dades credencials",
+       "changecredentials-invalidsubpage": "$1 no és tipus de credencial vàlid.",
        "changecredentials-success": "Les vostres credencials han estat canviades.",
        "removecredentials": "Suprimeix les credencials",
        "removecredentials-submit": "Suprimeix les credencials",
index 4c638d0..ec38e90 100644 (file)
        "restoreprefs": "МеттахӀоттабе гӀирс Iад битарца",
        "prefs-editing": "Тадар",
        "searchresultshead": "Лахар",
-       "stub-threshold": "Кеч яран доза <a href=\"#\" class=\"stub\">коьртамогӀамна хьажоргаш</a> (байташках):",
+       "stub-threshold": "Кеч яран доза коьртан хьажоргашна ($1):",
        "stub-threshold-sample-link": "масала",
        "stub-threshold-disabled": "ДӀадайина",
        "recentchangesdays": "Керла нисдар гайта динахь:",
        "uploaddisabled": "Чуяккхар магийна дац",
        "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.",
        "uploaddisabledtext": "Файлаш чуяхар дӀадайина ду.",
-       "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '$1'",
+       "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '<nowiki>$1</nowiki>'",
        "upload-source": "ДIайолалун файл",
        "sourcefilename": "ДIайолалун файл:",
        "sourceurl": "Хьостан URL-адрес:",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "checkbox-select": "Харжар: $1",
        "checkbox-all": "Массо",
-       "checkbox-none": "ХӀума а",
+       "checkbox-none": "ХӀума",
        "checkbox-invert": "Инверт ян",
        "allpages": "Массо агӀонаш",
        "nextpage": "ТӀаьхьа йогӀу агӀо ($1)",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "Лахар",
        "searchsuggest-containing": "чуьраниг…",
-       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|кхин файл|кхин файлаш}} йолуш ю.",
-       "api-error-empty-file": "Ахьа яхьийтина файл еса ю.",
-       "api-error-mustbeposted": "Чоьхьара гӀалат: дехаро хьехам схьабоьху HTTP POST.",
-       "api-error-noimageinfo": "Кхиамца чуяьккхина, амма серверо файлахь лаьцна цхьаа хаам битина бац.",
-       "api-error-nomodule": "Чоьхьара гӀалат: чуйокху модуль нисйина яц.",
-       "api-error-ok-but-empty": "Чоьхьара гӀалат: серверара жоп дац.",
-       "api-error-overwrite": "йолуш йолу файл хийца магийна дац.",
-       "api-error-stashfailed": "Чоьхьара гӀалат: серверна хана йолу файл Ӏалашъян цаелира.",
        "api-error-publishfailed": "Чоьхьара гӀалат: серверна хана йолу файл Ӏалашъян цаелира.",
-       "api-error-stasherror": "Файл чуйоккхуш Ӏалашечехь гӀалат даьлла.",
-       "api-error-timeout": "Хьоьжу хана серверо жоп цало.",
-       "api-error-unclassified": "Ца довза гӀалат даьлла",
-       "api-error-unknown-code": "Доьвзуш доцу гӀалат: «$1».",
-       "api-error-unknown-error": "Чоьхьара гӀалат: файл чуйоккхуш цхьа хӀума гӀалате хилла.",
+       "api-error-stashfailed": "Чоьхьара гӀалат: серверна хана йолу файл Ӏалашъян цаелира.",
        "api-error-unknown-warning": "Доьвзуш доцу дӀахьедар: $1",
        "api-error-unknownerror": "Доьвзуш доцу гӀалат: «$1».",
-       "api-error-uploaddisabled": "ХӀокху вики чохь файлаш чуяхар дӀадайина ду.",
-       "api-error-verification-error": "ХӀара файл йоьхна я хила цаеза тайпан хила мега.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минот}}",
        "duration-hours": "$1 {{PLURAL:$1|сахьт}}",
index 0d9d219..f224ed7 100644 (file)
@@ -18,7 +18,8 @@
                        "Macofe",
                        "Pirehelokan",
                        "Diyariq",
-                       "Sarchia"
+                       "Sarchia",
+                       "Lost Whispers"
                ]
        },
        "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:",
        "tog-editondblclick": "دەستکاریی پەڕە بە دووکرتە",
        "tog-editsectiononrightclick": "دەستکاریی بەشەکان بە کرتەی ڕاست لەسەر سەردێڕی بەشەکان",
        "tog-watchcreations": "ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم",
-       "tog-watchdefault": "ئەو پەڕانە  و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchdefault": "ئەو پەڕانە و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchmoves": "ئەو پەڕانە و ئەو پەڕگانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchdeletion": "ئەو پەڕانە و ئەو پەڕگانە من سڕیومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchuploads": "ئەو پەڕگە نوێیانەی باریان دەکەم زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
+       "tog-watchrollback": "ئەو پەڕانەی کە کرداری گەڕاندنەوەم لەسەر ئەنجام داون زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
        "tog-minordefault": "ھەموو دەستکارییەکان بە ورد نیشان بکە لە حاڵەتی دیفاڵت",
        "tog-previewontop": "پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌",
        "tog-previewonfirst": "لە یەکەم دەستکاری دا پێشبینین نیشان بدە",
        "newwindow": "(لە پەڕەیەکی نوێدا دەکرێتەوە)",
        "cancel": "ھەڵوەشاندنەوە",
        "moredotdotdot": "زیاتر",
-       "morenotlisted": "ئەم لیستەیە تەواو نییە",
+       "morenotlisted": "ئەم لیستە لەوانەیە تەواو نەبێت",
        "mypage": "پەڕە",
        "mytalk": "لێدوان",
        "anontalk": "لێدوان",
        "searcharticle": "بڕۆ",
        "history": "مێژووی پەڕە",
        "history_short": "مێژووی پەڕە",
+       "history_small": "مێژوو",
        "updatedmarker": "لە دوایین سەردانمدا نوێ کراوەتەوە",
        "printableversion": "وەشانی ئامادەی چاپ",
        "permalink": "بەستەری ھەمیشەیی",
        "view": "بینین",
        "view-foreign": "لە $1دا بیبینە",
        "edit": "دەستکاری",
+       "edit-local": "دەستکاریکردنی زانیارییە ناوخۆییەکان",
        "create": "دروستکردن",
        "create-local": "وەسفی ناوچەیی زۆر بکە",
        "editthispage": "دەستکاری ئەم پەڕەیە بکە‌",
        "talk": "وتووێژ",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
+       "tool-link-userrights": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+       "tool-link-userrights-readonly": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+       "tool-link-emailuser": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
        "userpage": "بینینی پەڕەی بەکارھێنەر",
        "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
        "jumptonavigation": "ڕێدۆزی",
        "jumptosearch": "گەڕان",
        "view-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، نەختێک بوەستە.\n\n$1",
+       "generic-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، کەمێک بووەستە.",
        "pool-timeout": "لەکات دەرچوون ڕوویدا لەکاتی چاوەڕوانکردنی داخستندا",
        "pool-errorunknown": "هەڵەی نەزانراو",
        "aboutsite": "دەربارەی {{SITENAME}}",
        "viewsource": "بینینی سەرچاوە",
        "viewsource-title": "سەرچاوەی $1 ببینە",
        "actionthrottled": "چالاکی پێشی پێ گیرا",
-       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø³Ù¾Û\95Ù\85Ø\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c Ù\88Û\95 ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
+       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø®Ø±Ø§Ù¾Ú©Ø§Ø±Û\8cØ\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
        "protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
        "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
        "viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
        "virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
        "virus-unknownscanner": "دژەڤایرس نەناسراوە:",
        "logouttext": "'''ئێستا چوویتە دەرەوە.'''\n\nئاگادار بە ھەتا ئەو کاتەی کەشی وێبگەڕەکەت پاک دەکەیتەوە، لەوانەیە ھەندێک لە پەڕەکان وا پێشان بدرێن کە ھێشتا لە ژوورەوە بیت.",
+       "cannotlogoutnow-title": "ناتوانیت لە ئێستادا بچیتە دەرەوە",
+       "cannotlogoutnow-text": "توانای چوونە دەرەوەت نییە لەکاتی بەکارھێنانی $1",
        "welcomeuser": "بەخێربێیت، $1!",
        "welcomecreation-msg": "ھەژمارەکەت دروست کرا.\nلە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.",
        "yourname": "ناوی بەکارھێنەری:",
        "createacct-yourpasswordagain-ph": "تێپەروشە دیسان بنووسەوە",
        "userlogin-remembermypassword": "چوونەژوورەوەکەم ڕابگرە",
        "userlogin-signwithsecure": "پەیوەندیی دڵنیا بەکاربھێنە",
+       "cannotlogin-title": "ناتوانیت بچیتە ژوورەوە",
+       "cannotlogin-text": "توانای چوونەژوورەوەت نییە",
+       "cannotloginnow-title": "ناتوانیت لە ئێستادا بچیتە ناوەوە",
+       "cannotloginnow-text": "توانای چوونەژوورەوەت نییە لەکاتی بەکارھێنانی $1",
+       "cannotcreateaccount-title": "ناتوانرێت ھەژمار دروست بکرێت",
        "yourdomainname": "دۆمەینەکەت:",
        "password-change-forbidden": "ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.",
        "externaldberror": "یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.",
        "login": "بچۆ ژوورەوە",
+       "login-security": "شوناست دڵنیا بکەرەوە",
        "nav-login-createaccount": "بچۆ ژوورەوە / ھەژمار دروست بکە",
        "userlogin": "بچۆ ژوورەوە / ھەژمار دروست بکە",
        "userloginnocreate": "بچۆ ژوورەوە",
        "userlogin-resetpassword-link": "تێپەڕوشەکەت بیر کردووە؟",
        "userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
        "userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
+       "userlogin-reauth": "دەبێت دووبارە بچیتە ژوورەوە بۆ دڵنیا بوونەوە لە {{GENDER:$1|$1}}بوونت.",
        "userlogin-createanother": "ھەژمارێکی تر دروست بکە",
        "createacct-emailrequired": "ناونیشانی ئیمەیل",
        "createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
        "createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
        "createacct-another-email-ph": "ناونیشانی ئیمەیڵەکەت بنووسە",
        "createaccountmail": "تێپەڕوشەیەکی ھەڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاریکراو",
+       "createaccountmail-help": "دەتوانرێت بەکار بھێندرێت بۆ دروستکردنی ھەژمار بۆ کەسێکی تر بەبێ زانینی تێپەڕ وشەکەی.",
        "createacct-realname": "ناوی ڕاستی (دڵخوازانە)",
        "createaccountreason": "هۆکار:",
        "createacct-reason": "ھۆکار",
        "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
        "createacct-submit": "ھەژمارەکەت دروست بکە",
        "createacct-another-submit": "ھەژمار دروست بکە",
+       "createacct-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
+       "createacct-another-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
        "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
        "createacct-benefit-body1": "{{PLURAL:$1|دەستکاری}}",
        "createacct-benefit-body2": "{{PLURAL:$1|پەڕە}}",
        "createacct-benefit-body3": "دوایین {{PLURAL:$1|بەشداربوو|بەشداربووان}}",
        "badretype": "تێپەڕوشەکان لەیەک ناچن.",
+       "usernameinprogress": "دروستکردنی ھەژمارێک بۆ ئەم ناوی بەکارھێنەرە لە پڕۆسەی بەرھەمھێناندایە. تکایە چاوەڕوان بە.",
        "userexists": "ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.\nناوێکی دیکە ھەڵبژێرە.",
        "loginerror": "ھەڵەی چوونەژوورەوە",
        "createacct-error": "ھەڵە لە دروستکردنی ھەژمار",
        "nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
        "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
        "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
+       "createacct-loginerror": "ھەژمارەکە بە سەرکەوتوانە دروست کرا، بەڵام ناتوانرێت بە شێوەیەکی ئۆتۆماتیکی بکرێیتە ژوورەوە. تکایە سەردانی [[Special:UserLogin|ڕێنماییەکانی چوونەژوورەوە]] بکە.",
        "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
        "loginsuccesstitle": "چوویە ناوەوە",
        "loginsuccess": "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''",
-       "nosuchuser": "بەکارھێنەرێک بە ناوی «$1» نیە.\nناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.\nڕێنووسەکەت چاولێکەرەوە، یان [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]].",
+       "nosuchuser": "بÛ\95کارھÛ\8eÙ\86Û\95رÛ\8eÚ© Ø¨Û\95 Ù\86اÙ\88Û\8c Â«$1» Ù\86Û\8cÛ\8cÛ\95.\nÙ\86اÙ\88Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Û\95 Ú¯Û\95Ù\88رÛ\95 Ù\88 Ø¨Ú\86Ù\88Ù\88Ú© Ø¨Ù\88Ù\88Ù\86Û\8c Ù¾Û\8cتÛ\95کاÙ\86 Ú¾Û\95ستÛ\8cارÛ\95.\nÚ\95Û\8eÙ\86Ù\88Ù\88سÛ\95Ú©Û\95ت Ú\86اÙ\88Ù\84Û\8eÚ©Û\95رÛ\95Ù\88Û\95Ø\8c Û\8cاÙ\86 [[Special:CreateAccount|Ú¾Û\95Ú\98Ù\85ارÛ\8eÚ©Û\8c Ù\86Ù\88Û\8e Ø¯Ø±Ù\88ست Ø¨Ú©Û\95]].",
        "nosuchusershort": "بەکارھێنەرێک بە ناوی «$1»ەوە نیە.\nبە نووسراوەکەتدا بچۆرەوە.",
        "nouserspecified": "دەبێت ناوێکی بەکارھێنەری دەستنیشان بکەیت.",
        "login-userblocked": "ئەم بەکارهێنەرە بڵۆک کراوە. چوونەژوورەوە ڕێگەپێنەدراوە.",
        "wrongpassword": "تێپەڕوشەی ھەڵە.\nتکایە دووبارە تێبکۆشە.",
        "wrongpasswordempty": "تێپەڕەوشەی لێدراو بەتاڵبوو.\nتکایە هەوڵ بدەوە.",
        "passwordtooshort": "تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.",
+       "passwordtoolong": "تێپەڕ وشەکان ناتوانرێت لە {{PLURAL:$1|١ کارەکتەر|$1 کارەکتەر}} درێژتر بێت.",
+       "passwordtoopopular": "تێپەڕ وشە باوەکان ناتواندرێت دابنرێن. تکایە تێپەڕ وشەیەکی دەگمەنتر ھەڵبژێرە.",
        "password-name-match": "تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.",
        "password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
        "mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
        "noemail": "ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».",
        "noemailcreate": "دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی",
        "passwordsent": "تێپەڕوشەیەکی نوێ نێررا بۆ ئەدرەسی ئیمێلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی، دیسان بچۆ ژوورەوە.",
-       "blocked-mailpassword": "ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.",
+       "blocked-mailpassword": "ناونیشانی ئای پی تۆ بۆ دەستکاری کردن بەستراوه. بۆ بەرگری لە بەکارهێنانی نابەجێ، ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە لەسەر ئەم ناونیشانە ئای پییە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
        "createaccount-title": "درووست کردنی ھەژمار بۆ {{SITENAME}}",
        "createaccount-text": "کەسێک ھەژمارێکی بۆ ناونیشانی ئیمێلی تۆ لە {{SITENAME}}دا ($4) بە ناوی «$2»ـەوە و بە تێپەڕوشەی  «$3»ـەوە دروست کردووە.\nدەبێت ھەر ئێستا بچیتە چوورەوە و تێپەڕوشەیەکەت بگۆڕیت.\n\nئەگەر ئەم ھەژمارە بە ھەڵە دروست کراوە، دەکرێت گوێ بەم پەیامە نەدەیت.",
        "login-throttled": "زۆر زۆر ھەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە $1 بوەستە پێش ھەوڵی دووبارە.",
+       "login-abort-generic": "چوونەژوورەوەکەت شکستی ھێنا - بەجێ ھێڵدرا",
+       "login-migrated-generic": "ھەژمارەکەت گوازراوەتەوە و ناوی بەکارھێنەرەکەت چی تر لەسەر ئەم ویکیپیدیایە بوونی نییە.",
        "loginlanguagelabel": "زمان: $1",
+       "suspicious-userlogout": "داواکارییەکەت بۆ چوونە دەرەوە ڕەت کرایەوە لەبەر ئەوەی وا دیارە داواکارییەکە لەلایەن براوسەرێکی شکاوەوە نێردراوە.",
+       "createacct-another-realname-tip": "ناوی ڕاستیت پێویست نییە.\nئەگەر ھەڵت بژارد کە دایبنێیت، ئەوا بەکار دەھێندرێت بۆ ئاماژە کردن بە بەکارھێنەر بۆ بەشدارییەکانیان.",
        "pt-login": "بچۆ ژوورەوە",
        "pt-login-button": "بچۆ ژوورەوە",
+       "pt-login-continue-button": "بەردەوامبوونی چوونەژوورەوە",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
+       "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
        "changepassword": "تێپەڕوشە بگۆڕە",
        "resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "retypenew": "تێپەڕوشەی نوێ دوبارە بنووسەوە:",
        "resetpass_submit": "تێپەڕوشە رێکخە و بچۆ ژوورەوە",
        "changepassword-success": "تێپەڕەوشەکەت  گۆڕدرا!",
+       "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
+       "botpasswords": "تێپەڕ وشەی بۆت",
+       "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+       "botpasswords-label-appid": "ناوی بۆت",
        "botpasswords-label-create": "دروستکردن",
        "botpasswords-label-update": "نوێکردنەوە",
        "botpasswords-label-cancel": "ھەڵوەشاندنەوە",
        "botpasswords-label-delete": "سڕینەوە",
        "botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
+       "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+       "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+       "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+       "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "resetpass-submit-loggedin": "تێپەڕوشە بگۆڕە",
        "resetpass-submit-cancel": "ھەڵوەشاندنەوە",
        "resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
+       "resetpass-recycled": "تکایە تێپەڕوشەکەت بگۆڕە بە دانەیەکی جیاواز لەوەی ئێستا.",
+       "resetpass-temp-emailed": "تۆ بە تێپەڕوشەیەکی کاتیی ھاتوویتە ژوورەوە. بۆ تەواوکردنی چوونە ژوورەوە تێپەڕوشەیەکی نوێ لێرە دابنێ.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
+       "resetpass-expired": "تێپەڕ وشەکەت بەسەر چووە، تکایە تێپەڕ وشەیەکی نوێ دابنێ بۆ چوونە ژوورەوە",
+       "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
+       "passwordreset-text-one": "ئەم فۆرمە تەواو بکە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ",
+       "passwordreset-text-many": "{{PLURAL:$1|یەکێک لەم بۆشاییانە بڕ بکەرەوە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ}}",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-email": "ناونیشانی ئیمەیل:",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailtext-user": "‫بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailelement": "ناوی بەکارھێنەری: \n$1\n\nتێپەڕوشەی کاتی: \n$2",
-       "passwordreset-emailsentemail": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
-       "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
-       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
+       "passwordreset-emailsentemail": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ھەژمارەکەتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+       "passwordreset-emailsentusername": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ناوی بەکارھێنەرتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+       "passwordreset-invalidemail": "ناونیشانی ئیمەیڵی نەگونجاو",
+       "passwordreset-nodata": "نە ئیمەیڵێک یان ناوی بەکارھێنەرێک ھەڵبژێردرا",
+       "changeemail": "گۆڕین یان لابردنی ناونیشانی ئیمەیل",
+       "changeemail-header": "ئەم فۆرمە تەواو بکە بۆ گۆڕینی ناونیشانی ئیمەیڵەکەت. ئەگەر ئارەزووی ئەوە دەکەیت کە ھەر ئیمەیڵێک لە ھەژمارەکەت بکەیتەوە، بۆشایی ئیمەیڵی نوێ بە بەتاڵی بەجێ بھێڵە لەکاتی پاشەکەوتکردنی فۆرمەکە.",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
        "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
+       "changeemail-newemail-help": "ئەم بۆشاییە دەبێت خاڵی بێت ئەگەر دەتەوێت ناونیشانی ئیمەیڵەکەت لابەریت. تۆ ناتوانیت ئیمەیڵی ڕێکخستنەوەی تێپەڕە وشە یاخود ھەر ئیمەیڵێکی تری ئەم ویکییەت پێ بگات ئەگەر ناونیشانی پۆستە ئەلیکترۆنییەکە لاببرێت.",
        "changeemail-none": "(ھیچ)",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
        "changeemail-submit": "ئەمەیل بگۆڕە",
+       "changeemail-nochange": "تکایە ناونیشانی ئیمەیڵێکی جیاواز بەکار بھێنە.",
        "bold_sample": "دەقی ئەستوور",
        "bold_tip": "دەقی ئەستوور",
        "italic_sample": "دەقی لار",
        "sig_tip": "واژووەکەت بە مۆری ڕێکەوتەوە",
        "hr_tip": "هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)",
        "summary": "کورتەی دەستکاری:",
-       "subject": "بابەت/سەردێڕ:",
+       "subject": "بابەت:",
        "minoredit": "ئەمە دەستکارییەکی بچووکە",
        "watchthis": "ئەم پەڕەیە بخە ژێر چاودێری",
        "savearticle": "پەڕەکە پاشەکەوت بکە",
        "savechanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
+       "publishpage": "بڵاوکردنەوەی پەڕە",
+       "publishchanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
        "preview": "پێشبینین",
        "showpreview": "پێشبینین نیشان بدە",
        "showdiff": "گۆڕانکارییەکان نیشان بدە",
+       "blankarticle": "<strong>ئاگاداری:</strong> ئەو پەڕەیەی کە ھەوڵی دروستکردنی دەدەیت واڵایە. ئەگەر کرتە لەسەر «{{int:savearticle}}» بکەیت دووبارە، پەڕەکە بەبێ ھیچ ناوەڕۆکێک دروست دەبێت.",
        "anoneditwarning": "<strong>ھۆشیار بە:</strong> نەڕۆیشتووتەتە ژوورەوە. ھەر دەستکارییەک بکەیت ناونیشانی IPیەکەت بۆ ھەموو کەسێک دیار دەبێت. بەڵام ئەگەر <strong>[$1 بچیتە ژوورەوە]</strong> یان <strong>[$2 ھەژمارێک دروست بکەیت]</strong>، دەستکارییەکانت بە ناوی بەکارھێنەرییەکەتەوە بڵاو دەبێتەوە و لە چەند قازانجی تریشی ھەیە.",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
+       "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دەەبارە کرتە لەسەر «{{int:savearticle}}» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
        "missingcommenttext": "تکایە لە خوارەوە شرۆڤەیەک بنووسە.",
        "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتە:",
-       "subject-preview": "پێشبینینی بابەت/سەردێڕ:",
+       "subject-preview": "پێشبینینی بابەت:",
+       "previewerrortext": "ھەڵەیەک دروست بوو لەکاتی ھەوڵدان بۆ بینینی دەستکارییەکانت.",
        "blockedtitle": "بەکارھێنەر بەربەست کراوە",
        "blockedtext": "'''ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
        "autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
        "accmailtext": "تێپەڕوشەیەک کە بە هەڕەمەکی بۆ [[User talk:$1|$1]] دروست کرا، نێررا بۆ $2. دەتوانیت لە پەڕەی <em>[[Special:ChangePassword|گۆڕینی تێپەڕوشەدا]]</em> لە کاتی چوونەژوورەوەدا بیگۆڕی.",
        "newarticle": "(نوێ)",
        "newarticletext": "بە دوای بەستەری پەڕەیەک کەوتووی کە ھێشتا دروست نەکراوە.\nبۆ دروست کردنی پەڕەکە، لە چوارچێوەکەی خوارەوە دەست بکە بە تایپ کردن. (بۆ زانیاری زورتر\n[$1 یارمەتی] ببینە).\nئەگەر بە ھەڵەوە ھاتویتە ئێرە، لە سەر دوگمەی '''back'''ی وێبگەڕەکەت کلیک بکە.",
-       "anontalkpagetext": "----''ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست‌نەکردووه یان کەڵکی‌ لێ وەرناگرێ .\nلەبەر ئەوە مەجبوورین ئای‌پی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.\nئای‌پی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی‌ نەناسراوی دی تێکەڵ نەکرێیت. ''",
+       "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": "بەسەرداچوونەوەی #$1 پەڕەی «{{FULLPAGENAME}}» بوونی نییە.\n\nئەمە ھەندێک جار ھۆکاری ئەوەیە کە مێژووەکەی بەسەرچووە یاخود پەڕەکە سڕدراوەتە.\nوردەکارییەکان دەتوانرێن ببینرێن لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوەدا].",
        "userpage-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.\nتکایە دڵنیا ببەرەوە ئەگەر دەتھەوێت ئەم پەڕەیە دروست یان دەستکاری بکەیت.",
        "userpage-userdoesnotexist-view": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "blocked-notice-logextract": "ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.\nدوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:",
-       "clearyourcache": "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
+       "clearyourcache": "<strong>تێبینی:</strong> لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ کاشی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
        "usercssyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "userjsyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "usercsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی CSSـەکەت دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
        "previewnote": "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''\nگۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
        "continue-editing": "چوونە سەر بەشی دەستکاریکردن",
        "previewconflict": "ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.",
-       "session_fail_preview": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\nتکایە دیسان ھەوڵبدەوە.\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە.",
+       "session_fail_preview": "ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی زانیاری و داتاکانی ئەم کۆرسە.\nلەوانەیە ھەژمارەکەت کرابێتە دەرەوە. <strong>تکایە دڵنیا بکەرەوە کە ھێشتا لە ژوورەوەیت و دووبارە ھەوڵ بدەرەوە.</strong>\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە، دواتریش ئەگەر ھێشتا ڕێگەت نەداوە، ڕێگە بە براوسەرەکەت بدە کە ''کوکی'' لەم سایەتەوە وەربگرێت.",
        "session_fail_preview_html": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\n\n''لەبەر ئەوەی {{SITENAME}} ڕێگەی داوە بە raw HTML، بۆ بەرگری بەرامبەر بە هێرشەکانی جاڤاسکریپت، پێشبینین شاردراوەتەوە.''\n\n'''ئەگەر ئەمە ھەوڵێکی دەستکاریکردنی ڕەوایە، تکایە دیسان ھەوڵبدەوە.'''\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونە دەرەوە]] گەڕانەوەژوورەوە تاقی بکەوە.",
        "token_suffix_mismatch": "'''دەستکاریەکەت پەسەند نەکرا لەبەر ئەوەی ڕاژەخواز یان وێبگەڕەکەت نووسەکانی خاڵبەندی لەیەک پچڕاندوە.'''<br />\nدەستکاریەکەت بۆ بەرگری لە تێکەڵ‌بوونی دەقی لاپەڕەکە وەر نەگیرا.<br />\nئەمە بڕێ‌جار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
+       "edit_form_incomplete": "<strong>ھەندێک بەشی دەستکارییەکانت بە سێرڤەرەکەمان نەگەیشت. دووبارە سەیری دەستکارییەکانت بکە بۆ دڵنیا بوون لە تەواوییان و دووبارە ھەوڵ بدەرەوە.</strong>",
        "editing": "دەستکاریکردنی $1",
        "creating": "دروستکردنی $1",
        "editingsection": "دەستکاریکردنی $1 (بەش)",
        "copyrightwarning": "تکایە ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} وا فەرز دەکرێت کە لە ژێر  $2دا بڵاودەبنەوە (سەیری $1 بکە بۆ وردەکاریەکان).\nئەگەر ناتەوێ نووسراوەکانت بە بێبەزەیی دەستکاری بکرێن و بە دڵخواز دابەشبکرێنەوە، مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە.\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "copyrightwarning2": "ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} لەوانەیە بەدەستی بەشداربووانی دیکەوە دەستکاری بکرێن، بگۆڕدرێن یا بسڕێنەوە.\nئەگەر ناتەوێ نووسراوەکانت بێبەزەیی دەستکاری بکرێن، ھەر مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە (سەیری $1 بکە بۆ وردەکاریەکان).\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "longpageerror": "'''ھەڵە: ئەو دەقە تۆ ناردووتە {{PLURAL:$1|یەک کیلۆبایت|$1 کیلۆبایت}} درێژە، کە درێژترە لە زۆرینەی {{PLURAL:$2|یەک کیلۆبایت|$2 کیلۆبایت}}.'''\nئەمە پاشەکەوت ناکرێت.",
-       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¯Ø§ØªØ§Ø¨Û\95Û\8cس Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ú©Û\86Ù¾Û\8c Ø¨Ú©Û\95Û\8cت Ø¨Û\86 Ù\81اÛ\8cÙ\84Û\8eک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
+       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¨Ù\86Ú©Û\95Û\8c Ø²Ø§Ù\86Û\8cارÛ\8c Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ù\84Û\95بÛ\95ر Ø¨Ú¯Ø±Û\8cتÛ\95Ù\88Û\95 Ø¨Û\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95ک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
        "protectedpagewarning": "'''وشیار بە: ئەم پەڕە پارێزراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە کە مافەکانی بەڕێوەبەرایەتییان ھەیە بتوانن دەستکاریی بکەن.'''\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
        "semiprotectedpagewarning": "'''ئاگاداری:''' ئەم پەڕە داخراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن دەستکاریی بکەن.\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
-       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆیە تەنها ئەو کەسانەی مافی بەڕێوبەرایەتی‌یان هەیە ئەتوانن دەستکاری بکەن، چۆنکا ئەمە {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
+       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆ ئەوەی تەنھا ئەو کەسانەی کە مافی بەڕێوبەرایەتییان هەیە بتوانن دەستکاری بکەن، چوونکە ئەم {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
        "titleprotectedwarning": "'''ئاگاداری: ئەم پەڕە داخراوە، بۆئەوەی بۆ درووست‌کردنی [[Special:ListGroupRights|مافە تایبەتەکانت]] پێویستن.'''\nبۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
        "templatesused": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پەڕەیەدا بە کارھێنراوە|داڕێژانە کە لەم پەڕەیەدا بە کارھێنراون}}:",
        "templatesusedpreview": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پێشبینینەدا بە کارھێنراوە|داڕێژانە کە لەم پێشبینینەدا بە کارھێنراون}}:",
        "nocreate-loggedin": "ئیجازەی دروست کردنی پەڕەی نوێت نیە.",
        "sectioneditnotsupported-title": "بەش دەستکاریکردنی پشتیوانی ناکرێ",
        "sectioneditnotsupported-text": "دەستکاریکردنی بەش لە پەڕەدا پشتیوانی ناکرێ.",
-       "permissionserrors": "ھەڵەی ئیجازەکان",
+       "permissionserrors": "ھەڵە لە بە دەست ھێنان",
        "permissionserrorstext": "مافی ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :",
        "permissionserrorstext-withaction": "دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:",
        "recreate-moveddeleted-warn": "'''ھۆشیار بە: خەریکی پەڕەیەک دروست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''\n\nئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.\nلۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
        "moveddeleted-notice": "ئەم پەڕەیە سڕاوەتەوە.\nلۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.",
+       "moveddeleted-notice-recent": "ببورە، ئەم پەڕەیە بەم زووانە سڕدراوەتەوە (لە ماوەی ٢٤ کاتژمێری پێشوودا). \nلۆگی سڕینەوە و ڕەوانەکردنی پەڕەکە بەردەستن لە خوارەوە لە پەڕاوێزەکاندا.",
        "log-fulllog": "لۆگی تەواو ببینە",
        "edit-hook-aborted": "دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "edit-gone-missing": "توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />\nلەوە دەچی سڕدرابێتەوه.‌",
        "edit-conflict": "کێشەی دەستکاری.",
        "edit-no-change": "دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.",
+       "postedit-confirmation-created": "پەڕەکە دروست کرا.",
+       "postedit-confirmation-restored": "پەڕەکە ھێنرایەوە.",
        "postedit-confirmation-saved": "دەستکارییەکەت پاشەکەوت کرا.",
        "edit-already-exists": "تواناییی دروستکردنی پەڕەی نوێ نییە.\nئەمە پەڕەیە پێشتر هەبووە.",
        "defaultmessagetext": "دەقی پەیامی هەمیشەیی",
        "invalid-content-data": "دراوەی ناوەرۆکی نادروست",
-       "editwarning-warning": "بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.",
+       "content-not-allowed-here": "«$1» ڕێگە پێنەدراوە لەسەر پەڕەی [[$2]]",
+       "editwarning-warning": "بەجێھێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەستدانی هەموو ئەو گۆڕانکاریانەی کە ئەنجامت داون. ئەگەر لە ژوورەوەیت، دەتوانیت ئەم ئاگادارییە لابەریت لە ھەڵبژاردەی بەکارھێنەرت.",
        "content-model-wikitext": "ویکیدەق",
        "content-model-text": "دەقی ساکار",
        "content-model-javascript": "جاڤاسکریپت",
        "content-model-css": "سی ئێس ئێس",
+       "deprecated-self-close-category": "ئەو پەڕانەی کە تاگی ئێچ تی ئێم ئێڵی خۆ-داخراوی ھەڵە بەکاردەھێنن",
+       "duplicate-args-warning": "<strong>ئاگاداری:</strong> ن [[:$1]] بانگی [[:$2]] دەکات بە بەکارھێنانی زیاتر لە یەک بەھا بۆ پارامەتری «$3.» تەنھا کۆتا بەھای کە پێشکەش کراوە بەکار دەھێندرێت.",
        "expensive-parserfunction-warning": "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />\nئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگ‌کەردن|بانگ‌کەردن}} کە ئێستا {{PLURAL:$1|بانگ‌کردنی|بانگ‌کردنی}} تێدایە.",
        "expensive-parserfunction-category": "ئەو لاپەڕانەی  ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەیان لەخۆ گرتووە.",
        "post-expand-template-inclusion-warning": "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.\nلەوانەیە ھەندێک لە داڕێژەکان لەخۆنەگرێتەوە.",
        "undo-success": "دەکرێ دەستکاریەکە پووچەڵبکرێتەوە.\nتکایە چاو لەو هەڵسەنگاندنەی خوارەوە بکە تا دڵنیا بیت ئەمە ئەوەیە کە‌ دەتویست بیکەی و دواتر گۆڕانکارییەکانی خوارەوە پاشەکەوت بکە بۆ تەواوکردنی پووچەڵکردنەوەکە.",
        "undo-failure": "لەبەر کێشەی دەست‌تێ‌وەردان، ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەیت.",
        "undo-norev": "ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.",
+       "undo-nochange": "وا دیارە دەستکارییەکە پووچەڵ کراوەتەوە.",
        "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\" خستوەتەڕوو",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
        "saveprefs": "پاشەکەوت",
        "restoreprefs": "ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی (لە ھەموو بەشەکاندا)",
        "prefs-editing": "دەستکاریکردن",
-       "rows": "ڕیزەکان:",
-       "columns": "ستوونەکان:",
        "searchresultshead": "گەڕان",
        "stub-threshold": "سنوور بۆ شێوازی <a href=\"#\" class=\"stub\">بەستەری کۆڵکە</a> (بایت):",
        "stub-threshold-disabled": "ناچالاک",
        "editusergroup": "گرووپەکانی بەکارھێنەر دەستکاری بکە",
        "editinguser": "گۆڕینی مافە بەکارھێنەرییەکانی {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "گرووپە بەکارھێنەرییەکان دەستکاری بکە",
+       "userrights-viewusergroup": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
        "userrights-groupsmember": "ئەندامە لە:",
        "userrights-groupsmember-auto": "ئەندامی ناڕاشکاوە لە:",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
+       "grant-group-email": "ناردنی ئیمەیل",
+       "grant-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "action-viewmyprivateinfo": "زانیارییە تایبەتییەکانت ببینە",
        "action-editmyprivateinfo": "دەستکاری زانیارییە تایبەتییەکانت بکە",
+       "action-purge": "پاکسازی ئەم پەڕەیە بکە",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
        "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "emailpagetext": "دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.\nئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.",
        "defemailsubject": "ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە",
        "usermaildisabled": "ئیمەیڵی بەکارهێنەر لەکاردانیە",
+       "usermaildisabledtext": "ناتوانیت ئیمەیڵ بۆ بەکارھێنەرانی تر بنێریت لەسەر ئەم ویکیپیدیایە",
        "noemailtitle": "هیچ ناونیشانێکی ئی‌مەیل نییە",
        "noemailtext": "ئەم بەکارھێنەرە ناونێشانێکی گونجاوی ئیمێلی دەستنیشان نەکردووە.",
        "nowikiemailtext": "ئەم بەکارهێنەرە تایبەتمەندیی وەرنەگرتنی ئی‌مەیل لە بەکارهێنەرانی دیکەی هەلبژاردووە.",
        "enotif_lastvisited": "بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.",
        "enotif_lastdiff": "بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.",
        "enotif_anon_editor": "بەکارھێنەری نەناسراو $1",
-       "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c Ø¨Û\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ Ø¯Û\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا Ø³Û\95رداÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¯Ø§Ú¾Ø§ØªÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا Ø¯Û\95تÙ\88اÙ\86Û\8c Ø¦Ø§ÚµØ§Ú©Ø§Ù\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 Ø³Û\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© Ø¨Ø®Û\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 Ø³Ù¾Ø§Ø³Û\95Ù\88Û\95Ø\8c Ø³Û\8cستÛ\95می ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
+       "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c Ø¨Û\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ Ø¯Û\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا Ø³Û\95رداÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¯Ø§Ú¾Ø§ØªÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا Ø¯Û\95تÙ\88اÙ\86Û\8c Ø¦Ø§ÚµØ§Ú©Ø§Ù\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 Ø³Û\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© Ø¨Ø®Û\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 Ø³Ù\88پاسÛ\95Ù\88Û\95Ø\8c Ø³Û\8cستمی ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
        "created": "دروستکرا",
        "changed": "گۆڕدرا",
        "deletepage": "پەڕە بسڕەوە",
        "alreadyrolled": "دوایین گۆڕانکارییەکان لەسەر [[:$1]] لە لایەن [[User:$2|$2]] ناگەڕێندرێنەوە ([[User talk:$2|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛ کەسێکی تر لە پێشدا دەستکاریی کردووە یان گەڕاندوویەتەوە.\n\nدوایین دەستکاری ئەم پەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "پوختەی دەستکاری <em>$1</em> بوو.",
        "revertpage": "گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]",
-       "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاڕدراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
+       "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاردراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
        "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
        "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
        "changecontentmodel-title-label": "سەرناوی پەڕە",
        "modifiedarticleprotection": "ئاستی پاراستنی «[[$1]]»ی گۆڕی",
        "unprotectedarticle": "پاراستنی لەسەر «[[$1]]» لابرد",
        "movedarticleprotection": "ڕێککارییەکانی پاراستن لە  «[[$2]]» گوازرایەوە بۆ «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|پاراستنی}} لەسەر ''[[$1]]'' لابرد",
        "protect-title": "گۆڕینی ئاستی پاراستنی \"$1\"",
        "protect-title-notallowed": "دیتنی ئاستی پاراستنی «$1»",
        "prot_1movedto2": "[[$1]] گوازرایەوە بۆ [[$2]]",
        "tooltip-pt-mycontris": "پێڕستی بەشدارییەکان",
        "tooltip-pt-login": "پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ",
        "tooltip-pt-logout": "دەرچوون",
+       "tooltip-pt-createaccount": "تۆ ھان دەدرێیت کە ھەژمارێک دروست بکەیت و بچیتە ژوورەوە، ئەمە سەرەکی نییە بەھەرحاڵ",
        "tooltip-ca-talk": "وتووێژ سەبارەت بە پەڕەی ناوەڕۆک",
        "tooltip-ca-edit": "دەستکاری ئەم پەڕەیە بکە‌",
        "tooltip-ca-addsection": "بەشێکی نوێ دەست پێ بکە",
        "exif-imagelength": "بەرزی",
        "exif-orientation": "ئاڕاستە",
        "exif-ycbcrpositioning": "شوێنی Y و C",
+       "exif-xresolution": "شێوازی ئاسۆیی",
+       "exif-yresolution": "شێوازی ستوونی",
        "exif-datetime": "ڕێکەوتی و کاتی گۆڕانی پەڕگە",
        "exif-imagedescription": "ناونیشانی وێنە",
        "exif-make": "بەرھەمھێنەری کامێرا",
        "confirmemail_body_set": "کەسێک، لەوانەیە خۆت، لە ناونیشانی IPی $1 ـەوە،\nلە {{SITENAME}}دا، ناونیشانیی ئیمێلی ھەژماری «$2»ی کردووە بەم ناونیشانە.\n\nبۆ پشتڕاستکردنەوەی ئەوەی کە ئەم ھەژمارە بە ڕاستی ھی تۆیە و بۆ چالاککردنەوەی ئامرازە ئیمێلییەکانی {{SITENAME}}، ئەم لینکە لە وێبگەڕەکەتدا بکەرەوە:\n\n$3\n\nئەگەر ھەژمارەکە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی پشتڕاستکردنەوەی ناونیشانی ئیمێل، شوێنی ئەم لینکە بکەوە:\n\n$5\n\nماوەی ئەم کۆدی پشتڕاستکردنەوەیە لە $4دا بە سەر دەچێت.",
        "confirmemail_invalidated": "بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە",
        "invalidateemail": "هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل",
+       "notificationemail_body_changed": "کەسێک، کە لەوانەیە خۆت بووبێت، لە ناونیشانی IPی $1، ناونیشانی پۆستی ئەلیکترۆنی لە $2ەوە گۆڕی بە $3 لە {{SITENAME}}.\n\nئەگەر ئەمە تۆ نەبوویت، ھەر ئێستا پەیوەندی بە بەڕێوەبەرێکی سایتەکەوە بکە.",
        "scarytranscludetoolong": "[URL زۆر درێژە]",
        "deletedwhileediting": "'''ھۆشیار بە''': ئەم پەڕە دوای ئەوە تۆ دەستکاریکردنیت دەستپێکرد سڕاوەتەوە!",
        "confirmrecreate-noreason": "بەکارھێنەر [[User:$1|$1]] ([[User talk:$1|talk]]) پەڕەکەی سڕییەوە پاش ئەوەی تۆ دەستکاریکردنی پەڕەکەت دەستپێکرد. تکایە پشتڕاستی بکەوە کە بە ڕاستی دەتەوێ دیسان ئەم پەڕە دروست بکەیتەوە.",
        "feedback-submit": "ناردن",
        "searchsuggest-search": "لە {{SITENAME}}دا بگەڕێ",
        "searchsuggest-containing": "بە لەبەرگرتنەوەی ...",
-       "api-error-empty-file": "ئەو پەڕگەیە کە ناردووتە واڵا بوو.",
-       "api-error-file-too-large": "ئەو پەڕگەیە ناردووتە زۆر گەورەیە.",
-       "api-error-filename-tooshort": "ناوی پەڕگەکە زۆر کورتە.",
-       "api-error-filetype-banned": "ئەم جۆرە پەڕگەیە قەدەغەیە.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|جۆرە پەڕگەیەکی ڕێگەپێدراو نییە|جۆرە پەڕگە ڕێگەپێدراوەکان نین}}. {{PLURAL:$3|جۆرە پەڕگەی ڕێگەپێدراو ئەمەیە|جۆرە پەڕگەکانی ڕێگەپێدراو ئەمانەن}}:  $2.",
-       "api-error-illegal-filename": "ناوی پەڕگە رێگەپێ‌نەدراوە.",
-       "api-error-unclassified": "ھەڵەیەکی نەزانراو ڕوویداوە.",
-       "api-error-unknown-code": "ھەڵەی نەزانراو: «$1».",
        "api-error-unknownerror": "ھەڵەی نەزانراو: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|چرکە|چرکە}}",
        "duration-minutes": "$1 {{PLURAL:$1|خولەک|خولەک}}",
        "special-characters-group-thai": "تایلەندی",
        "special-characters-group-khmer": "خمێری",
        "log-action-filter-all": "ھەموو",
-       "log-action-filter-upload-upload": "بارکردنی نوێ"
+       "log-action-filter-upload-upload": "بارکردنی نوێ",
+       "authmanager-email-label": "ئیمەیڵ"
 }
index ddced48..3e1aa18 100644 (file)
        "sig_tip": "Имзанъыз ве тарих",
        "hr_tip": "Горизонталь сызыкъ (пек сыкъ къулланманъыз)",
        "summary": "Денъиштирменинъ къыскъа тарифи:",
-       "subject": "Мевзу/серлева:",
+       "subject": "Мевзу:",
        "minoredit": "Бу, кичик денъиштирмедир",
        "watchthis": "Саифени козет",
        "savearticle": "Саифени сакъла",
+       "savechanges": "Денъиштирмелерни сакъла",
        "preview": "Бакъып чыкъув",
        "showpreview": "Бакъып чыкъ",
        "showdiff": "Денъиштирмелерни косьтер",
        "saveprefs": "Сакъла",
        "restoreprefs": "Бутюн ог бельгиленген сазламаларны къайтар",
        "prefs-editing": "Саифелерни денъиштирюв",
-       "rows": "Сатыр",
-       "columns": "Сутун",
        "searchresultshead": "Къыдырув",
        "recentchangesdays": "Сонъки денъиштирмелер саифесинде косьтериледжек кунь сайысы:",
        "recentchangesdays-max": "(энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}})",
index e48be9f..3054c1b 100644 (file)
        "sig_tip": "İmzañız ve tarih",
        "hr_tip": "Gorizontal sızıq (pek sıq qullanmañız)",
        "summary": "Deñiştirmeniñ qısqa tarifi:",
-       "subject": "Mevzu/serleva:",
+       "subject": "Mevzu:",
        "minoredit": "Bu, kiçik deñiştirmedir",
        "watchthis": "Saifeni közet",
        "savearticle": "Saifeni saqla",
+       "savechanges": "Deñiştirmelerni saqla",
        "preview": "Baqıp çıquv",
        "showpreview": "Baqıp çıq",
        "showdiff": "Deñiştirmelerni köster",
        "saveprefs": "Saqla",
        "restoreprefs": "Bütün ög belgilengen sazlamalarnı qaytar",
        "prefs-editing": "Saifelerni deñiştirüv",
-       "rows": "Satır",
-       "columns": "Sutun",
        "searchresultshead": "Qıdıruv",
        "recentchangesdays": "Soñki deñiştirmeler saifesinde kösterilecek kün sayısı:",
        "recentchangesdays-max": "(eñ çoq $1 {{PLURAL:$1|kün|kün}})",
index 2ded538..9cf8622 100644 (file)
        "revdelete-failure": "'''Nepodařilo se nastavit viditelnost revize:'''\n$1",
        "logdelete-success": "Viditelnost události úspěšně nastavena.",
        "logdelete-failure": "'''Nepodařilo se nastavit viditelnost protokolu:'''\n$1",
-       "revdel-restore": "Změnit viditelnost",
+       "revdel-restore": "změnit viditelnost",
        "pagehist": "Historie stránky",
        "deletedhist": "Smazaná historie",
        "revdelete-hide-current": "Chyba při skrývání položky z $1 $2: jedná se o současnou revizi.\nTu nelze skrýt.",
        "difference-title": "$1: Porovnání verzí",
        "difference-title-multipage": "$1 a $2: Porovnání stránek",
        "difference-multipage": "(Rozdíly mezi stránkami)",
-       "lineno": "Řádka $1:",
+       "lineno": "Řádek $1:",
        "compareselectedversions": "Porovnat vybrané verze",
        "showhideselectedversions": "Zobrazit/skrýt vybrané revize",
        "editundo": "zrušit editaci",
        "search-interwiki-caption": "Sesterské projekty",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(více)",
+       "search-interwiki-more-results": "další výsledky",
        "search-relatedarticle": "Související",
        "searchrelated": "související",
        "searchall": "vše",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Uživatelské jméno}}:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Čas registrace:",
        "yourrealname": "Vaše skutečné jméno:",
        "yourlanguage": "Jazyk rozhraní:",
        "editusergroup": "Načíst uživatelské skupiny",
        "editinguser": "Úprava práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Prohlížení práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Upravit uživatelské skupiny",
-       "userrights-viewusergroup": "Zobrazit uživatelské skupiny",
+       "userrights-editusergroup": "Upravit {{GENDER:$1|uživatelské}} skupiny",
+       "userrights-viewusergroup": "Zobrazit {{GENDER:$1|uživatelské}} skupiny",
        "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.",
+       "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-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-changeable-col": "Skupiny, které můžete měnit",
        "userrights-unchangeable-col": "Skupiny, které nemůžete měnit",
+       "userrights-expiry-current": "Vyprší $1",
+       "userrights-expiry-none": "Bez vypršení",
+       "userrights-expiry": "Čas vypršení:",
+       "userrights-expiry-existing": "Současný čas vypršení: $2, $3",
+       "userrights-expiry-othertime": "Jiný čas:",
+       "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-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "uploaded-setting-handler-svg": "SVG, které nastavuje atribut „handler“ na nelokální/data/skript, je zablokováno. V načteném SVG souboru bylo nalezeno <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, které nastavuje libovolný stylový atribut se vzdáleným URL, je zablokováno. V načteném SVG souboru bylo nalezeno <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "V načteném SVG souboru byl nalezen obrazový filtr s URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Tento SVG soubor obsahuje nedovolený jmenný prostor „$1“",
+       "uploadscriptednamespace": "Tento SVG soubor obsahuje nedovolený jmenný prostor „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "XML v načteném souboru nelze zpracovat.",
        "uploadvirus": "Tento soubor obsahuje virus! Podrobnosti: $1",
        "uploadjava": "Tento soubor je ZIP, který obsahuje javový soubor .class.\nNačítání javových souborů není dovoleno, neboť by mohly umožnit obcházení bezpečnostních omezení.",
        "apisandbox-sending-request": "Odesílá se API požadavek…",
        "apisandbox-loading-results": "Přijímají se API výsledky…",
        "apisandbox-results-error": "Došlo k chybě při načítání odpovědi na API dotaz: $1.",
+       "apisandbox-request-selectformat-label": "Zobrazit data požadavku jako:",
+       "apisandbox-request-format-url-label": "řetězec dotazu do URL",
        "apisandbox-request-url-label": "URL požadavku:",
+       "apisandbox-request-json-label": "JSON požadavku:",
        "apisandbox-request-time": "Trvání požadavku: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Opravit token a znovu odeslat",
        "apisandbox-results-fixtoken-fail": "Nepodařilo se načíst token „$1“.",
        "editcomment": "Shrnutí editace bylo: <em>$1</em>.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
-       "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
+       "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
        "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|změnil|změnila}} značky na protokolovacím záznamu $5 k stránce $3 ({{PLURAL:$7|přidáno}} $6; {{PLURAL:$9|odebráno}} $8)",
        "rightsnone": "(žádné)",
        "revdelete-summary": "shrnutí editace",
+       "rightslogentry-temporary-group": "$1 (dočasně, do $2)",
        "feedback-adding": "Komentář se přidává na stránku…",
        "feedback-back": "Zpět",
        "feedback-bugcheck": "Skvělé! Jen zkontrolujte, zda se nejedná o jednu z [$1 už známých chyb].",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
        "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Přidat kategorii…",
+       "mw-widgets-usersmultiselect-placeholder": "Přidat další…",
        "sessionmanager-tie": "Nelze kombinovat několik typů autentizace požadavků: $1.",
        "sessionprovider-generic": "relace pomocí $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies",
index 8877f73..daebbc1 100644 (file)
@@ -8,48 +8,52 @@
                        "MinuteElectron",
                        "Warszk",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Kirsan",
+                       "Ankry"
                ]
        },
        "tog-underline": "Pòdsztrëchiwùjë lënczi:",
        "tog-hideminor": "Zatacë môłi edicëje w slédnëch zmianach",
        "tog-hidepatrolled": "Zatacë sprôdzoné edicëje slédnych zjinakach",
        "tog-newpageshidepatrolled": "Zatacë sprôdzoné edicëje w lësce nowich starnów",
+       "tog-hidecategorization": "Zatacë kategòrizacjã strón",
        "tog-extendwatchlist": "Rozwinie lëstã ùzérónëch artiklów bë wëskrzënic wszëtczé zmianë, ni le blós slédné",
        "tog-usenewrc": "Ùżëjé rozwinãti wëzdrzatk slédnych zjinaków (nót je JavaScript)",
        "tog-numberheadings": "Aùtomatné numerowanié nôgłówków",
-       "tog-showtoolbar": "Wëskrzrni listwã nôrzãdzów edicëji (nót je JavaScript)",
-       "tog-editondblclick": "Editëjë starnë przez dëbeltné klëkniãcé (nót je JavaScript)",
-       "tog-editsectiononrightclick": "Włączë edicëjã sekcëji bez klëkniãcé prawą knąpą mëszë<br />na titlu sekcëji (JavaScript)",
-       "tog-watchcreations": "Dodôwôj starnë, chtërné ùsôdzã, do mòji lëstë ùzérónëch artiklów",
-       "tog-watchdefault": "Dodôwôj starnë, chtërné editëjã do mòji lëstë ùzérónëch artiklów",
-       "tog-watchmoves": "Dodôwôj starnë jaczé przenoszã do mòji lëstë ùzérónëch artiklów",
-       "tog-watchdeletion": "Dodôwôj starnë jaczé rëmóm do mòji lëstë ùzérónëch artiklów",
+       "tog-showtoolbar": "Wëskrzëni listwã nôrzãdzów edicje",
+       "tog-editondblclick": "Editëjë starnë przez dëbeltné klëkniãcé",
+       "tog-editsectiononrightclick": "Włączë edicjã sekcji bez klëkniãcé prawą knąpą mëszë na titlu sekcje",
+       "tog-watchcreations": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë, chtërné ùsôdzã, i lopczi, chtërné wladëjã",
+       "tog-watchdefault": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë i lopczi, chtërné editëjã.",
+       "tog-watchmoves": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë i lopczi, jaczé przenoszã.",
+       "tog-watchdeletion": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë i lopczi, jaczé rëmóm.",
        "tog-minordefault": "Zaznaczë wszëtczé edicëje domëslno jakno môłé",
        "tog-previewontop": "Pòkażë pòdzérk przed kastką edicëji",
        "tog-previewonfirst": "Pòkażë pòdzérk ju przed pierszą edicëją",
-       "tog-enotifwatchlistpages": "Wëslë mie e-mail czedë starna jaką ùzéróm je zmieniwónô",
+       "tog-enotifwatchlistpages": "Wësli mie e-mail czedë je zmieniwónô starna abò lopk, jaczi ùzéróm.",
        "tog-enotifusertalkpages": "Wëslë mie e-mail czedë zmieniwónô je mòja starna diskùsëji",
-       "tog-enotifminoredits": "Wëslë mie e-mail téż dlô môłich zmianów starnów",
+       "tog-enotifminoredits": "Wësli mie e-mail téż dlô môłich zmianów starnów i lopków.",
        "tog-enotifrevealaddr": "Pòkażë mòją adresã e-mail w òdkôzëwùjącym mailu",
        "tog-shownumberswatching": "Pòkażë lëczba ùzérającëch brëkòwników",
-       "tog-oldsig": "Pòdzérk wëzdrzatkù twòjegò pòdpisënka",
+       "tog-oldsig": "Wëzdrzatk twòjegò pòdpisënkù:",
        "tog-fancysig": "Wzérôj na pòdpisënk jakno na wikikòd (bez aùtomatnych lënków)",
-       "tog-uselivepreview": "Brëkùjë wtimczasnegò pòdzérkù (JavaScript) (eksperimentalné)",
+       "tog-uselivepreview": "Brëkùjë wtimczasnegò pòdzérkù",
        "tog-forceeditsummary": "Pëtôj przed wéńdzenim do pùstégò pòdrechòwania edicëji",
-       "tog-watchlisthideown": "Zatacë mòjé edicëje z lëstë ùzérónëch artiklów",
+       "tog-watchlisthideown": "Zatacë mòje edicje z lëstë ùzérónëch artiklów",
        "tog-watchlisthidebots": "Zatacë edicëje botów z lëstë ùzérónëch artiklów",
        "tog-watchlisthideminor": "Zatacë môłi zmianë z lëstë ùzérónëch artiklów",
        "tog-watchlisthideliu": "Zatacë edicëje wlogòwónych brëkòwników na lësce ùzérónych artiklów",
        "tog-watchlisthideanons": "Zatacë edicëje anonimòwich brëkòwników na lësce ùzérónych artiklów",
        "tog-watchlisthidepatrolled": "Zatacë sprôwdzoné edicëje z lëstë ùzérónych artiklów",
+       "tog-watchlisthidecategorization": "Zatacë kategòrizacjã strón",
        "tog-ccmeonemails": "Sélôj do mie kòpije e-mailów, chtërné sélóm do jinych brëkòwników",
        "tog-diffonly": "Nie wëskrzëniôj zamkłoscë starnë niżi przërónaniô zjinaków",
        "tog-showhiddencats": "Wëskrzëni zataconé kategòrëje",
        "tog-norollbackdiff": "Pòcësni wëskrzënianié zjinaków pò copniãcô sã",
        "underline-always": "Wiedno",
        "underline-never": "Nigdë",
-       "underline-default": "Domëslny przezérnik",
+       "underline-default": "Tak jak w domëslnym przezérnikù abò skórczi.",
        "editfont-style": "Sztél fònta w edicjowim pòlu:",
        "editfont-default": "Domëslny przezérnik",
        "editfont-monospace": "fònt ò stałi szérzé",
        "oct": "ruj",
        "nov": "lës",
        "dec": "gòd",
+       "january-date": "$1 stëcznika",
+       "february-date": "$1 gromicznika",
+       "march-date": "$1 strëmiannika",
+       "april-date": "$1 łżëkwiata",
+       "may-date": "$1 maja",
+       "june-date": "$1 czerwińca",
+       "july-date": "$1 lëpińca",
+       "august-date": "$1 zélnika",
+       "september-date": "$1 séwnika",
+       "october-date": "$1 pazdzérznika",
+       "november-date": "$1 lëstopadnika",
+       "december-date": "$1 gòdnika",
        "pagecategories": "{{PLURAL:$1|Kategòrëjô|Kategòrëje}}",
        "category_header": "Artikle w kategòrëji \"$1\"",
        "subcategories": "Pòdkategòrëje",
        "newwindow": "(òtmëkô sã w nowim òczenkù)",
        "cancel": "Anulujë",
        "moredotdotdot": "Wicy...",
-       "mypage": "Mòja starna",
-       "mytalk": "Diskùsëjô",
-       "anontalk": "Diskùsëjô dlô ti IP-adresë",
+       "mypage": "Starna",
+       "mytalk": "Diskùsjô",
+       "anontalk": "Diskùs",
        "navigation": "Nawigacëjô",
        "and": "&#32;ë",
        "qbfind": "Nalézë",
        "actions": "Dzéjania",
        "namespaces": "Rum mionów:",
        "variants": "Wariantë",
+       "navigation-heading": "Nawigacyjné menu",
        "errorpagetitle": "Fela",
        "returnto": "Nazôd do starnë $1.",
        "tagline": "Z {{SITENAME}}",
        "history": "Historëjô starnë",
        "history_short": "Historëjô",
        "updatedmarker": "zaktualnioné òd mòji slédny gòscënë",
-       "printableversion": "Wersëjô do drëkù",
+       "printableversion": "Wersjô do drëkù",
        "permalink": "Prosti lënk",
        "print": "Drëkùjë",
+       "view": "Pòdzér",
        "edit": "Edicëjô",
-       "create": "Ùsôdzë",
+       "create": "Ùsadzë",
        "editthispage": "Editëjë nã starnã",
-       "create-this-page": "Ùsôdzë nã starnã",
+       "create-this-page": "Ùsadzë nã starnã",
        "delete": "Rëmôj",
        "deletethispage": "Rëmôj nã starnã",
-       "undelete_short": "Doprowôdzë nazôd {{PLURAL:$1|1 edicëjã|$1 edicëje|$1 edicëjów}}",
+       "undelete_short": "Doprowadzë nazôd {{PLURAL:$1|1 edicjã|$1 edicje|$1 edicjów}}",
        "protect": "Zazychrëjë",
        "protect_change": "zmieni",
        "protectthispage": "Zazychrëjë nã starnã",
        "unprotect": "Òdzychrëjë",
        "unprotectthispage": "Òdzychrëjë nã starnã",
        "newpage": "Nowô starna",
-       "talkpage": "Diskùsëjô starnë",
-       "talkpagelinktext": "Diskùsëjô",
+       "talkpage": "Diskùsjô starnë",
+       "talkpagelinktext": "diskùsjô",
        "specialpage": "Specjalnô starna",
        "personaltools": "Priwatné przërëchtënczi",
        "articlepage": "Starna artikla",
-       "talk": "Diskùsëjô",
+       "talk": "Diskùsjô",
        "views": "Pòdzérków",
        "toolbox": "Przërëchtënczi",
        "userpage": "Wëskrzëni starnã brëkòwnika",
        "jumptosearch": "szëkbë",
        "aboutsite": "Ò {{SITENAME}}",
        "aboutpage": "Project:Ò_{{SITENAME}}",
-       "copyright": "Zamkłosc hewòtny starnë je ùżëczónô wedle reglów $1.",
+       "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",
        "currentevents": "Aktualné wëdarzenia",
        "currentevents-url": "Project:Aktualné wëdarzenia",
        "disclaimers": "Prawné zastrzedżi",
        "disclaimerpage": "Project:Prawné zastrzedżi",
        "edithelp": "Pòmòc do edicëji",
+       "helppage-top-gethelp": "Pòmòc",
        "mainpage": "Przédnô starna",
        "mainpage-description": "Przédnô starna",
        "policy-url": "Project:Regle",
        "toc": "Spisënk zamkłoscë",
        "showtoc": "pokôż",
        "hidetoc": "zatacë",
+       "confirmable-yes": "Jo",
        "thisisdeleted": "Wëskrzënic abò dobëc nazôd $1?",
        "viewdeleted": "Òbaczë $1",
        "restorelink": "{{PLURAL:$1|jednô rëmniãtô wersëjô|$1 rëmniãté wersëje|$1 rëmniãtich wersëjów}}",
        "nstab-special": "Specjalnô starna",
        "nstab-project": "meta-starna",
        "nstab-image": "Òbrôzk",
-       "nstab-mediawiki": "Òłosënk",
+       "nstab-mediawiki": "Ògłosënk",
        "nstab-template": "Szablóna",
        "nstab-help": "Pòmòc",
        "nstab-category": "Kategòrëjô",
+       "mainpage-nstab": "Przédnô starna",
        "nosuchaction": "Felënk taczégò dzéjaniô",
        "nosuchactiontext": "Dzéjanié pòdóné w adrese URL nie je dobré.\nMòzlëwą przëczëną je lëterowô zmiłka w URL abò lëchi lënk.\nTo mòże bëc téż fela softwôrë brëkòwóny przez {{SITENAME}}.",
        "nosuchspecialpage": "Nie da taczi specjalny starnë",
        "editinginterface": "'''ÒSTRZÉGA:''' Editëjesz starnã, jakô zamëkô w se tekst interfejsu softwôrë. Wszëtczé zmianë tu zrobioné bãdze widzec na interfejse jinszëch brëkòwników.\nPrzemëszlë dolmaczënié na [https://translatewiki.net/wiki/Main_Page?setlang=csb translatewiki.net], ekstra ùdbie lokalizacëji softwôrë MediaWiki.",
        "logouttext": "'''Jes wëlogòwóny.'''\nMòżesz robic dali na {{SITENAME}} jakno anonimòwi brëkòwnik abò sã <span class='plainlinks'>[$1 wlogòwac]</span> znowa jakno równy, a bò jinszi brëkòwnik.\nBôczë, że do czasu wëczëszczenia pòdrãczny pamiãcë przezérnika, niejedné starnë bãdą wëzdrzëc jakbë të bëł wlogòwóny.",
        "yourname": "Miono brëkòwnika",
+       "userlogin-yourname": "Pòzwa brëkòwnika",
        "yourpassword": "Twòja parola",
+       "createacct-yourpassword-ph": "Wprowadzë hasło do przistãpù",
        "yourpasswordagain": "Pòwtórzë parolã",
+       "createacct-yourpasswordagain": "Pòcwierdzë hasło",
+       "createacct-yourpasswordagain-ph": "Wprowadzë hasło do przistãpù jesz rôz",
+       "userlogin-remembermypassword": "Nie wëlogòwùj mie",
        "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",
+       "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": "Ùsôdzë kònto",
+       "nologinlink": "Ùsadzë kònto",
        "createaccount": "Założë nowé kònto",
        "gotaccount": "Masz ju kònto? '''$1'''.",
        "gotaccountlink": "Wlogùjë",
-       "createaccountmail": "òb e-mail",
+       "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ą.",
        "userexists": "To miono brëkòwnika je ju w ùżëcym. Proszã wëbrac jiné miono.",
        "loginerror": "Fela logòwaniô",
-       "loginsuccesstitle": "ùdałé logòwanié",
+       "loginsuccesstitle": "Ã\99dałé logòwanié",
        "loginsuccess": "Të jes wlogòwóny do {{SITENAME}} jakno \"$1\".",
-       "nosuchuser": "Nie dô brëkòwnika ò mionie \"$1\".\nSprôwdzë pisënk abò [[Special:CreateAccount|ùsôdzë nowé kònto]].",
+       "nosuchuser": "Nie mô brëkòwnika ò mionie \"$1\".\nW pòzwie brëkòwnika mô znaczenié wiôlgòsc lëtrów.\nSprawdzë pisënk abò [[Special:CreateAccount|ùsadzë nowé kònto]].",
        "nouserspecified": "Mùszisz pòdac miono brëkòwnika.",
        "wrongpassword": "Lëchô parola.\nSpróbùjë znowa.",
        "wrongpasswordempty": "Wpisónô parola je pùstô\nSpróbùjë znowa.",
        "passwordtooshort": "Parola mùszi zamëkac w se co nômni $1 {{PLURAL:$1|céch|céchë|céchów}}.",
-       "mailmypassword": "Wëslë nową parolã e-mailą",
+       "mailmypassword": "Zetrzéc hasło.",
        "passwordremindertitle": "Nowô doczasnô parola dlô {{SITENAME}}",
        "passwordremindertext": "Chtos (gwës Të, z adresë $1) pòprosëł ò wësłanié nowi\nparolë dlô {{SITENAME}} ($4). Aktualnô parola dlô brëkòwnika\n\"$2\" òsta ùsôdzonô ë nastôwionô jakno \"$3\". Jeżlë to bëło twòją\njintencëją, mùszisz sã terô wlogòwac ë zmienic swòją parolã.\nNowô parola je wôznô {{PLURAL:$5|dzéń|$5 dni}}.\nJeżlë chto jinszi wësłôł to zapëtanié, abò pamiãtôsz swòją parolã\në chcesz jã dali bez zmianë brëkòwac, zjignorëje to wiadło ë\nrobi dali ze starną parolą.",
        "noemail": "W baze ni ma email-adresë dlô brëkòwnika \"$1\".",
        "acct_creation_throttle_hit": "Môsz ùsôdzoné ju {{PLURAL:$1|1 kònto|$1 kontów}}.\nNi mòżesz miec ju wicy.",
-       "emailauthenticated": "Twòjô adresa e-mail Ã²sta pòcwierdzonô $2 ò $3.",
+       "emailauthenticated": "Twój adres e-mail Ã²stôÅ\82 pòcwierdzóny $2 ò $3.",
        "accountcreated": "Konto założone",
-       "accountcreatedtext": "Konto brëkòwnika dlô $1 je założone.",
+       "accountcreatedtext": "Kònto brëkòwnika dlô [[{{ns:User}}:$1|$1]], [[{{ns:User talk}}:$1|talk]] òstało ùsadzóné.",
        "createaccount-title": "Kònto ùsôdzoné dlô {{SITENAME}}",
        "loginlanguagelabel": "Jãzëk: $1",
+       "pt-login": "Wlogùj mie",
+       "pt-createaccount": "Ùsadzë kònto",
+       "pt-userlogout": "Wëlogùj",
        "changepassword": "Zmiana parolë",
        "oldpassword": "Stôrô parola:",
        "newpassword": "Nowô parola",
        "retypenew": "Napiszë nową parolã jesz rôz",
        "resetpass-submit-loggedin": "Zmiana parolë",
        "resetpass-submit-cancel": "Anulujë",
+       "passwordreset-username": "Pòzwa brëkòwnika",
        "bold_sample": "Wëtłëszczony drëk",
        "bold_tip": "Wëtłëszczony drëk",
        "italic_sample": "Ùchëłi tekst",
        "sig_tip": "Twój pòdpisënk z datumã a czasã",
        "hr_tip": "Hòrizontalnô linijô (brëkùjë szpórowno)",
        "summary": "Pòdrechòwanié:",
-       "subject": "Téma/nagłówk:",
-       "minoredit": "To je drobnô edicëjô",
+       "subject": "Téma:",
+       "minoredit": "To je drobnô edicjô",
        "watchthis": "Ùzérôj",
        "savearticle": "Zapiszë artikel",
        "preview": "Pòdzérk",
        "showpreview": "Wëskrzëni pòdzérk",
        "showdiff": "Wëskrzëni zmianë",
-       "anoneditwarning": "'''Bôczë:''' Të nie je wlogòwóny. Twòjô adresa IP mdze zapisónô w historëji edicëji ti starnë.",
+       "anoneditwarning": "<strong>Bôczë:</strong> Të nie jes wlogòwóny. Jeżlë wëkònôsz jakąs zmianã, twòja adresa IP mdze widocznô dlô wszëtczich. Jeżlë <strong>[$1 wlogùjesz sã]</strong> abò <strong>[$2 ùsadzysz kònto]</strong>twòje zjinaczi òstóną przëpisóné do kònta, co wicy mającë kònto òtrzimôsz rozmajité ùdogòdnienia.",
+       "anonpreviewwarning": "Të nie jes wlogòwóny. Jeżlë wprowadzysz jaczés zjinaczi, twòja adresa IP mdze ùmieszczónô w historie edicji starnë.",
        "summary-preview": "Pòdzérk òpisënka:",
        "blockedtitle": "Brëkòwnik je zascëgóny",
        "blockedtext": "'''Twòje kònto abò ë IP-adresa òstałë zablokòwóné.'''\n\nZablokòwôł je $1.\nPòdónô przëczëna to:''$2''.\n\n * Zôczątk blokadë: $8\n * Kùńc blokadë: $6\n * Cél blokadë: $7\n\n\nBë zgwësnic sprawã zablokòwaniô mòżesz skòntaktowac sã z $1 abò jińszim [[{{MediaWiki:Grouppage-sysop}}|administratorã]].\nBoczë, że të ni mòżesz stądka sélac e-mailów, jeżlë nié môsz jesz zaregisterowóné e-mailowé adresë w [[Special:Preferences|nastôwach]].\nTwòjô aktualnô adresa IP to $3, a zablokòwónô adresa ID to #$5.\nProszëmë pòdac wëższé pòdôłczi przë wszëtczich pëtaniach.",
        "loginreqlink": "Wlogùjë",
        "loginreqpagetext": "$1 sã, żebë przezérac jinszé starnë.",
        "accmailtitle": "Parola wësłónô.",
-       "accmailtext": "Przëtrôfkòwò wëgenerowónô parola dlô [[User talk:$1|$1]] òsta wësłónô do $2.\n\nParolã dlô negò nowégò kònta mòże zmienic pò wlogòwaniu na starnie ''[[Special:ChangePassword|zjinaka parolë]]''.",
+       "accmailtext": "Przëtrôfkòwò wëgenerowónô parola dlô [[User talk:$1|$1]] òsta wësłónô do $2. Parolã dlô negò nowégò kònta mòże zmienic pò wlogòwaniu na starnie <em>[[Special:ChangePassword|zjinaka parolë]]</em> .",
        "newarticle": "(Nowi)",
        "newarticletext": "Môsz przëszłi z lënkù do starnë jaka jesz nie òbstoji.\nBë ùsôdzëc artikel, naczni pisac w kastce niżi (òb. [$1 starnã pòmòcë]\ndlô wicy wëdowiédzë).\nJeżlë jes të tuwò bez zmiłkã, le klëkni w swòjim przezérnikù knąpã '''nazôd'''.",
-       "anontalkpagetext": "----''To je starna dyskùsëji anonimòwiégò brëkòwnika, chtëren nie ùsôdzëł jesz swòjegò kòntae, abò gò nie brëkùje.\nAbë gò rozpòznac, ùżëwómë adresów IP.\nTakô adresa IP, mòże bëc równak brëkòwónô przez wiele lëdzy.\nJeżlë jes anonimòwim brëkòwnikã ë ùwôżôsz, że ne wiadła nie są do ce sczerowóne, tedë [[Special:CreateAccount|ùsôdzë nowé kònto]] abò [[Special:UserLogin|wlogùjë sã]], bë niechac niezrozmeiniô z jinyma anonimòwima brëkòwnikama.''",
-       "noarticletext": "Felëje starna ò tim titlu.\nMòżesz [[Special:Search/{{PAGENAME}}|szëkac za {{PAGENAME}} na jinych starnach]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} szëkac w logù] abò [{{fullurl:{{FULLPAGENAME}}|action=edit}} ùsôdzëc nã starnã]</span>",
+       "anontalkpagetext": "----\n<em>To je starna diskùsje anonimòwégò brëkòwnika, chtëren nie ùsadzëł jesz swòjegò kònta, abò gò nie brëkùje.</em>\nAbë gò rozpòznac, ùżëwómë adresów IP.\nTakô adresa IP mòże bëc równak brëkòwónô przez wiele lëdzy.\nJeżlë jes anonimòwim brëkòwnikã i ùwôżôsz, że ne wiadła nie są do ce sczerowóné, tedë [[Special:CreateAccount|ùsadzë nowé kònto]] abò [[Special:UserLogin|wlogùj sã]], bë niechac niezrozmieniô z jinyma anonimòwima brëkòwnikama.''",
+       "noarticletext": "Felëje starna ò tim titlu.\nMòżesz [[Special:Search/{{PAGENAME}}|szëkac za {{PAGENAME}} na jinych starnach]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} szëkac w logù] abò [{{fullurl:{{FULLPAGENAME}}|action=edit}} ùsadzëc nã starnã]</span>",
        "clearyourcache": "'''Bôczë: Pò zapisanim, mòże bãdzesz mùszôł òminąc pamiãc przezérnika bë òbaczëc zmianë.'''\n'''Mozilla / Firefox / Safari:''' przëtrzëmôj ''Shift'' òbczas klëkaniô na ''Zladëjë znowa'', abò wcësni ''Ctrl-F5'' abò ''Ctrl-R'' (''Command-R'' na kòmpùtrach Mac);\n'''Konqueror:''': klëkni na knąpã ''Zladëjë znowa'', abò wcësni ''F5'';\n'''Opera:''' wëczëszczë pòdrãczną pamiãc w ''Tools→Preferences'';\n'''Internet Explorer:'''przëtrzëmôj ''Ctrl'' òbczas klëkaniô na ''Zladëjë znowa'', abò wcësni ''Ctrl-F5''.",
        "updated": "(Zaktualnioné)",
-       "previewnote": "'''To je blós pòdzérk - artikel jesz nie je zapisóny!'''",
+       "previewnote": "<strong>To je blós pòdzérk.</strong>\n Artikel jesz nie je zapisóny!",
+       "continue-editing": "Przeńdzë do pòla edicje.",
        "editing": "Edicëjô $1",
        "editingsection": "Edicëjô $1 (dzél)",
        "explainconflict": "Chtos sfórtowôł wprowadzëc swòją wersëjã artikla òbczôs Twòji edicëji.\nGórné pòle edicëji zamëkô w se tekst starnë aktualno zapisóny w pòdôwkòwi baze.\nTwòje zmianë są w dólnym pòlu edicëji.\nBë wprowadzëc swòje zmianë mùszisz zmòdifikòwac tekst z górnégò pòla.\n'''Blós''' tekst z górnégò pòla mdze zapisóny w baze czej wcësniesz \"{{int:savearticle}}\".",
        "copyrightwarning": "Bôczë, że wszëtczé edicëje w {{SITENAME}} są wprowadzané pòd zastrzégą $2 (òb. $1 dlô detalów). Jeżlë nie chcesz bë to co napiszesz bëło editowóné czë kòpijowóné, tedë nie zacwierdzôj nëch edicëjów.<br />Zacwierdzając zmianë dôwôsz parolã, że to co môsz napisóné je Twòjégò aùtorstwa, abò skòpijowóné z dostónków public domain abò jinëch wòlnëch licencëjów. '''NIE DODÔWÔJ CËZËCH TEKSTÓW BEZ ZEZWÒLENIÔ!'''",
        "copyrightwarning2": "Bôczë, że wszëtczé edicëje w {{SITENAME}} mògą bëc editowóné, zmienióné abò rëmniãté bez jinëch brëkòwników.\nJeżlë nie chcesz bë Twòja robòta bëła editowónô, tedë nie dodôwôj ji tuwò.<br />\nZacwierdzając zmianë dôwôsz zgòdã na to, że to co môsz napisóné je Twòjégò aùtorstwa, abò skòpijowóné z dostónków public domain abò jinëch wòlnëch licencëjów (zdrzë za detalama na $1).\n'''NIE DODÔWÔJ ROBÒTË CHRONIONY ÙSÔDZKÒWIMA PRAWAMA BEZ ZEZWÒLENIÔ!'''",
        "readonlywarning": "'''BÔCZËNK: Pòdôwkòwô baza òsta sztërkòwô zablokòwónô dlô administracjowich célów. Ni mòże tej timczasã zapisac nowi wersëji artikla.\nBédëjemë przeniesc ji tekst do priwatnégò lopka (wëtnij/wstôw) ë ùchòwac na pózni.'''\n\nAdministrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
+       "titleprotectedwarning": "'''Czó! Starna ò ti pòzwie òsta zazychrowónô. Dlô ùsadzeniô ti starnë pòtrzébné są [[Special:ListGroupRights|apartné ùdowierzenia]].'''\nNiżi  je widzec slédny wpisënk z registru:",
        "templatesused": "{{PLURAL:$1|Ùżëtô szablona|Ùżëté szablónë}} w tim artiklu:",
        "templatesusedpreview": "{{PLURAL:$1|Szablóna ùżëtô|Szablónë użëté}} w tim pòdzérkù:",
        "template-protected": "(zazychrowónô)",
        "template-semiprotected": "(dzélowò zazychrowóné)",
        "hiddencategories": "Na starna przënôleżi do w {{PLURAL:$1|1 zatacony kategòrëji|$1 zataconych kategòrëjów}}:",
        "permissionserrorstext-withaction": "Ni môsz przëstãpù do $2, z {{PLURAL:$1|nôslédny przëczënë|nôslédnych przëczënów}}:",
+       "recreate-moveddeleted-warn": "'''Bôczënk! Chcesz usadzëc starnã, chtërna wczasni òsta rëmniãtô.'''\n\nÙgwësni sã, czë pònowné ùsôdzenié ti starnë je kònieczné. \nNiżi je widzec register rëmaniów i zmian pòzwë ti starnë:",
+       "undo-summary": "Anulowanié wersje $1 aùtora [[Special:Contributions/$2|$2]] ([[User talk:$2|diskùsjô]])",
        "viewpagelogs": "Òbôczë rejestrë dzéjanió dlô ti starnë",
        "currentrev": "Aktualnô wersëjô",
        "currentrev-asof": "Aktualnô wersëjô na dzéń $1",
        "page_last": "kùńc",
        "histlegend": "Legenda: (aktualnô) = różnice w przërównanim do aktualny wersëje,\n(wczasniészô) = różnice w przërównanim do wczasniészi wersëje, D = drobné edicëje",
        "history-fieldset-title": "Przezérôj historëjã",
-       "histfirst": "Stôrszé",
-       "histlast": "Nowszé",
+       "history-show-deleted": "Leno rëmniãté",
+       "histfirst": "òd nôstarszich",
+       "histlast": "òd nônowszich",
        "history-feed-item-nocomment": "$1 ò $2",
        "rev-delundel": "pòkażë/zatacë",
        "rev-showdeleted": "pokôż",
        "revdelete-show-file-submit": "Jo",
-       "revdelete-radio-set": "Jo",
-       "revdelete-radio-unset": "Nié",
+       "revdelete-radio-set": "ùtacony",
+       "revdelete-radio-unset": "widzawny",
+       "revdelete-log": "Przëczëna:",
        "revdel-restore": "Zjinaczë widzawnotã",
        "pagehist": "Historëjô starnë",
        "deletedhist": "Rëmniãtô historëjô edicëji",
        "revdelete-hide-current": "Pòkôza sã fela przë taceniu wersëji datowóny na $2, $1. To je nônowszô wersëjô starnë, chtërnô ni mòże bëc zataconô.",
        "revdelete-show-no-access": "Pòkôza sã fela przë próbie wëskrzënieniô elementu datowónegò na $2, $1. Widzawnota negò elementu òsta ògrańczonô - ni môsz przëstãpù.",
+       "mergehistory-reason": "Przëczëna:",
        "revertmerge": "Rozdzélë",
-       "history-title": "Historëjô wersëji dlô \"$1\"",
+       "history-title": "Historiô zjinaków dlô \"$1\"",
+       "difference-title": "$1 — rozeszłoscë midzë wersjama",
        "lineno": "Lëniô $1:",
        "compareselectedversions": "Przërównôj wëbróné wersëje",
        "editundo": "doprowadzë nazôd",
        "prevn": "wczasniészé {{PLURAL:$1|$1}}",
        "nextn": "nôslédné {{PLURAL:$1|$1}}",
        "viewprevnext": "Òbaczë ($1 {{int:pipe-separator}} $2) ($3).",
+       "searchprofile-articles": "Artikle",
+       "searchprofile-everything": "na wszëtczich starnach",
        "searchprofile-advanced": "Awansowóné",
        "search-result-size": "$1 ({{PLURAL:$2|1 słowò|$2 słowa|$2 słów}})",
-       "search-redirect": "(przeczérowanié $1)",
+       "search-redirect": "(przeczérowanié $1)",
        "search-section": "(dzél $1)",
        "search-suggest": "Të mëszlôł ò: $1",
        "search-interwiki-caption": "Sosterné ùdbë",
-       "search-interwiki-default": "Skùtczi dlô $1:",
+       "search-interwiki-default": "Wëniczi òd $1:",
        "search-interwiki-more": "(wicy)",
        "searchall": "wszëtczé",
        "powersearch-legend": "Awansowónô szëkba",
        "powersearch-ns": "Szëkba w rumach mionów:",
        "preferences": "Preferencëje",
-       "mypreferences": "Mòje nastôwë",
+       "mypreferences": "Nastôwë",
        "prefs-edits": "Lëczba edicëjów:",
        "prefs-skin": "Wëzdrzatk",
        "skin-preview": "Pòdzérk",
        "datedefault": "Felëje preferencëji",
        "prefs-personal": "Pòdôwczi brëkòwnika",
-       "prefs-rc": "Slédné edicëje",
+       "prefs-rc": "Slédné edicje",
        "prefs-watchlist": "Lësta ùzérónëch artiklów",
        "prefs-watchlist-days": "Wielëna dniów dlô wëskrzëniwaniô na lësce ùzérónëch artiklów:",
        "prefs-watchlist-edits": "Maksymalnô lëczba edicëjów do pòkazaniô w rozszérzoné lësce ùzérónëch artiklów:",
        "prefs-misc": "Jine",
        "saveprefs": "Zapiszë",
        "prefs-editing": "Edicëjô",
-       "rows": "Régów:",
-       "columns": "Kòlumnów:",
        "searchresultshead": "Szëkba",
        "stub-threshold": "Greńca dlô fòrmatowaniô <a href=\"#\" class=\"stub\">lënków stubów</a>:",
        "recentchangesdays": "Kùli dni pòkazëwac w slédnëch edicëjach:",
        "savedprefs": "Twòjé nastôwë òstałë zapisóné.",
        "timezonelegend": "Czasowô cona:",
        "localtime": "Môlowi czas:",
-       "timezoneuseserverdefault": "Ùżëjë domëslnégò czasu serwera",
+       "timezoneuseserverdefault": "Ùżij domëslny dlô ti wiki ($1)",
        "timezoneuseoffset": "Jinô (specyfikùjë różnicã)",
        "servertime": "Czas serwera:",
        "guesstimezone": "Wezmi z przezérnika",
        "timezoneregion-indian": "Indijsczi Òcean",
        "timezoneregion-pacific": "Spòkójny Òcean",
        "allowemail": "Włączë mòżlewòtã sélaniô e-mailów òd jinëch brëkòwników",
-       "prefs-searchoptions": "Òptacëje szëkbë",
+       "prefs-searchoptions": "Szëkba",
        "prefs-namespaces": "Rum mionów",
        "default": "domëszlné",
        "prefs-files": "Lopczi",
        "prefs-reset-intro": "Na ti starnie mòże doprowôdzëc nazôd domëslné nastôwë dlô ti starnë.\nNegò dzéjaniô ni mòżé pòzdze ju copnąc.",
        "prefs-emailconfirm-label": "Pòcwierdzenié e-mailowi adresë:",
        "youremail": "E-mail:",
-       "username": "Miono brëkòwnika:",
-       "prefs-memberingroups": "Nôlëżnik {{PLURAL:$1|karna|karnów}}",
+       "username": "{{GENDER:$1|Miono brëkòwnika}}:",
+       "prefs-memberingroups": "{{GENDER:$2| Nôlëżnik}}{{PLURAL:$1|karna|karnów}}",
        "prefs-registration": "Czas registracëji:",
        "yourrealname": "Miono ë nôzwëskò:",
        "yourlanguage": "Jãzëk:",
-       "yourvariant": "Wariant:",
+       "yourvariant": "Wariant jãzëka zamkłoscë:",
        "yournick": "Pòdpisënk:",
        "badsig": "Òchëbny pòdpisënk, sprôwdzë tadżi HTML.",
        "badsiglength": "Pòdpisënk je za dłudżi.\nMô bëc mni jakno $1 {{PLURAL:$1|znak|znaczi/znaków}}.",
        "gender-male": "Chłop",
        "gender-female": "Białka",
        "email": "E-mail",
-       "prefs-help-realname": "Prôwdzewi miono je òptacjowé a czej je dôsz, òstanié ùżëté do pòdpisaniô Twòjégò wkłôdu",
+       "prefs-help-realname": "Prôwdzëwé miono je òptacjowé, a czej je dôsz, òstanié ùżëté do pòdpisaniô Twòjégò wkładu",
        "prefs-help-email": "Adresa e-mail je òptacëjnô, zezwôlô równak sélac do ce nową parolã jak tã zabëjesz.\nMòżesz zezwòlëc jinszim brëkòwniką na łączbã z Tobą przez Twòją starnã abò starnã diskùsëji, bez mùszebnotë wëskrzënianiô swòjich pòdôwków.",
        "editinguser": "Zmiana praw brëkòwnika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+       "userrights-reason": "Przëczëna:",
        "group": "Karno:",
        "group-user": "Brëkòwnicë",
        "group-autoconfirmed": "Aùtomatno zacwierdzony brëkòwnicë",
        "group-bot": "Bòtë",
        "group-sysop": "Sprôwnicë",
-       "group-bureaucrat": "Biurokracë",
+       "group-bureaucrat": "Biórokracë",
        "group-suppress": "Rewizorzë",
        "group-all": "(wszëtcë)",
-       "group-user-member": "{{GENDER:$1|Brëkòwnik}}",
-       "group-autoconfirmed-member": "aùtomatno zacwierdzony brëkòwnik",
-       "group-bot-member": "bòt",
-       "group-sysop-member": "sprôwnik",
-       "group-bureaucrat-member": "biurokrata",
+       "group-user-member": "{{GENDER:$1|brëkòwnik|brëkòwniczka}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|aùtomatno zacwierdzony brëkòwnik|aùtomatno zacwierdzonô brëkòwniczka}}",
+       "group-bot-member": "{{GENDER:$1|bòt}}",
+       "group-sysop-member": "{{GENDER:$1|sprôwnik}}",
+       "group-bureaucrat-member": "{{GENDER:$1|biórokrata|biórokratka}}",
        "group-suppress-member": "rewizora",
        "grouppage-user": "{{ns:project}}:Brëkòwnicë",
        "grouppage-autoconfirmed": "{{ns:project}}:Aùtomatno zacwierdzeni brëkòwnicë",
        "grouppage-bot": "{{ns:project}}:Bòtë",
        "grouppage-sysop": "{{ns:project}}:Sprôwnicë",
-       "grouppage-bureaucrat": "{{ns:project}}:Biurokracë",
+       "grouppage-bureaucrat": "{{ns:project}}:Biórokracë",
        "grouppage-suppress": "{{ns:project}}:Rewizorzë",
        "right-read": "Czëtanié starnów",
        "right-edit": "Edicëjô starnów",
        "rightslog": "Prawa brëkòwnika",
        "action-edit": "editëjë tã starnã",
        "nchanges": "{{PLURAL:$1|zjinaka|zjinaczi|zjinaków}}",
-       "recentchanges": "Slédné edicëje",
+       "enhancedrc-history": "Historiô",
+       "recentchanges": "Slédné edicje",
        "recentchanges-legend": "Òptacëje slédnych zjinaków",
-       "recentchanges-summary": "Na starna prezentérëje historëjã slédnëch edicëjów w {{SITENAME}}.",
+       "recentchanges-summary": "Na starna prezentérëje historiã slédnëch edicjów w ti wiki.",
        "recentchanges-feed-description": "Pòdstrzegô slédny zmianë w tim pòwrózkù.",
-       "recentchanges-label-minor": "To je drobnô edicëjô",
+       "recentchanges-label-newpage": "W ti edicje ùsadzóno nową starnã",
+       "recentchanges-label-minor": "To je drobnô edicjô",
+       "recentchanges-label-bot": "Tã edicjã wëkònôł bòt.",
+       "recentchanges-label-unpatrolled": "Ta edicjô jesz nie òsta sprawdzónô",
+       "recentchanges-label-plusminus": "Zjinaczónô wiôlgòsc starnë (lëczba bajtów)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (òbaczë téż [[Special:NewPages|lëstã nowëch strón]])",
        "rcnotefrom": "Niżi są zmianë òd '''$2''' (pòkazóné do '''$1''').",
        "rclistfrom": "Pòkażë nowé zmianë òd $3 $2",
        "rcshowhideminor": "$1 môłé zmianë",
+       "rcshowhideminor-hide": "Zatacë",
        "rcshowhidebots": "$1 botë",
-       "rcshowhideliu": "$1 zalogòwónëch brëkòwników",
-       "rcshowhideanons": "$1 anonymòwëch brëkòwników",
+       "rcshowhidebots-show": "pokôż",
+       "rcshowhideliu": "$1 zaregistrowónëch brëkòwników",
+       "rcshowhideliu-hide": "Zatacë",
+       "rcshowhideanons": "$1 anonimòwëch brëkòwników",
+       "rcshowhideanons-hide": "Zatacë",
        "rcshowhidepatr": "$1 òbzérónë edicëje",
-       "rcshowhidemine": "$1 mòjé edicëje",
+       "rcshowhidemine": "$1 mòje edicje",
+       "rcshowhidemine-hide": "Zatacë",
+       "rcshowhidecategorization": "$1 kategòrizacjã strón",
        "rclinks": "Pòkażë slédnëch $1 zmianów zrobionëch òb slédné $2 dniów<br />$3",
        "diff": "jinosc",
        "hist": "hist.",
        "filehist-dimensions": "Miara",
        "filehist-filesize": "Miara lopka",
        "filehist-comment": "Òpisënk",
-       "imagelinks": "Lënczi lopka",
+       "imagelinks": "Wëkòrzëstanie lopka",
        "linkstoimage": "{{PLURAL:$1|Hewò je starna jakô òdwòłëje|Hewò są starnë jaczé òdwòłëją}} sã do negò lopka:",
        "nolinkstoimage": "Niżódnô starna nie òdwòłëje sã do negò lopka.",
        "sharedupload": "Nen lopk je na $1 ë mòże bëc brëkòwóny w jinych ùdbach.",
        "uploadnewversion-linktext": "Wladëjë nową wersëjã negò lopka",
+       "filerevert-comment": "Przëczëna:",
+       "filedelete-comment": "Przëczëna:",
        "listredirects": "Lësta przeczerowaniów",
        "unusedtemplates": "Pùsté szablónë",
        "randompage": "Kawlowô starna",
        "statistics": "Statisticzi",
+       "statistics-header-pages": "Statistika starnów",
+       "statistics-header-edits": "Statistika edicji",
        "statistics-header-users": "Statistika brëkòwników",
+       "statistics-pages-desc": "Wszëtczé starnë na wiki, w tim starnë diskùsje, przeczerowania itd.",
+       "statistics-files": "Wësłóné lopczi",
+       "statistics-edits": "Edicje wëkònané òd pòwstaniégò {{grammar:genitive|{{SITENAME}}}}",
+       "statistics-edits-average": "Strzédnô lëczba edicji na starnã",
+       "statistics-users": "Zaregistrowónëch [[Special:ListUsers|brëkòwników]]",
+       "statistics-users-active": "Aktiwnëch brëkòwników",
+       "statistics-users-active-desc": "Brekòwnicë, jaczi bëlë aktiwni òb òstatné $1 dni",
        "doubleredirects": "Dëbeltné przeczérowania",
        "brokenredirects": "Zerwóné przeczerowania",
        "withoutinterwiki": "Starnë bez jãzëkòwich lënków",
        "shortpages": "Nôkrótszé starnë",
        "longpages": "Nôdłëgszé starnë",
        "protectedpages": "Zazychrowóné starnë",
+       "protectedpages-timestamp": "Czasowô sygnatura",
+       "protectedpages-reason": "Przëczëna",
        "listusers": "Lësta brëkòwników",
        "newpages": "Nowé starnë",
-       "newpages-username": "Miono brëkòwnika:",
+       "newpages-username": "Pòzwa brëkòwnika:",
        "ancientpages": "Nôstarszé starnë",
        "move": "Przeniesë",
        "movethispage": "Przeniesë",
        "allpagessubmit": "Pòkôżë",
        "allpagesprefix": "Pòkôżë naczënającë sã òd:",
        "categories": "Kategòrëje",
+       "deletedcontributions": "Rëmniãti wkłôd brëkòwnika",
+       "deletedcontributions-title": "Rëmniãti wkłôd brëkòwnika",
        "linksearch": "Bùtnowé lënczi",
+       "activeusers": "Lësta aktiwnëch brëkòwników",
        "listgrouprights-members": "(lësta nôlëżników karna)",
        "emailuser": "Wëslë e-maila do negò brëkòwnika",
        "defemailsubject": "E-mail òd {{SITENAME}}",
        "noemailtitle": "Felënk email-adresë",
+       "emailusername": "Pòzwa brëkòwnika",
        "emailfrom": "Òd:",
        "emailto": "Do:",
        "emailsubject": "Téma:",
        "unwatchthispage": "Òprzestôj ùzerac ną starnã",
        "notanarticle": "To nie je artikel",
        "watchlist-details": "Ùzérôsz {{PLURAL:$1|$1 artikel|$1 artikle/-ów}}, nie rechùjąc diskùsëjów.",
-       "wlheader-showupdated": "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
+       "wlheader-showupdated": "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné <strong>pògrëbieniém</strong>",
        "wlnote": "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
        "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni",
+       "wlshowhidecategorization": "kategòrizacjã strón",
        "watchlist-options": "Òptacëje ùzérónych",
        "watching": "Ùzéróm...",
        "unwatching": "Ju ni ùzéróm...",
        "rollbacklink": "copnij",
        "rollbackfailed": "Nie szło copnąc zmianë",
        "alreadyrolled": "Ni mòże copnąc slédny edicëji starnë [[:$1]], chtërny ùsôdzcą je [[User:$2|$2]] ([[User talk:$2|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nchtos jiny ju zeditowôł starnã abò copnął zmianë.\n\nSlédnym ùsódzcą starnë bëł [[User:$3|$3]] ([[User talk:$3|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "revertpage": "Edicje brëkòwnika [[Special:Contributions/$2|$2]] ([[User talk:$2|diskùsjô]]) òstałë òdrzucóné. Aùtorã przëwrócóny wersji je [[User:$1|$1]].",
+       "rollback-success": "Edicje brëkòwnika $1 òstałë òdrzucóné; \nòsta przëwrócónô òstatnô wersjô, aùtorã chtërny je $2.",
+       "rollback-success-notify": "Edicje brëkòwnika $1 òstałë òdrzucóné; \nòsta przëwrócónô òstatnô wersjô, aùtorã chtërny je $2. [$3 Pòkażë zjinaczi]",
        "protectlogpage": "Zazychrowóné",
        "protectedarticle": "zazychrowónô [[$1]]",
        "modifiedarticleprotection": "zmienionô léga zazychrowaniô [[$1]]",
        "unprotectedarticle": "òdzychrowóny [[$1]]",
+       "protectedarticle-comment": "{{GENDER:$2|Zazychrowôł|Zazychrowała}} „[[$1]]”",
        "prot_1movedto2": "$1 przeniesłé do $2",
        "protect-legend": "Pòcwierdzë zazychrowanié",
        "protectcomment": "Przëczëna:",
        "protect-level-sysop": "blós sprôwnicë (sysopë)",
        "protect-summary-cascade": "kaskadowanié",
        "protect-expiring": "wëgasô $1 (UTC)",
+       "protect-expiry-indefinite": "na wiedno",
        "protect-cascade": "Zazychrëjë wszëtczé starnë zamkłé na ti starnie (kaskadowé zazychrowanié)",
        "protect-cantedit": "Ni mòżesz zmieniac lédżi zazychrowaniô ti starnë, kò ni môsz dosc prawa do ji edicëji.",
        "restriction-type": "Przistãp:",
        "restriction-level": "Léga bezpieczi:",
        "viewdeletedpage": "Òbaczë rëmóne starnë",
-       "undeletebtn": "Doprowôdzë nazôd",
-       "undeletelink": "wëskrzëni abò doprowôdzë nazôd",
+       "undeletebtn": "Doprowadzë nazôd",
+       "undeletelink": "wëskrzëni abò doprowadzë nazôd",
+       "undeletecomment": "Przëczëna:",
        "undelete-show-file-submit": "Jo",
        "namespace": "Rum mionów:",
        "invert": "Òdwrócë zaznaczenié",
+       "namespace_association": "sparłãczóné òbrëmié mionów",
        "blanknamespace": "(Przédnô)",
-       "contributions": "Wkłôd brëkòwników",
+       "contributions": "Wkłôd {{GENDER:$1|brëkòwnika|brëkòwniczczi}}",
        "contributions-title": "Wkłôd brëkòwnika $1",
-       "mycontris": "Mòje edicëje",
+       "mycontris": "Mój wkłôd",
+       "anoncontribs": "Mój wkłôd",
        "contribsub2": "Dlô brëkòwnika $1 ($2)",
        "uctop": "(slédnô)",
        "month": "Òd miesąca (ë wczasni):",
        "sp-contributions-newbies": "Pòkażë edicëjã blós nowich brëkòwników",
        "sp-contributions-newbies-sub": "Dlô nowich brëkòwników",
        "sp-contributions-blocklog": "historëjô blokòwaniô",
-       "sp-contributions-talk": "diskùsëjô",
+       "sp-contributions-deleted": "rëmniãti wkłôd brëkòwnika",
+       "sp-contributions-talk": "diskùsjô",
+       "sp-contributions-blocked-notice-anon": "Ta adresa IP je w tim sztërkù zablokòwónô.\nSlédny wpisënk z registru blokòwaniów je widzec niżi:",
        "sp-contributions-search": "Szëkba za edicëjama",
        "sp-contributions-username": "Adresa IP abò miono brëkòwnika:",
+       "sp-contributions-toponly": "Pòkażë leno slédné wersje",
+       "sp-contributions-newonly": "Pòkażë leno te edicje, jaczé twòrzą nową starnã",
+       "sp-contributions-hideminor": "Zatacy drobné zjinaczi",
        "sp-contributions-submit": "Szëkôj",
        "whatlinkshere": "Lënkùjącé",
        "whatlinkshere-title": "Starnë lënkùjącé do \"$1\"",
        "nolinkshere": "Niżódnô starna nie lënkùje do '''[[:$1]]'''.",
        "isredirect": "starna przeczerowaniô",
        "istemplate": "doparłãczony",
-       "isimage": "lënk òbrôzka",
+       "isimage": "lënk do lopka",
        "whatlinkshere-prev": "{{PLURAL:$1|wczasniészé|wczasniészé $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nôslédné|nôslédné $1}}",
        "whatlinkshere-links": "← lëkùjącé",
-       "whatlinkshere-hideredirs": "$1 przeczérownia",
+       "whatlinkshere-hideredirs": "$1 przeczérowania",
        "whatlinkshere-hidetrans": "$1 doparłãczenia",
        "whatlinkshere-hidelinks": "$1 lënczi",
        "whatlinkshere-filters": "Filtrë",
        "blockipsuccesssub": "Zascëgónié dało sã",
        "blockipsuccesstext": "Brëkòwnik [[Special:Contributions/$1|$1]] òstał zascëgóny.<br />\nBiéj do [[Special:BlockList|lëstë zascëgónëch adresów IP]] abë òbaczëc zascëdżi.",
        "ipblocklist": "Lësta zablokòwónëch adresów IP ë mionów brëkòwników",
+       "blocklist-timestamp": "Czasowô sygnatura",
+       "blocklist-target": "Cél",
+       "blocklist-expiry": "Ùpłiwô",
+       "blocklist-by": "Blokùjący sprôwnik",
+       "blocklist-params": "Paramétrë blokòwaniô",
+       "blocklist-reason": "Przëczëna",
+       "infiniteblock": "na wiedno",
+       "createaccountblock": "blokada ùsadzaniô kòntów",
+       "emailblock": "zablokòwónô adresa e-mail",
+       "blocklist-nousertalk": "ni mòże editowac gwôsny starnë diskùsje",
        "blocklink": "blokùjë",
        "unblocklink": "òdblokùjë",
        "change-blocklink": "zmieni blokòwanié",
        "blocklogpage": "Historëjô blokòwaniô",
        "blocklogentry": "zablokòwôł [[$1]], czas blokadë: $2 $3",
        "unblocklogentry": "òdblokòwôł $1",
+       "block-log-flags-anononly": "leno anonimòwi",
        "block-log-flags-nocreate": "blokada ùsôdzaniô kònta",
+       "block-log-flags-noemail": "zablokòwónô adresa e-mail",
        "lockbtn": "Zascëgôj bazã pòdôwków",
        "move-page-legend": "Przeniesë starnã",
        "movepagetext": "Z pòmòcą ùiższegò fòrmùlôra zjinaczisz miono starnë, przenosząc równoczasno ji historëjã.\nPòd stôrim titlã bãdze ùsôdzonô przeczérowùjącô starna.\nMòżesz aùtomatno zaktualniac przeczérowania wskazëwôjące titel przed zjinaką.\nJeżlë nie wëbiérzesz ti òptacëji, ùgwësni sã pò przenieseniu starnë, czë nie òstałé ùsôdzoné [[Special:DoubleRedirects|dëbeltné]] abò [[Special:BrokenRedirects|zerwóné przeczérowania]].\nJes òdpòwiedzalny za to, abë lënczi dali robiłë tam dze mają.\n\nStarna '''ni''' bãdze przeniosłô, jeżlë starna ò nowim mionie ju je, chòba że je òna pùstô abò je przeczérowaniém ë mô pùstą historëjã edicëji.\nTo òznôczô, że lëchą òperacëjã zjinaczi miona mòże doprowôdzëc bezpieczno nazôd, zjinaczając nowé miono starnë nawczasniészą, ë że ni mòże nadpisac stranë chtërną ju dô.\n\n'''BÔCZËNK!'''\nTo mòże bëc drasticznô abò nieprzewidëwólnô zjinaka w przëtrôfkù pòpùlarnych starnów.\nÙgwësni sã co do skùtków ti òperacëji, niglë to zrobisz.",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' nie mòże bëc brëkòwónô, temù że '''$wgUseDatabaseMessages''' je wëłączony.",
        "thumbnail-more": "Zwiszi",
        "import": "Impòrtëjë starnë",
-       "tooltip-pt-userpage": "Twòja starna brëkòwnika",
-       "tooltip-pt-mytalk": "Twòjô starna diskùsëji",
-       "tooltip-pt-preferences": "Mòje nastôwë",
+       "tooltip-pt-userpage": "{{GENDER:|Twòja}} starna brëkòwnika",
+       "tooltip-pt-mytalk": "{{GENDER:|Twòja}} starna diskùsje",
+       "tooltip-pt-anontalk": "Diskùsjô brëkòwnika dlô ti adresë IP",
+       "tooltip-pt-preferences": "{{GENDER:|Mòje}}nastôwë",
        "tooltip-pt-watchlist": "Lësta artiklów jaczé òbzérôsz za zmianama",
-       "tooltip-pt-mycontris": "Lësta twòjich edicëjów",
+       "tooltip-pt-mycontris": "Lësta {{GENDER:|twòjich}} edicji",
+       "tooltip-pt-anoncontribs": "Lësta edicji, jaczé bëłë zrobióné spòd ti adresë IP.",
        "tooltip-pt-login": "Rôczimë do wlogòwaniô sã, nie je to równak mùszebné.",
        "tooltip-pt-logout": "Wëlogòwanié",
-       "tooltip-ca-talk": "Diskùsëjô zamkłoscë ti starnë",
-       "tooltip-ca-edit": "Mòżesz editowac nã starnã.\nProszã brëkòwac knąpë pòdzérkù przed zapisaniém.",
+       "tooltip-pt-createaccount": "Zachãcëwómë do ùsadzeniô kònta i wlogòwaniô, chòc nie je to òbrzészk.",
+       "tooltip-ca-talk": "Diskùsjô zamkłoscë ti starnë",
+       "tooltip-ca-edit": "Edituj nã starnã.",
        "tooltip-ca-addsection": "Zrëszë nowi dzél",
        "tooltip-ca-viewsource": "Na starna je zazychrowónô.\nMòżesz òbaczëc ji zdrój.",
        "tooltip-ca-history": "Stôrszé wersëje ti starnë",
        "tooltip-search": "Szëkba {{SITENAME}}",
        "tooltip-search-go": "Biéj do starnë z akùratno taczim mionã, jeżlë takô je",
        "tooltip-search-fulltext": "Szëkba za wpisónym tesktã na starnach",
-       "tooltip-n-mainpage": "Òbôczë przédną starnã",
+       "tooltip-p-logo": "Òbaczë przédną starnã",
+       "tooltip-n-mainpage": "Òbaczë przédną starnã",
        "tooltip-n-mainpage-description": "Biéj do przédny starnë",
        "tooltip-n-portal": "Ò ti ùdbie, co mòżesz zrobic, co a gdze mòżesz nalezc.",
        "tooltip-n-currentevents": "Dobëjë spódkòwą wëdowiédzã ò slédnych wëdarzeniach",
        "tooltip-t-recentchangeslinked": "Slédné zjinaczi na starnach, do chtërnëch na starna lënkùje",
        "tooltip-feed-rss": "Pòwrózk RSS dlô ti starnë",
        "tooltip-feed-atom": "Pòwrôzk Atom dlô ti starnë",
-       "tooltip-t-contributions": "Wëskrzëni lëstã edicëji negò brëkòwnika",
+       "tooltip-t-contributions": "Wëskrzëni lëstã edicji {{GENDER:$1|negò brëkòwnika|ti brëkòwniczczi}}",
        "tooltip-t-emailuser": "Wëslë e-mail do tegò brëkòwnika",
        "tooltip-t-upload": "Wladëjë lopczi",
        "tooltip-t-specialpages": "Lësta specjalnëch starnów",
        "tooltip-t-permalink": "Prosti lënk do ti wersëji starnë",
        "tooltip-ca-nstab-main": "Wëskrzëni starnã zamkłoscë",
        "tooltip-ca-nstab-user": "Wëskrzëni starnã brëkòwnika",
-       "tooltip-ca-nstab-special": "To je specjlanô starna, chtërny ni mòżesz editowac",
+       "tooltip-ca-nstab-special": "To je specjalnô starna, chtërny ni mòżesz editowac",
        "tooltip-ca-nstab-project": "Òbôczë starnã ùdbë",
        "tooltip-ca-nstab-image": "Wëskrzëni starnã lopka",
        "tooltip-ca-nstab-template": "Wëskrzëni szablónã",
        "othercontribs": "Òpiarté na prôcë $1.",
        "others": "jiné",
        "spamprotectiontitle": "Anti-spamòwi filter",
+       "pageinfo-toolboxlink": "Jinfòrmacje ò ti starnie.",
        "previousdiff": "← Pòprzédnô edicëjô",
        "nextdiff": "Nôslédnô edicëjô →",
        "imagemaxsize": "Ògrańczë na starnie òpisënkù òbrôzków jich miarã do:",
        "file-info-size": "$1 × $2 pikslów, miara lopka: $3, ôrt MIME: $4",
        "file-nohires": "Felëje wikszô miara.",
        "svg-long-desc": "Lopk SVG, nominalno $1 × $2 pikslów, miara lopka: $3",
-       "show-big-image": "Fùl miara",
+       "show-big-image": "Pierwòszny lopk",
        "newimages": "Galerëjô nowich lopków",
        "ilsubmit": "Szëkôj",
        "bydate": "wedle datumù",
        "metadata-help": "Nen lopk zamëkô w se dodôwną wëdowiédzã, prôwdopòdobno dodóné przez cyfrową kamerã abò skaner ùżëti do ùsôdzeniô abò digitalizacëji.\nJeżlë lopk bëł mòdifikòwóny, pòdôwczi mògą bëc w dzéłu nierówné z paramétrama przerôbionegò lopka.",
        "metadata-expand": "Wëskrzëni detale",
        "metadata-collapse": "Zatacë detale",
-       "metadata-fields": "Wëskrzënioné niżi pòla EXIF bãdą widzawné na starnie graficzi.\nJinszé pòla bãdą domëslno zataconé.\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": "Wëskrzënioné niżi pòla metadanëch bãdą widzawné na starnie graficzi.\nJinszé pòla bãdą domëslno zataconé.\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-source": "Zdrój",
        "exif-languagecode": "Jãzëk",
        "exif-iimcategory-spo": "Szpòrt",
        "watchlisttools-raw": "Editëjë sërą lëstã",
        "version": "Wersëjô",
        "specialpages": "Specjalné starnë",
+       "tags-create-reason": "Przëczëna:",
+       "tags-delete-reason": "Przëczëna:",
+       "tags-activate-reason": "Przëczëna:",
+       "tags-deactivate-reason": "Przëczëna:",
+       "logentry-delete-delete": "$1 {{GENDER:$2|rëmnął|rëmnãła}} starnã $3",
        "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ë",
        "special-characters-group-greek": "Grecczi",
index 70fbb4b..9d39994 100644 (file)
@@ -7,7 +7,8 @@
                        "Wolliger Mensch",
                        "ОйЛ",
                        "아라",
-                       "Илья Драконов"
+                       "Илья Драконов",
+                       "Vvs-dm"
                ]
        },
        "tog-oldsig": "нꙑнѣшьн҄ь аѵтографъ :",
        "prefs-resetpass": "таина словєсє иꙁмѣнѥниѥ",
        "saveprefs": "съхранѥниѥ",
        "prefs-editing": "исправлѥниѥ",
-       "rows": "рѧдꙑ :",
        "searchresultshead": "исканиѥ",
        "savedprefs": "твои строи иꙁмѣнєнъ ѥстъ",
        "localtime": "мѣстьно врѣмѧ :",
        "sourcefilename": "источьна дѣла имꙗ :",
        "watchthisupload": "си дѣла блюдєниѥ",
        "upload-dialog-button-cancel": "отъмѣтаниѥ",
+       "upload-form-label-infoform-categories": "Катигории",
        "license": "прощєниѥ :",
        "license-header": "прощєниѥ",
        "imgfile": "дѣло",
index 1ef05f9..455195f 100644 (file)
        "passwordreset-emaildisabled": "Analluogwyd offer e-bost ar y wici hwn.",
        "passwordreset-username": "Eich enw defnyddiwr:",
        "passwordreset-domain": "Parth:",
-       "passwordreset-capture": "Gweld yr e-bost a gaiff ei anfon?",
-       "passwordreset-capture-help": "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
        "passwordreset-email": "Eich cyfeiriad e-bost:",
        "passwordreset-emailtitle": "Manylion eich cyfrif ar {{SITENAME}}",
        "passwordreset-emailtext-ip": "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am ailosod eich cyfrinair ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:\n\n$2\n\nBydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
        "saveprefs": "Cadw",
        "restoreprefs": "Adfer yr holl osodiadau diofyn (ymhob adran)",
        "prefs-editing": "Golygu",
-       "rows": "Rhesi:",
-       "columns": "Colofnau:",
        "searchresultshead": "Chwilio",
        "stub-threshold": "Trothwy ar gyfer fformatio cyswllt egin ($1):",
        "stub-threshold-sample-link": "sampl",
        "userrights-reason": "Rheswm:",
        "userrights-no-interwiki": "Nid yw'r gallu ganddoch i newid galluoedd defnyddwyr ar wicïau eraill.",
        "userrights-nodatabase": "Nid yw'r bas data $1 yn bod neu nid yw'n un lleol.",
-       "userrights-nologin": "Rhaid i chi [[Special:UserLogin|fewngofnodi]] ar gyfrif gweinyddwr er mwyn pennu galluoedd defnyddwyr.",
-       "userrights-notallowed": "Nid oes ganiatâd priodol gennych i ychwanegu neu dynnu hawliau defnyddwyr.",
        "userrights-changeable-col": "Grwpiau y gallwch eu newid",
        "userrights-unchangeable-col": "Grwpiau na allwch eu newid",
        "userrights-conflict": "Gwrthdaro oherwydd newid i hawliau defnyddiwr! Adolygwch eich newidiadau a'u cadarnhau.",
-       "userrights-removed-self": "Rydych wedi rhoi'r gorau i'ch galluoedd. Gan hynny, ni allwch gyrchu'r ddalen hon bellach.",
        "group": "Grŵp:",
        "group-user": "Defnyddwyr",
        "group-autoconfirmed": "Defnyddwyr wedi eu cadarnhau'n awtomatig",
        "right-siteadmin": "Cloi a datgloi'r databas",
        "right-override-export-depth": "Allforio tudalennau gan gynnwys tudalennau cysylltiedig hyd at ddyfnder o 5",
        "right-sendemail": "Anfon e-bost at ddefnyddwyr eraill",
-       "right-passwordreset": "Gweld e-byst sy'n ailosod cyfrinair",
        "right-managechangetags": "Creu a dileu [[Special:Tags|tagiau]] o'r gronfa ddata",
        "grant-group-email": "Danfon ebost",
        "grant-basic": "Hawliau sylfaenol",
        "uploaddisabledtext": "Analluogwyd uwchlwytho ffeiliau ar y wefan hon.",
        "php-uploaddisabledtext": "Anablwyd uwchlwytho ffeiliau yn PHP.\nGwiriwch y gosodiad ar file_uploads.",
        "uploadscripted": "Mae'r ffeil hon yn cynnwys HTML neu sgript a all achosi problemau i borwyr gwe.",
-       "uploadscriptednamespace": "Mae'r ffeil SVG hon yn cynnwys yr enw '$1' sy'n enw annilys ar barth",
+       "uploadscriptednamespace": "Mae'r ffeil SVG hon yn cynnwys yr enw '<nowiki>$1</nowiki>' sy'n enw annilys ar barth",
        "uploadinvalidxml": "Ni ellid dosrannu'r XML yn y ffeil a uwchlwythwyd.",
        "uploadvirus": "Mae firws gan y ffeil hon! Manylion: $1",
        "uploadjava": "Ffeil ZIP yw hwn sy'n cynnwys ffeil Java .class.\nNi chaniateir uwchlwytho ffeiliau Java, oherwydd y gallant osgoi cyfyngiadau diogelwch.",
        "feedback-thanks": "Diolch! Gosodwyd eich adborth ar y dudalen \"[$2 $1]\".",
        "searchsuggest-search": "Chwilio",
        "searchsuggest-containing": "yn cynnwys...",
-       "api-error-badaccess-groups": "Nid oes caniatad gennych i uwchlwytho ffeiliau ar y wici hwn.",
        "api-error-badtoken": "Gwall mewnol: tocyn gwael.",
-       "api-error-copyuploaddisabled": "Nid oes modd uwchlwytho drwy URL ar y gweinydd hwn",
-       "api-error-duplicate": "Mae {{PLURAL:$1||ffeil arall|ffeiliau eraill}} yn bodoli'n barod ar y wefan gyda'r un cynnwys.",
-       "api-error-duplicate-archive": "Fe fu {{PLURAL:$1|ffeil arall gyda'r un cynnwys ynddi|ffeiliau eraill gyda'r un cynnwys ynddynt}} ar y safle, ond fe'{{PLURAL:$1|i|u}} dilëwyd.",
-       "api-error-empty-file": "Mae'r ffeil a gyflwynwyd gennych yn wag.",
        "api-error-emptypage": "Ni chaniateir dechrau tudalen newydd, a honno'n wag.",
-       "api-error-fetchfileerror": "Gwall mewnol: aeth rhywbeth o'i le tra'n cywain y ffeil.",
-       "api-error-fileexists-forbidden": "Mae ffeil o'r enw \"$1\" ar gael yn barod, ac ni ellir ei throsysgrifo.",
-       "api-error-fileexists-shared-forbidden": "Mae ffeil o'r enw \"$1\" eisoes ar gael yn y storfa ffeiliau gyfrannol, ac ni ellir ei throsysgrifo.",
-       "api-error-file-too-large": "Mae'r ffeil a gyflwynwyd gennych yn rhy fawr.",
-       "api-error-filename-tooshort": "Mae enw'r ffeil yn rhy fyr.",
-       "api-error-filetype-banned": "Mae'r math hwn o ffeil wedi ei wahardd.",
-       "api-error-filetype-banned-type": "Ni chaniateir ffeiliau o'r {{PLURAL:$4|math|math|mathau}} $1.  $2 yw'r {{PLURAL:$3|math|math|mathau}} o ffeiliau a ganiateir.",
-       "api-error-filetype-missing": "Mae estyniad yn eisiau ar y ffeil.",
-       "api-error-hookaborted": "Cafodd y darpar newid ei derfynu gan estyniad.",
-       "api-error-http": "Gwall mewnol: ni ellir cysylltu â'r gweinydd.",
-       "api-error-illegal-filename": "Nid yw'r enw ffeil hwn yn cael ei ganiatáu.",
-       "api-error-internal-error": "Gwall mewnol: aeth rhywbeth o'i le wrth brosesu'ch uwchlwythiad ar y wici.",
-       "api-error-invalid-file-key": "Gwall mewnol: nid oedd modd dod o hyd i'r ffeil yn y storfa dros dro.",
-       "api-error-missingparam": "Gwall mewnol: paramedrau yn eisiau ar y cais.",
-       "api-error-missingresult": "Gwall mewnol: ni allem ddarganfod a lwyddodd y gwaith copïo ai pheidio.",
-       "api-error-mustbeloggedin": "Rhaid i chi fewngofnodi er mwyn uwchlwytho ffeiliau.",
-       "api-error-mustbeposted": "Gwall mewnol: mae angen HTTP POST ar y cais hwn.",
-       "api-error-noimageinfo": "Llwyddodd yr uwchlwytho, ond ni roddodd y gweinydd unrhyw wybodaeth i ni am y ffeil.",
-       "api-error-nomodule": "Gwall mewnol: nid oes pecyn uwchlwytho wedi ei osod yn y meddalwedd.",
-       "api-error-ok-but-empty": "Gwall mewnol: dim ymateb gan y gweinydd.",
-       "api-error-overwrite": "Ni chaniateir trosysgrifo ffeil sydd eisoes yn bod.",
-       "api-error-stashfailed": "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
        "api-error-publishfailed": "Gwall mewnol: methodd y gweinydd â chyhoeddi'r ffeil dros dro.",
-       "api-error-stasherror": "Cafwyd gwall wrth uwchlwytho'r ffeil i'w gelcio.",
-       "api-error-stashedfilenotfound": "Methwyd a dod o hyd i'r ffeil a gadwyd pan ymdrechwyd i'w uwchlwytho.",
-       "api-error-stashpathinvalid": "Roedd y llwybr i'r ffeil a gadwyd yn wallus.",
-       "api-error-stashfilestorage": "Cafwyd gwall wrth geisio cadw'r ffeil.",
-       "api-error-stashzerolength": "Methodd ein gweinydda chadw'r ffeil, oherwydd nad oedd yn bodoli.",
-       "api-error-stashnotloggedin": "Mae;n hanfodol eich bod wedi mewngofnodi cyn y medrwch gadw ffeiliau.",
-       "api-error-stashwrongowner": "Nid eich heiddo chi mo'r ffeil y ceisiwch ei drin.",
-       "api-error-stashnosuchfilekey": "Dydy'r ffeil rydych yn ceisio'i gael yn y cuddfan celc ddim yn bodoli.",
-       "api-error-timeout": "Ni chafwyd ymateb gan y gweinydd mewn da bryd.",
-       "api-error-unclassified": "Cafwyd gwall anhysbys",
-       "api-error-unknown-code": "Gwall anhysbys: \"$1\"",
-       "api-error-unknown-error": "Gwall mewnol: aeth rhywbeth o'i le wrth geisio llwytho eich ffeil.",
+       "api-error-stashfailed": "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
        "api-error-unknown-warning": "Rhybudd anhysbys: $1",
        "api-error-unknownerror": "Gwall anhysbys: \"$1\".",
-       "api-error-uploaddisabled": "Analluogwyd uwchlwytho ar y wici hwn.",
-       "api-error-verification-error": "Gallai'r ffeil hon fod wedi ei llygru, neu gall fod estyniad anghywir iddi.",
        "duration-seconds": "$1 {{PLURAL:$1|eiliad}}",
        "duration-minutes": "$1 {{PLURAL:$1|munud|munud|funud|munud|munud|munud}}",
        "duration-hours": "$1 {{PLURAL:$1|awr}}",
index c72b598..e3291ce 100644 (file)
        "tog-newpageshidepatrolled": "Skjul patruljerede sider på listen over nye sider",
        "tog-hidecategorization": "Skjul kategorisering af sider",
        "tog-extendwatchlist": "Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste",
-       "tog-usenewrc": "Gruppér ændringer per side i listen over seneste ændringer og i overvågningslisten",
+       "tog-usenewrc": "Gruppér ændringer efter side i listen over seneste ændringer og i overvågningslisten",
        "tog-numberheadings": "Automatisk nummerering af overskrifter",
        "tog-showtoolbar": "Vis værktøjslinje til redigering",
        "tog-editondblclick": "Redigér sider med dobbeltklik",
        "tog-editsectiononrightclick": "Redigér afsnit ved at højreklikke på deres titler",
-       "tog-watchcreations": "Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
-       "tog-watchdefault": "Tilføj sider og filer, jeg redigerer, til min overvågningsliste",
-       "tog-watchmoves": "Tilføj sider og filer, jeg flytter, til min overvågningsliste",
-       "tog-watchdeletion": "Tilføj sider og filer, jeg sletter, til min overvågningsliste",
-       "tog-watchuploads": "Tilføj nye filer jeg uploader til min overvågningsliste",
-       "tog-watchrollback": "Tilføj sider, hvor jeg har udført en tilbagerulning til min overvågningsliste",
+       "tog-watchcreations": "Føj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
+       "tog-watchdefault": "Føj sider og filer, jeg redigerer, til min overvågningsliste",
+       "tog-watchmoves": "Føj sider og filer, jeg flytter, til min overvågningsliste",
+       "tog-watchdeletion": "Føj sider og filer, jeg sletter, til min overvågningsliste",
+       "tog-watchuploads": "Føj nye filer, jeg uploader, til min overvågningsliste",
+       "tog-watchrollback": "Føj sider, hvor jeg har udført en tilbagerulning, til min overvågningsliste",
        "tog-minordefault": "Markér som standard alle redigeringer som mindre",
        "tog-previewontop": "Vis forhåndsvisning over redigeringsboksen",
        "tog-previewonfirst": "Vis forhåndsvisning ved første redigering",
        "tog-ccmeonemails": "Send mig kopier af e-mails som jeg sender til andre brugere",
        "tog-diffonly": "Vis ikke sideindhold neden under versionssammenligninger",
        "tog-showhiddencats": "Vis skjulte kategorier",
-       "tog-norollbackdiff": "Vis ikke forskel efter tilbagerulning",
+       "tog-norollbackdiff": "Vis ikke forskel efter udførelse af en tilbagerulning",
        "tog-useeditwarning": "Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.",
-       "tog-prefershttps": "Brug altid en sikker forbindelse, når du er logget ind",
+       "tog-prefershttps": "Brug altid en sikker forbindelse, når jeg er logget ind",
        "underline-always": "Altid",
        "underline-never": "Aldrig",
        "underline-default": "Brug browserens indstilling eller standarden for det valgte udseende",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategorier}}",
        "category_header": "Sider i kategorien \"$1\"",
        "subcategories": "Underkategorier",
-       "category-media-header": "Medier i kategorien „$1“",
-       "category-empty": "''Denne kategori indeholder for øjeblikket hverken sider eller medie-filer.''",
+       "category-media-header": "Medier i kategorien \"$1\"",
+       "category-empty": "<em>Denne kategori indeholder for øjeblikket hverken sider eller medie-filer.</em>",
        "hidden-categories": "{{PLURAL:$1|Skjult kategori|Skjulte kategorier}}",
        "hidden-category-category": "Skjulte kategorier",
-       "category-subcat-count": "{{PLURAL:$2|Denne kategori har en underkategori.|Denne kategori indeholder nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}, af i alt $2.}}",
-       "category-subcat-count-limited": "Denne kategori indeholder {{PLURAL:$1|underkategori|$1 underkategorier}}.",
-       "category-article-count": "Denne kategori indeholder {{PLURAL:$2|kun den nedenstående side|{{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}} af i alt $2.}}",
-       "category-article-count-limited": "Kategorien indeholder {{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}}.",
-       "category-file-count": "Denne kategori indeholder {{PLURAL:$2|kun den nedenstående fil.|{{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}} af i alt $2.}}",
-       "category-file-count-limited": "Kategorien indeholder {{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}}.",
+       "category-subcat-count": "{{PLURAL:$2|Denne kategori har kun den nedenstående underkategori.|Denne kategori har nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}, af i alt $2.}}",
+       "category-subcat-count-limited": "Denne kategori har nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}.",
+       "category-article-count": "{{PLURAL:$2|Denne kategori indeholder kun den nedenstående side.|{{PLURAL:$1|Den nedenstående side|De nedenstående $1 sider}} er i denne kategori, ud af i alt $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Den nedenstående side|De nedenstående $1 sider}} er i denne kategori.",
+       "category-file-count": "{{PLURAL:$2|Denne kategori indeholder kun den nedenstående fil.|{{PLURAL:$1|Den nedenstående fil|De nedenstående $1 filer}} er i denne kategori, ud af i alt $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Den nedenstående fil|De nedenstående $1 filer}} er i denne kategori.",
        "listingcontinuesabbrev": "forts.",
        "index-category": "Indekserede sider",
        "noindex-category": "Ikke-indekserede sider",
        "qbfind": "Søg",
        "qbbrowse": "Gennemse",
        "qbedit": "Redigér",
-       "qbpageoptions": "Indstillinger for side",
-       "qbmyoptions": "Mine indstillinger",
+       "qbpageoptions": "Denne side",
+       "qbmyoptions": "Mine sider",
        "faq": "OSS",
        "faqpage": "Project:OSS",
        "actions": "Handlinger",
        "tagline": "Fra {{SITENAME}}",
        "help": "Hjælp",
        "search": "Søg",
-       "search-ignored-headings": " #<!-- lad denne linje være præcis som den er --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du kan tvinge siden til genindeksering ved at lave en nul redigering.\n# syntaksen er som følger:\n#   * Alt fra en tegnet \"#\" til slutningen af linjen er en kommentar\n#   * Hver ikke-tomme linje er den nøjagtige titel der skal ignoreres, der skelnes også mellem store og små bogstaver\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #</pre> <!-- lad denne linje være præcis som den er -->",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du gennemtvinge genindeksering af siden ved at lave en tom redigering.\n# Syntaksen er som følger:\n#   * Alt fra et \"#\"-tegn til slutningen af linjen er en kommentar.\n#   * Hver ikke-tom linje er den nøjagtige titel der skal ignoreres; der skelnes mellem store og små bogstaver.\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #<!-- leave this line exactly as it is --> <pre>",
        "searchbutton": "Søg",
        "go": "Gå til",
        "searcharticle": "Gå til",
        "delete": "Slet",
        "deletethispage": "Slet side",
        "undeletethispage": "Gendan denne side",
-       "undelete_short": "Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}",
-       "viewdeleted_short": "Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}",
+       "undelete_short": "Gendan {{PLURAL:$1|én redigering|$1 redigeringer}}",
+       "viewdeleted_short": "Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "protect": "Beskyt",
        "protect_change": "ændr",
        "protectthispage": "Beskyt side",
        "unprotect": "Ændr beskyttelse",
-       "unprotectthispage": "Ændre beskyttelsen af denne side",
+       "unprotectthispage": "Ændr beskyttelsen af denne side",
        "newpage": "Ny side",
        "talkpage": "Diskussion",
        "talkpagelinktext": "diskussion",
        "tool-link-userrights": "Ændre {{GENDER:$1|bruger}}grupper",
        "tool-link-userrights-readonly": "Se {{GENDER:$1|bruger}}grupper",
        "tool-link-emailuser": "Send e-mail til denne {{GENDER:$1|bruger}}",
-       "userpage": "Se brugersiden",
-       "projectpage": "Se projektsiden",
-       "imagepage": "Se filside",
-       "mediawikipage": "Vise indholdsside",
-       "templatepage": "Vise skabelonside",
-       "viewhelppage": "Vise hjælpeside",
-       "categorypage": "Vise kategoriside",
-       "viewtalkpage": "Se diskussion",
-       "otherlanguages": "Andre sprog",
+       "userpage": "Vis brugerside",
+       "projectpage": "Vis projektside",
+       "imagepage": "Vis filside",
+       "mediawikipage": "Vis indholdsside",
+       "templatepage": "Vis skabelonside",
+       "viewhelppage": "Vis hjælpeside",
+       "categorypage": "Vis kategoriside",
+       "viewtalkpage": "Vis diskussion",
+       "otherlanguages": "På andre sprog",
        "redirectedfrom": "(Omdirigeret fra $1)",
        "redirectpagesub": "Omdirigeringsside",
        "redirectto": "Omdiriger til:",
        "lastmodifiedat": "Denne side blev senest ændret $1 kl. $2.",
-       "viewcount": "Siden er vist {{PLURAL:$1|en gang|$1 gange}}.",
+       "viewcount": "Siden er vist {{PLURAL:$1|én gang|$1 gange}}.",
        "protectedpage": "Beskyttet side",
        "jumpto": "Skift til:",
        "jumptonavigation": "navigering",
        "jumptosearch": "søgning",
-       "view-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent et øjeblik, før du prøver at besøge denne side igen.\n\n$1",
-       "generic-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent et øjeblik før du prøver at besøge denne side igen.",
-       "pool-timeout": "Timeout mens man venter på låsningen",
-       "pool-queuefull": "Pool køen er fuld",
+       "view-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent venligst lidt, før du igen prøver at besøge denne side.\n\n$1",
+       "generic-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent venligst lidt, før du igen prøver at besøge denne side.",
+       "pool-timeout": "Timeout mens der blev ventet på låsen",
+       "pool-queuefull": "Puljekøen er fuld",
        "pool-errorunknown": "Ukendt fejl",
-       "pool-servererror": "Pool-counter servicen er ikke til rådighed ($1).",
+       "pool-servererror": "Puljetæller-tjenesten er ikke til rådighed ($1).",
        "poolcounter-usage-error": "Brugsfejl: $1",
        "aboutsite": "Om {{SITENAME}}",
        "aboutpage": "Project:Om",
        "privacy": "Behandling af personlige oplysninger",
        "privacypage": "Project:Behandling af personlige oplysninger",
        "badaccess": "Manglende rettigheder",
-       "badaccess-group0": "Du har ikke de nødvendige rettigheder til denne handling.",
-       "badaccess-groups": "Denne handling kan kun udføres af brugere som tilhører {{PLURAL:$2|gruppen|en af grupperne:}} $1.",
+       "badaccess-group0": "Du har ikke de nødvendige rettigheder til at udføre den handling, du har anmodet om.",
+       "badaccess-groups": "Denne handling kan kun udføres af brugere i {{PLURAL:$2|gruppen|disse grupper:}} $1.",
        "versionrequired": "Kræver version $1 af MediaWiki",
-       "versionrequiredtext": "Version $1 af MediaWiki er påkrævet, for at bruge denne side. Se [[Special:Version|Versionssiden]]",
+       "versionrequiredtext": "Version $1 af MediaWiki er nødvendig for at bruge denne side. Se [[Special:Version|Versionssiden]]",
        "ok": "OK",
        "retrievedfrom": "Hentet fra \"$1\"",
        "youhavenewmessages": "Du har $1 ($2).",
-       "youhavenewmessagesfromusers": "Du har $1 fra {{PLURAL:$3|en anden bruger| $3 brugere}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Du har}} $1 fra {{PLURAL:$3|en anden bruger|$3 brugere}} ($2).",
        "youhavenewmessagesmanyusers": "Du har $1 fra mange brugere ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|en ny besked|999=nye beskeder}}",
        "newmessagesdifflinkplural": "seneste {{PLURAL:$1|ændring|999=ændringer}}",
        "confirmable-confirm": "Er {{GENDER:$1|du}} sikker?",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nej",
-       "thisisdeleted": "Se eller gendan $1?",
+       "thisisdeleted": "Vis eller gendan $1?",
        "viewdeleted": "Vis $1?",
-       "restorelink": "{{PLURAL:$1|en slettet ændring|$1 slettede ændringer}}",
+       "restorelink": "{{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "feedlinks": "Feed:",
        "feed-invalid": "Ugyldig abonnementstype.",
        "feed-unavailable": "Der er ingen syndikeringsfeeds tilgængelige",
        "site-atom-feed": "$1 Atom-feed",
        "page-rss-feed": "\"$1\" RSS-feed",
        "page-atom-feed": "\"$1\" Atom-feed",
-       "red-link-title": "$1 (siden er ikke skrevet endnu)",
+       "red-link-title": "$1 (siden findes ikke)",
        "sort-descending": "Sorter faldende",
        "sort-ascending": "Sorter stigende",
        "nstab-main": "Side",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Forside",
        "nosuchaction": "Funktionen findes ikke",
-       "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu kan have skrevet URL'en forkert, eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
+       "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu har måske skrevet URL'en forkert eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
-       "nospecialpagetext": "<strong>Du har bedt om en specialside, der ikke kan genkendes af MediaWiki-softwaren.</strong>\nEn liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Du har bedt om en specialside, som ikke findes.</strong>\n\nEn liste over gyldige specialsider kan findes på [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Fejl",
        "databaseerror": "Databasefejl",
-       "databaseerror-text": "Der opstod fejl i en forespørgsel til databasen.\nDette kan indikere en fejl i softwaren.",
-       "databaseerror-textcl": "Der opstod fejl i en forespørgsel til databasen.",
+       "databaseerror-text": "Der opstod en fejl i en forespørgsel til databasen.\nDette kan skyldes en programmeringsfejl i softwaren.",
+       "databaseerror-textcl": "Der opstod en fejl i en forespørgsel til databasen.",
        "databaseerror-query": "Forespørgsel: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fejl: $1",
-       "transaction-duration-limit-exceeded": "For at undgå høje replikationsforsinkelser blev denne transaktion afbrudt fordi tiden det tog at lagre ($1) oversteg maksimumsgrænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
-       "laggedslavemode": "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
-       "readonly": "Databasen er skrivebeskyttet",
-       "enterlockreason": "Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen",
-       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nSystemadministratoren som låste den, gav denne forklaring: $1",
-       "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDen sandsynlige årsag er at du har fulgt et forældet link til en forskel eller en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en software-fejl.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og husk at fortælle hvilken URL du har fulgt.",
+       "transaction-duration-limit-exceeded": "For at undgå høj replikationsforsinkelse blev denne transaktion afbrudt, fordi tiden det tog at lagre ($1) oversteg grænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
+       "laggedslavemode": "<strong>Advarsel:</strong> Siden indeholder muligvis ikke de nyeste ændringer.",
+       "readonly": "Databasen er låst",
+       "enterlockreason": "Skriv en begrundelse for låsningen, inklusive en vurdering af hvornår den vil blive ophævet igen",
+       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nDen systemadministrator, som låste den, gav denne forklaring: $1",
+       "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDette skyldes normalt at du har fulgt et forældet link til en forskel eller til en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en programmeringsfejl i softwaren.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og sørg for at fortælle vedkommende hvilken URL, du har fulgt.",
        "missingarticle-rev": "(versionsnummer: $1)",
-       "missingarticle-diff": "(Forskel: $1, $2)",
-       "readonly_lag": "Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen",
-       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API skrivemodul.",
+       "missingarticle-diff": "(forskel: $1, $2)",
+       "readonly_lag": "Databasen er automatisk blevet låst mens slavedatabaseserverne synkroniserer med masterdatabasen",
+       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API-skrivemodul.",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
-       "internalerror-fatal-exception": "Alvorlig undtagelse af typen \"$1\"",
+       "internalerror-fatal-exception": "Fatal undtagelse af typen \"$1\"",
        "filecopyerror": "Kunne ikke kopiere filen \"$1\" til \"$2\".",
        "filerenameerror": "Kunne ikke omdøbe filen \"$1\" til \"$2\".",
        "filedeleteerror": "Kunne ikke slette filen \"$1\".",
        "directorycreateerror": "Kunne ikke oprette mappen \"$1\".",
-       "directoryreadonlyerror": "Folderen \"$1\" er skrivebeskyttet.",
-       "directorynotreadableerror": "Folderen \"$1\" er ikke læsbar.",
+       "directoryreadonlyerror": "Mappen \"$1\" er skrivebeskyttet.",
+       "directorynotreadableerror": "Mappen \"$1\" er ikke læsbar.",
        "filenotfound": "Kunne ikke finde filen \"$1\".",
        "unexpected": "Uventet værdi: \"$1\"=\"$2\".",
-       "formerror": "Fejl: Kunne ikke afsende formular",
+       "formerror": "Fejl: Kunne ikke afsende formular.",
        "badarticleerror": "Denne funktion kan ikke udføres på denne side.",
        "cannotdelete": "Kunne ikke slette siden eller filen \"$1\".\nDen kan være blevet slettet af en anden.",
        "cannotdelete-title": "Kan ikke slette siden \"$1\"",
-       "delete-hook-aborted": "Sletningen blev afbrudt af en programfunktion.\nDer var ikke nogen forklaring.",
+       "delete-hook-aborted": "Sletningen blev afbrudt af en programfunktion.\nDer blev ikke givet nogen forklaring.",
        "no-null-revision": "Kunne ikke oprette nye tom revision for side \"$1\"",
        "badtitle": "Ugyldig titel",
        "badtitletext": "Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra {{SITENAME}} på et andet sprog.\nDen kan indeholde et eller flere tegn, som ikke må anvendes i titler.",
        "noname": "Du har ikke angivet et gyldigt brugernavn.",
        "loginsuccesstitle": "Logget ind",
        "loginsuccess": "'''Du er nu logget på {{SITENAME}} som \"$1\".'''",
-       "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og bogstaver i brugernavne.\nKontrollér stavemåden, eller [[Special:CreateAccount|opret en ny konto]].",
+       "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og små bogstaver i brugernavne.\nKontrollér stavningen, eller [[Special:CreateAccount|opret en ny konto]].",
        "nosuchusershort": "Der er ingen bruger ved navn \"$1\". Tjek din stavning.",
        "nouserspecified": "Angiv venligst et brugernavn.",
        "login-userblocked": "Denne bruger er blokeret. Det er ikke tilladt at logge på.",
        "noemail": "Der er ikke oplyst en e-mailadresse for bruger \"$1\".",
        "noemailcreate": "Du skal angive en gyldig e-mailadresse",
        "passwordsent": "En ny adgangskode er sendt til e-mailadressen, som er registreret for \"$1\".\nDu bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.",
-       "blocked-mailpassword": "Din IP-adresse er blokeret fra at redigere sider. For at forhindre misbrug, er det heller ikke muligt, at bestille en ny adgangskode.",
+       "blocked-mailpassword": "Din IP-adresse er blokeret fra at redigere sider. For at forhindre misbrug er det heller ikke muligt at bestille en ny adgangskode fra denne IP-adresse.",
        "eauthentsent": "En e-mailbekræftelse er sendt til den angivne e-mailadresse.\n\nFør flere e-mails bliver sendt til kontoen, skal du følge instruktionerne i e-mailen, for at bekræfte at kontoen rent faktisk er din.",
        "throttled-mailpassword": "Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt en ny adgangskode. For at forhindre misbrug af funktionen, kan der kun bestilles en ny adgangskode én gang for hver {{PLURAL:$1|time|$1 timer}}.",
        "mailerror": "Fejl ved afsendelse af e-mail: $1",
-       "acct_creation_throttle_hit": "Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.\nDerfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.",
+       "acct_creation_throttle_hit": "Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|1 konto|$1 kontoer}} inden for den/det/de seneste $2, hvilket er det maksimalt tilladte inden for denne tidsperiode.\nDerfor kan besøgende, som bruger denne IP-adresse, ikke oprette flere kontoer fra denne IP-adresse for øjeblikket.",
        "emailauthenticated": "Din e-mailadresse blev bekræftet den $2 kl. $3.",
        "emailnotauthenticated": "Din e-mailadresse er endnu ikke bekræftet.\nIngen e-mail vil blive sendt for de følgende funktioner.",
        "noemailprefs": "Angiv en e-mailadresse, så følgende funktioner er til rådighed.",
        "createaccount-title": "Opret brugerkonto på {{SITENAME}}",
        "createaccount-text": "Nogen har oprettet en konto for din e-mailadresse på {{SITENAME}} ($4) med navnet \"$2\". Adgangskoden er \"$3\".\nDu opfordres til at logge på og ændre adgangskoden med det samme.\n\nDu kan ignorere denne besked hvis kontoen blev oprettet ved en fejl.",
        "login-throttled": "Du har forsøgt at logge på for mange gange.\nVent venligst $1, før du prøver igen.",
-       "login-abort-generic": "Det lykkedes dig ikke at logge på - afbrudt",
+       "login-abort-generic": "Det lykkedes ikke at logge dig på - Afbrudt",
        "login-migrated-generic": "Din konto er blevet globaliseret, og dit brugernavn eksisterer ikke længere på denne wiki.",
        "loginlanguagelabel": "Sprog: $1",
        "suspicious-userlogout": "Din anmodning om at logge af blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.",
        "newpassword": "Ny adgangskode:",
        "retypenew": "Gentag ny adgangskode:",
        "resetpass_submit": "Gem adgangskode og log på",
-       "changepassword-success": "Din adgangskode er nu ændret!",
+       "changepassword-success": "Din adgangskode er blevet ændret!",
        "changepassword-throttled": "Du har forsøgt at logge på for mange gange for nylig.\nVent venligst $1, før du prøver igen.",
        "botpasswords": "Bot adgangskoder",
        "botpasswords-summary": "<em>Bot adgangskoder</em> giver adgang til en brugerkonto via API'en, uden at bruge kontoens normale login-legitimationsoplysninger. Brugerrettighederne kan være begrænset, når du er logget på med et bot password,.\n\nHvis du ikke ved, hvorfor du måske ønsker at gøre dette, bør du nok ikke gøre det. Ingen bør nogensinde bede dig om at generere et af disse, og give det til dem.",
        "resetpass-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "resetpass-submit-loggedin": "Skift adgangskode",
        "resetpass-submit-cancel": "Annuller",
-       "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.",
+       "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede ændret din adgangskode eller bedt om en ny midlertidig kode.",
        "resetpass-recycled": "Vær venlig at ændre din adgangskode til noget andet end din nuværende adgangskode.",
        "resetpass-temp-emailed": "Du loggede på med en midlertidig kode tilsendt på e-mail.\nFor at afslutte indlogning skal du angive en ny adgangskode her:",
        "resetpass-temp-password": "Midlertidig adgangskode",
        "selfredirect": "<strong>Advarsel:</strong> Du er ved at omdirigere denne side til sig selv.\nDu kan have angivet det forkerte mål for omdirigeringen, eller du kan være ved at redigere den forkerte side.\nHvis du klikker på \"{{int:savearticle}}\" igen, vil omdirigeringen blive oprettet uanset dette.",
        "missingcommenttext": "Skriv venligst en kommentar nedenfor.",
        "missingcommentheader": "<strong>Bemærk:</strong> Du har ikke angivet en overskrift/emne for denne kommentar. Hvis du trykker \"{{int:savearticle}}\" én gang til, gemmes dine ændringer uden overskrift/emne.",
-       "summary-preview": "Forhåndsvisning af beskrivelsen:",
+       "summary-preview": "Forhåndsvisning af sammenfatning:",
        "subject-preview": "Forhåndsvisning af emne/overskrift:",
        "previewerrortext": "Der opstod en fejl under forsøget på at lave en forhåndsvisning af dine ændringer.",
        "blockedtitle": "Du eller din IP-adresse er blokeret",
        "invalid-content-data": "Ugyldig indholdsdata",
        "content-not-allowed-here": "\"$1\" indhold er ikke tilladt på siden [[$2]]",
        "editwarning-warning": "Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.\nDenne advarsel kan slås fra under \"{{int:prefs-editing}}\" i dine indstillinger.",
+       "editpage-invalidcontentmodel-title": "Indholdsmodellen er ikke understøttet",
        "editpage-notsupportedcontentformat-title": "Indholdsformatet understøttes ikke",
        "editpage-notsupportedcontentformat-text": "Indholdsformatet $1 understøttes ikke af indholdsmodellen $2",
        "content-model-wikitext": "wikitekst",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tomt array",
+       "deprecated-self-close-category": "Sider, der bruger ugyldige, selvlukkende HTML-tags",
        "duplicate-args-category": "Sider der bruger samme argument mere end en gang i en skabelon",
        "duplicate-args-category-desc": "Siden indeholder en skabelon hvor et argument er brugt mere end en gang, som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Der er for mange beregningstunge oversætter-funktionskald på denne side.\n\nDer bør være færre end {{PLURAL:$2|$2 kald}}, lige nu er der {{PLURAL:$1|$1 kald}}.",
        "revdelete-unsuppress": "Ophæv begrænsninger for gendannede versioner",
        "revdelete-log": "Begrundelse:",
        "revdelete-submit": "Udfør på {{PLURAL:$1|den udvalgte version|de udvalgte versioner}}",
-       "revdelete-success": "'''Versionsvisningen er ændret.'''",
+       "revdelete-success": "Versionssynligheden blev opdateret.",
        "revdelete-failure": "'''Kunne ikke ændre versionssynligheden:'''\n$1",
-       "logdelete-success": "'''Synlighed ændret med success.'''",
+       "logdelete-success": "Log-synligheden blev ændret.",
        "logdelete-failure": "'''Kunne ikke ændre logsynligheden.'''\n$1",
        "revdel-restore": "ændre synlighed",
        "pagehist": "Sidehistorik",
        "search-interwiki-caption": "Søsterprojekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mere)",
+       "search-interwiki-more-results": "flere resultater",
        "search-relatedarticle": "Relateret",
        "searchrelated": "relateret",
        "searchall": "alle",
        "youremail": "Din e-mailadresse:",
        "username": "{{GENDER:$1|Brugernavn}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} af {{PLURAL:$1|gruppen|grupperne}}:",
+       "group-membership-link-with-expiry": "$1 (indtil $2)",
        "prefs-registration": "Registreringstidspunkt:",
        "yourrealname": "Dit rigtige navn:",
        "yourlanguage": "Sprog:",
        "userrights-user-editname": "Skriv et brugernavn:",
        "editusergroup": "Indlæs brugergrupper",
        "editinguser": "Ændrer brugerrettigheder for {{GENDER:$1|brugeren}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Redigér brugergrupper",
+       "userrights-editusergroup": "Redigér {{GENDER:$1|brugergrupper}}",
        "saveusergroups": "Gem {{GENDER:$1|brugergrupper}}",
        "userrights-groupsmember": "Medlem af:",
        "userrights-groupsmember-auto": "Implicit medlem af:",
        "userrights-nodatabase": "Databasen $1 eksisterer ikke lokalt.",
        "userrights-changeable-col": "Redigerbare grupper",
        "userrights-unchangeable-col": "Uredigerbare grupper",
+       "userrights-expiry-current": "Udløber $1",
+       "userrights-expiry-none": "Udløber ikke",
        "userrights-conflict": "Konflikt i ændringer af brugerrettigheder!\nVær venlig at gennemse og bekræft dine ændringer.",
        "group": "Gruppe:",
        "group-user": "Brugere",
        "uploaddisabledtext": "Oplægning af filer er deaktiveret.",
        "php-uploaddisabledtext": "Oplægning af filer er forhindret i PHP. Tjek indstillingen for file_uploads.",
        "uploadscripted": "Denne fil indeholder HTML eller script-kode, der i visse tilfælde can fejlfortolkes af en browser.",
-       "uploadscriptednamespace": "Denne SVG-fil indeholder et ulovligt navnerum \"$1\"",
+       "uploadscriptednamespace": "Denne SVG-fil indeholder et ulovligt navnerum \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML i den uploadede fil kunne ikke tolkes.",
        "uploadvirus": "Denne fil indeholder en virus! Virusnavn: $1",
        "uploadjava": "Denne fil er en ZIP-fil, der indeholder en Java .class-fil.\nDet er ikke tilladt at uploade Javafiler, da det kan forårsage, at sikkerhedsrestriktioner bliver sprunget over.",
        "booksources-search": "Søg",
        "booksources-text": "Dette er en liste med henvisninger til Internetsider, som sælger nye og brugte bøger. Der kan der også findes yderligere informationer om bøgerne. {{SITENAME}} er ikke forbundet med nogen af dem.",
        "booksources-invalid-isbn": "Det angivne ISBN-nummer ser forkert ud. Tjek med kilden om det er skrevet korrekt.",
+       "magiclink-tracking-rfc": "Sider, der bruger automatiske RFC-henvisninger‎",
+       "magiclink-tracking-pmid": "Sider, der bruger automatiske PMID-henvisninger‎",
        "magiclink-tracking-isbn": "Sider, der bruger automatiske ISBN-henvisninger",
        "specialloguserlabel": "Udført af:",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:brugernavn for bruger):",
        "modifiedarticleprotection": "ændrede beskyttelsen af \"[[$1]]\"",
        "unprotectedarticle": "fjernede beskyttelse af \"[[$1]]\"",
        "movedarticleprotection": "flyttede beskyttelsesindstillinger fra \"[[$2]]\" til \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|beskyttede}} \"[[$1]]\"",
        "protect-title": "Ændre beskyttelse af \"$1\"",
        "protect-title-notallowed": "Få vist beskyttelsesniveauet af \"$1\"",
        "prot_1movedto2": "$1 flyttet til $2",
        "exif-compression-6": "JPEG (gammel)",
        "exif-copyrighted-true": "Ophavsretligt beskyttet",
        "exif-copyrighted-false": "Status for ophavsret er ikke angivet",
+       "exif-photometricinterpretation-1": "Sort-hvid (sort er 0)",
        "exif-unknowndate": "Ukendt dato",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Horisontalt spejlet",
        "logentry-upload-revert": "$1 {{GENDER:$2|lagde}} $3 op",
        "rightsnone": "(-)",
        "revdelete-summary": "redigeringsbeskrivelse",
+       "rightslogentry-temporary-group": "$1 (midlertidig, indtil $2)",
        "feedback-adding": "Tilføjer kommentar til side...",
        "feedback-back": "Tilbage",
        "feedback-bugcheck": "Skønt! Men tjek venligst, at det ikke er en af de [$1 kendte fejl].",
index a5546df..c7131ae 100644 (file)
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da das Inhaltsmodell <code>$1</code> vom aktuellen Inhaltsmodell der Seite <code>$2</code> abweicht.",
        "recreate-moveddeleted-warn": "<strong>Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.</strong>\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
-       "moveddeleted-notice": "Diese Seite wurde gelöscht. Zur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
-       "moveddeleted-notice-recent": "Leider wurde diese Seite kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information wird das Lösch- und Verschiebungs-Logbuch für die Seite unten angezeigt.",
+       "moveddeleted-notice": "Diese Seite wurde gelöscht.\nZur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
+       "moveddeleted-notice-recent": "Diese Seite wurde kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
        "log-fulllog": "Alle Logbucheinträge ansehen",
        "edit-hook-aborted": "Die Bearbeitung wurde ohne Erklärung durch eine Schnittstelle abgebrochen.",
        "edit-gone-missing": "Die Seite konnte nicht aktualisiert werden.\nSie wurde anscheinend gelöscht.",
        "search-interwiki-caption": "Schwesterprojekte",
        "search-interwiki-default": "Ergebnisse von $1:",
        "search-interwiki-more": "(weitere)",
+       "search-interwiki-more-results": "Weitere Ergebnisse",
        "search-relatedarticle": "Verwandte",
        "searchrelated": "verwandt",
        "searchall": "alle",
        "editusergroup": "Benutzergruppen laden",
        "editinguser": "Ändere Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Benutzer-Gruppenzugehörigkeit bearbeiten",
-       "userrights-viewusergroup": "Benutzergruppen ansehen",
+       "userrights-editusergroup": "Gruppenzugehörigkeit {{GENDER:$1|des Benutzers|der Benutzerin}} bearbeiten",
+       "userrights-viewusergroup": "{{GENDER:$1|Benutzergruppen}} ansehen",
        "saveusergroups": "{{GENDER:$1|Gruppenzugehörigkeit}} ändern",
        "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 nichtmarkiertes 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).",
+       "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-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-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-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
+       "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
+       "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
        "rcfilters-filterlist-noresults": "Keine Filter gefunden",
        "rcfilters-filtergroup-registration": "Benutzerregistrierung",
        "rcfilters-filter-registered-label": "Angemeldet",
        "uploaded-setting-handler-svg": "SVG, das das Attribut „handler“ mit Remote/Daten/Skript festlegt, ist gesperrt. <code>$1=\"$2\"</code> in der hochgeladenen SVG-Datei gefunden.",
        "uploaded-remote-url-svg": "SVG, das ein beliebiges Style-Attribut mit einer Remote-URL festlegt, ist gesperrt. <code>$1=\"$2\"</code> in der hochgeladenen SVG-Datei gefunden.",
        "uploaded-image-filter-svg": "Bildfilter mit der URL <code>&lt;$1 $2=\"$3\"&gt;</code> in der hochgeladenen SVG-Datei gefunden.",
-       "uploadscriptednamespace": "Diese SVG-Datei enthält den ungültigen Namensraum „$1“.",
+       "uploadscriptednamespace": "Diese SVG-Datei enthält den ungültigen Namensraum „<nowiki>$1</nowiki>“.",
        "uploadinvalidxml": "Das XML in der hochgeladenen Datei konnte nicht geparst werden.",
        "uploadvirus": "Diese Datei enthält einen Virus! Details: $1",
        "uploadjava": "Dies ist eine ZIP-Datei, die ein CLASS-Datei von Java enthält.\nDas Hochladen von Java-Dateien ist nicht gestattet, da sie die Umgehung von Sicherheitseinschränkungen ermöglichen könnten.",
        "rollback-missingparam": "In der Anfrage fehlen erforderliche Parameter.",
        "rollback-missingrevision": "Die Versionsdaten konnten nicht geladen werden.",
        "cantrollback": "Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.",
-       "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da bereits ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
-       "rollback-success": "Die Änderungen von $1 wurden rückgängig gemacht und die letzte Version von $2 wurde wiederhergestellt.",
+       "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
        "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.",
        "tooltip-whatlinkshere-invert": "Markiere dieses Kontrollkästchen, um Links von Seiten innerhalb des ausgewählten Namensraums auszublenden.",
        "namespace_association": "Zugehöriger Namensraum",
        "tooltip-namespace_association": "Dieses Auswahlfeld anklicken, um den deiner Auswahl zugehörigen Diskussionsnamensraum, oder im umgekehrten Fall, den zugehörigen Namensraum, mit einzubeziehen",
-       "blanknamespace": "(Seiten)",
+       "blanknamespace": "(Artikel)",
        "contributions": "{{GENDER:$1|Benutzerbeiträge}}",
        "contributions-title": "Benutzerbeiträge von „$1“",
        "mycontris": "Beiträge",
        "pageinfo-few-visiting-watchers": "Es könnte einen beobachtenden Benutzer geben oder nicht, der die letzten Bearbeitungen besucht hat",
        "pageinfo-redirects-name": "Anzahl der Weiterleitungen zu dieser Seite",
        "pageinfo-redirects-value": "$1",
-       "pageinfo-subpages-name": "Unterseiten dieser Seite",
+       "pageinfo-subpages-name": "Anzahl der Unterseiten dieser Seite",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|Weiterleitung|Weiterleitungen}}; $3 {{PLURAL:$3|Unterseite|Unterseiten}})",
        "pageinfo-firstuser": "Seitenersteller",
        "pageinfo-firsttime": "Datum der Seitenerstellung",
        "mediastatistics-summary": "Statistiken über hochgeladene Dateitypen. Dies beinhaltet nur die aktuellste Version einer Datei. Alte oder gelöschte Dateiversionen sind ausgeschlossen.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3 %)",
-       "mediastatistics-bytespertype": "Gesamte Dateigröße für diesen Abschnitt: {{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3%).",
+       "mediastatistics-bytespertype": "Gesamte Dateigröße für diesen Abschnitt: {{PLURAL:$1|Ein Byte|$1 Bytes}} ($2; $3 %).",
        "mediastatistics-allbytes": "Gesamte Dateigröße für alle Dateien: {{PLURAL:$1|Ein Byte|$1 Bytes}} ($2).",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Mögliche Erweiterungen",
        "mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
        "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Eine Kategorie hinzufügen …",
+       "mw-widgets-usersmultiselect-placeholder": "Weitere hinzufügen …",
        "sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
        "sessionprovider-generic": "$1-Sitzungen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen",
index ba509d0..d8918e4 100644 (file)
                        "Velg",
                        "1917 Ekim Devrimi",
                        "Gambollar",
-                       "Dılmıc"
+                       "Dılmıc",
+                       "Archaeodontosaurus"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
-       "tog-hideminor": "Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne",
+       "tog-hideminor": "Vırnayışanê peyênan ra vırnayışanê werdiyan bınımne",
        "tog-hidepatrolled": "Vurnayışanê qontrol kerdeyan perra vurnayışê peyêni de bınımne",
        "tog-newpageshidepatrolled": "Pelanê qontrol kerdeyan lista peranê  neweyan de bınımne",
        "tog-hidecategorization": "Pera kategorizasyoni bınımne",
        "listingcontinuesabbrev": "dewam...",
        "index-category": "Perrê rêzıni",
        "noindex-category": "Perrê bêrêzıni",
-       "broken-file-category": "Perrê  ke gıreyê dosyeyanê ğeletan muhtewa kenê",
+       "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa",
        "article": "Wesiqe",
        "newwindow": "(Teqaya newi de abena)",
-       "cancel": "Bıtexelne",
+       "cancel": "Annuler",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
        "mypage": "Per",
        "searcharticle": "Şo",
        "history": "Tarixê perrer",
        "history_short": "Veror",
+       "history_small": "tarix",
        "updatedmarker": "cı kewtena mına peyêne ra dıme biyo rocane",
        "printableversion": "Versiyonê çapkerdışi",
        "permalink": "Gıreyo vınderde",
        "delete": "Bestern",
        "deletethispage": "Na perrer bestern",
        "undeletethispage": "Na perer mebesterne",
-       "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
+       "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",
-       "protectthispage": "Ena perer bıpawe",
+       "protectthispage": "Ena perre şeveknê",
        "unprotect": "Starnayışi bıvurne",
-       "unprotectthispage": "Starnayışê ena perer bıvurne",
+       "unprotectthispage": "Şeveknayışê ena perre bıvırne",
        "newpage": "Perra newi",
        "talkpage": "Na per dı vatan kew",
        "talkpagelinktext": "Mesac",
        "mainpage": "Perra Seri",
        "mainpage-description": "Perra seri",
        "policy-url": "Project:Terzê hereketi",
-       "portal": "Portalê cemaeti",
-       "portal-url": "Project:Portalê cemaeti",
+       "portal": "Portalê cemati",
+       "portal-url": "Project:Portalê cemati",
        "privacy": "Politikay nımıtışi",
        "privacypage": "Project:Xısusiyetê nımıtışi",
        "badaccess": "Xeta mısadey",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "\"$1\" ra ard",
-       "youhavenewmessages": "To rê $1 esto ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|şıma}} rê $1 esto ($2).",
        "youhavenewmessagesfromusers": "Zey $1 ra {{PLURAL:$3|zewbi karber|$3 karberi}} ($2) esto.",
        "youhavenewmessagesmanyusers": "$1 ra tay karberi ($2) dı estê.",
        "newmessageslinkplural": "{{PLURAL:$1|yew mesaco newe|999=mesacê newey}}",
        "badtitle": "Sernameyo xırabın",
        "badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
        "title-invalid-empty": "Waziyaye sernamey perrer  venonyana teyna canamey nami sero esto.",
+       "title-invalid-utf8": "Sernamey perre ke şıma wazenê, yew rêza UTF-8iya ke nêvêrene xo sero kırışeno.",
        "perfcached": "Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de",
        "perfcachedts": "Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de",
        "querypage-no-updates": "Rocanebiyayışê na pele nıka cadayiyê.\nDayiyi tiya nıka newe nêbenê.",
        "viewsourcetext": "To şikinay çımey na pele bıvêne 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 hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.\nVurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.\nSeba çarnayışi, yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
+       "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",
        "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.",
        "resetpass-temp-password": "parolayo muweqet:",
        "resetpass-abort-generic": "Vurnayışê parola terefê yew niçıki ra texeliya.",
        "resetpass-expired": "Dema parolay da şıma qedya ya. Qandê cıkewtışi u patolaya newi vıraz",
-       "resetpass-expired-soft": "Wahdey patolanda şıma qedya yo u vurnayış icab keno. Xorê yu parola weçinê yana bahdo weçinayışi rê butona \"{{int:authprovider-resetpass-skip-label}}\" 'i bıploğnê",
+       "resetpass-expired-soft": "Şifrey şıma nêvêreno u ganê ke reyna bıvıraziyo. Reca ma aya ke şıma xo rê şifreyê do newe weçinê, ya zi şıma \"{{int:authprovider-resetpass-skip-label}}\" bıtıknê ke dıma yew şifreyo newe vırazê.",
        "resetpass-validity-soft": "Parolay şıma ravêrdi niya: $1\n\nXorê yu parola nışan bıkerê  uana bahdo sıfır kerdışi rê grey \"{{int:authprovider-resetpass-skip-label}}\" bıploğnê.",
        "passwordreset": "Parola reset ke",
        "passwordreset-text-one": "Na form de parola reset kerdış temamiye",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu:",
-       "minoredit": "No yew vurnayışo werdiyo",
-       "watchthis": "Bewni ena per",
+       "minoredit": "No yew vırnayışo werdiyo",
+       "watchthis": "Şıma bewnê ena perre",
        "savearticle": "Perre qeyd ke",
        "savechanges": "Vırnayışan qeyd ke",
        "publishpage": "Perer bıhesırne",
        "missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
        "missingcommenttext": "Cêr de jû fıkır bınusên, şıma rê zehmet.",
        "missingcommentheader": "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.\nEke şıma reyna \"{{int:savearticle}}\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
-       "summary-preview": "Verqaytê xulasa:",
+       "summary-preview": "Verasayışê xulasa:",
        "subject-preview": "Verqaytê mewzu:",
-       "previewerrortext": "Verqaytê vurnayış de şıma dı xırabin amê meydan",
+       "previewerrortext": "Verasayışê vırnayışê şıma de yew xeta veciya miyan.",
        "blockedtitle": "Karber blokekerdeo",
        "blockedtext": "<strong>No nameyê karberi ya zi na adresa IP blokekerdeya.</strong>\n\nVıraştoğê blokeyi: $1\nSebebê blokeyi: <em>$2</em>.\n\n* Sıftekerdena blokeyi: $8\n* Qediyayışê blokeyi: $6\n* Blokebiyaye: $7\n\nŞıma şenê  $1 de ya zi  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. \nŞıma nêşenê xısusiyetê \"karberi rê e-posta bırışe\" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de yew e-posteyo ke vêreno, beli bi û şıma gureynayışê cı ra mehrum nêbiyê.\nIP adresa şımaya nıkayêne $3o û numreyê bloki #$5.\nŞıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.",
        "autoblockedtext": "IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.\nSebebê cı zi:\n\n:''$2''\n\n* Dest pê kerdışê verni grotışi: $8\n* Qedyayişê verni grotışi: $6\n* Qayile ke bloqe bıbo: $7\n\nŞıma qayile qey weri kewtışê na mesela,  $1 ya na [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yewi ra şenê irtibat kewê.\n\nNot, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt se şıma nêşenê na xususiyet ra \"karber rê e-posta bırışê\" istifade bıkeri.\n\nIP adresiya şıma yo nıkayên $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corênan xo vira mekerê.",
        "yourtext": "nuşteyê şıma",
        "storedversion": "Nuşteyo qaydbiyaye",
        "nonunicodebrowser": "'''DİQET: Browserê şıma u unicode yewbini nêgeni. Qey izin dayişê vurnayişê pelan: Karakteri ke ASCII niyê; zerreyê qutiyê vurnayişi de kodi (cod) şiyes-şiyes aseni.'''",
-       "editingold": "'''İkaz: Şımayé rewizyon da kehan da perer d vırnayış kené.'''\nVanése qeyd k,lakin rewziyoné veréni dé vınibé.",
+       "editingold": "'''İqaz: Şıma ena perre sera yew çım ra viyarnayışê kıhani vırnenê.'''\nEger şıma ey qeyd kerê, pêro vırnayışê ke çım ra viyarnayış ra heta ewro biy, ê benê vıni.",
        "yourdiff": "pêverronayiş",
        "copyrightwarning": "'''Recay iqazi:'''Sitey {{SITENAME}} ra iştıraki pêro umışiya $2 zerre deyo (teferuatan rê $1 bıvênê).\n\nİştırakê şıma, şıma qayıl niyê ke yewna merdımi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştırakiştıraq = iştırak. mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
        "sectioneditnotsupported-title": "Destekê vurnayışiê qısımi çıniyo",
        "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 icazeyê şıma çin o:",
+       "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:",
        "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "edit-no-change": "Vırnayışê şıma qebul nêbı, çunke nuşte de yew vırnayış nêvıraziyo.",
        "postedit-confirmation-created": "Pele vıraziye.",
        "postedit-confirmation-restored": "Pele anciya vıraziye.",
-       "postedit-confirmation-saved": "Vurnayışê to qeyd biyo.",
+       "postedit-confirmation-saved": "Vırnayışê şıma qeyd bi.",
        "edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
        "defaultmessagetext": "Metnê mesacê hesabiyayey",
        "content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
        "node-count-exceeded-category": "Pela ra hetê kotya amardışê cı ravêrya",
        "node-count-exceeded-category-desc": "Pela azami amora gozgıray ravêr  da.",
        "node-count-exceeded-warning": "Pela amora gozgıra ravêr da",
-       "expansion-depth-exceeded-category": "Pela dı hetê canaya zoriya herayin ravêrya",
+       "expansion-depth-exceeded-category": "Perrê ke xoriyiya herabiyayışi tede ravêrdeya.",
        "expansion-depth-exceeded-warning": "Ravêriya pela xori herayêna",
        "parser-unstrip-loop-warning": "Unstrip lete vineya",
        "parser-unstrip-recursion-limit": "Sinorê limit dê qayış dê ($1) ravêrya",
        "viewpagelogs": "Qeydanê na perrer bımotne",
        "nohistory": "Verorê vurnayışanê na perer çıni yo.",
        "currentrev": "Çımraviyarnayışo rocane",
-       "currentrev-asof": "$1 ra tepya mewcud weziyeta pela",
+       "currentrev-asof": "$1 ra tepeya çım ra viyarnayışê cı'yo peyên",
        "revisionasof": "Çımraviyarnayışê $1",
        "revision-info": "Vurnayışo ke $1 de terefê {{GENDER:$6|$2}}$7 ra biyo",
        "previousrevision": "← Çımraviyarnayışo kıhanêr",
-       "nextrevision": "Rewizyono newên →",
+       "nextrevision": "Çımraviyarnayışo neweyêr →",
        "currentrevisionlink": "Tewr halê peyn",
        "cur": "ferq",
        "next": "bahdoyên",
        "last": "peyên",
        "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> = vurnayışo werdi yo.",
+       "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-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "rev-deleted-user-contribs": "[nameyê karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
        "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": "Çımra viyarnayışê ena pele '''besterêno'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımra viyarnayışi bıvinê], eke wazenê dewam kerê.",
+       "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-deleted-text-view": "Çımra viyarnayışê ena pele '''besternêno'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.",
+       "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.",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bıviné",
        "searchmenu-exists": "''Ena 'Wikipediya de ser \"[[:$1]]\" yew pel esto'''",
        "searchmenu-new": "<strong>Na wiki de pela \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi neticanê cıgeyrayışê xo bıvênê.}}",
-       "searchprofile-articles": "Pelê zerreki",
+       "searchprofile-articles": "Perrê zerreki",
        "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Pêro çi",
        "searchprofile-advanced": "Herayen",
        "search-suggest": "To va: $1",
        "search-rewritten": "Neticey $1 ra asenê. Herunda ney wa neticanë $2'i bıvin",
        "search-interwiki-caption": "Proceyê bıray",
-       "search-interwiki-default": "$1 ra neticey:",
+       "search-interwiki-default": "$1 ra peyniy:",
        "search-interwiki-more": "(véşi)",
        "search-relatedarticle": "Eleqeyın",
        "searchrelated": "eleqeyın",
        "search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
        "preferences": "Tercihi",
        "mypreferences": "Tercihi",
-       "prefs-edits": "Amarê vurnayışan:",
+       "prefs-edits": "Amarê vırnayışan:",
        "prefsnologintext2": "Kerem ke, seba vurnayışê tercihanê xo cı kewe.",
        "prefs-skin": "Çerme",
        "skin-preview": "Verqayt",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pelê karberi",
        "prefs-personal": "Profilê karberi",
-       "prefs-rc": "Vurnayışê peyêni",
+       "prefs-rc": "Vırnayışê peyêni",
        "prefs-watchlist": "Lista Teqibi",
        "prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
        "prefs-editwatchlist-label": "Listey serkerdışanê cıkewtışi timar kerê",
        "prefs-rendering": "Asayış",
        "saveprefs": "Qeyd ke",
        "restoreprefs": "Sazanê hesıbyaya pêron newe ke",
-       "prefs-editing": "Vurnayış",
+       "prefs-editing": "Vırnayış",
        "searchresultshead": "Cı geyre",
        "stub-threshold": "Qandé Taslağ  formati  sinor:$1",
        "stub-threshold-sample-link": "misal",
        "stub-threshold-disabled": "Astengın",
        "recentchangesdays": "Rocê ke vurnayışanê peyênan de bıasê:",
        "recentchangesdays-max": "Tewr zaf $1 {{PLURAL:$1|roc|roci}}",
-       "recentchangescount": "Amarê vurnayışê ke hesıbyaye deye bımocneyê:",
+       "recentchangescount": "Halê est-amardışi ra mocnayışi rê amarê vırnayışan:",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
        "savedprefs": "Tecihê şıma qeyd biy.",
        "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
        "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
-       "right-edit": "Pele bıvurne",
-       "right-createpage": "Pele vıraze (pelê ke ê werênayışi niyê)",
+       "right-edit": "Perre bıvırnê",
+       "right-createpage": "Perran vıraze (peprrê ke ê werênayışi niyê)",
        "right-createtalk": "Pela werênayışi vıraze",
        "right-createaccount": "Hesabê karberi vıraze",
        "right-autocreateaccount": "Xarici yew name dê karberi ya ronıştış ake",
-       "right-minoredit": "Vurnayışan qıckek nışan bıde.",
+       "right-minoredit": "Vırnayışan zey werdi nışan bıde.",
        "right-move": "Pele bere",
        "right-move-subpages": "Pele be bınpelanê cı ra pia bere",
        "right-move-rootuserpages": "Pelanê kaberiê rıstımi bere",
        "right-deletedtext": "Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke",
        "right-browsearchive": "Pelanê esterıteyan bıgeyre",
        "right-undelete": "Yew pela esterıtiye peyser biya",
-       "right-suppressrevision": "İdarekeran ra miyanki, newede vurnayışan de qayt ke u newede vıraze",
+       "right-suppressrevision": "Yew karber ra çım ra viyarnayışanê perran bıvênê, bınımnê u bımocnê.",
        "right-viewsuppressed": "İdarekeran ra miyanki newede vurnayışan de qayt ke",
        "right-suppressionlog": "Rocekanê xasan bıvêne",
        "right-block": "Karberanê binan karê vurnayışi ra bloke bıke",
        "grant-editprotected": "Srar bıyaye peran bıvurnê",
        "grant-highvolume": "Vengê berzi dayış",
        "grant-oversight": "Karberan u ploğyayê revizyona bınımn",
-       "grant-patrol": "Perer de vurnayışa çımra ravyarn",
+       "grant-patrol": "{{GENDER:$1|$1i çım ra viyarna ra:$1}}",
        "grant-protect": "Şeveknayış u wedarıtışê şeveknayışê pelan",
        "grant-sendemail": "Karberanê binan rê e-posta bırışê",
        "grant-uploadeditmovefile": "Dosyaya bar ke, bıvurnê  yana berê",
        "rightslog": "Qeydê heqanê karberi",
        "rightslogtext": "Ena listeyê loganê ke heqqa karbaranî mucneno.",
        "action-read": "ena pela wanayış",
-       "action-edit": "ena pela bıvurnê",
+       "action-edit": "ena perre bıvurnê",
        "action-createpage": "na perer bıvıraz",
        "action-createtalk": "pelanê werênayışi bıvıraze",
        "action-createaccount": "hesabê nê karberi bıvıraze",
        "action-deletelogentry": "roceka dekerdan bestern",
        "action-deletedhistory": "verora esteriya perrer bıvin",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena perer mestern",
+       "action-undelete": "Ena perre mesterê",
        "action-suppressrevision": "revizyonê nımnayi bıvin u timar kı.",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "action-patrol": "vurnayîşê karberanê binî nişan bike patrol biye",
        "action-autopatrol": "vurnayîşê xoye nişan bike ke belli biyo patrol biye",
        "action-unwatchedpages": "listeyê pelanê seyirnibiya bivîne",
-       "action-mergehistory": "tarixê ena pele yew ke",
+       "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-sendemail": "e-posta bırşe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
-       "action-editmywatchlist": "Listeyseyran de xo bıvırne",
+       "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
        "action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ziyaretê peyêni ra nata}}",
        "enhancedrc-history": "tarix",
        "recentchanges": "Vırnayışê peyêni",
-       "recentchanges-legend": "Tercihê vurnayışanê peyênan",
+       "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-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
-       "recentchanges-label-newpage": "Enê vurnayışi yew pela newiye vıraşta.",
-       "recentchanges-label-minor": "No yew vurnayışo werdiyo",
-       "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
+       "recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.",
+       "recentchanges-label-minor": "No yew vırnayışo werdiyo",
+       "recentchanges-label-bot": "Eno vırnayış terefê yew boti ra vıraziyo",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
-       "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayey cı",
-       "recentchanges-legend-heading": "<strong>Kıtabekê Vurriyayışê peyêni:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} Şıma şenê ([[Special:NewPages|Listey peranê  newan]] zi bıvinê)",
+       "recentchanges-label-plusminus": "Ebadê perre de bazê bayti de vayey cı",
+       "recentchanges-legend-heading": "<strong>Kıtabekê vırnayışê peyêni:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} Şıma şenê ([[Special:NewPages|Lista peranê  newan]] zi bıvênê)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Bımotne",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
        "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
-       "rcshowhideminor": "Vurnayışê werdiy $1",
+       "rcshowhideminor": "Vırnayışê werdiy $1",
        "rcshowhideminor-show": "Bımotne",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
        "rcshowhidepatr-show": "Bımotne",
        "rcshowhidepatr-hide": "Bınımne",
-       "rcshowhidemine": "vurnayışê mı $1",
+       "rcshowhidemine": "vırnayışê mı $1",
        "rcshowhidemine-show": "Bımotne",
        "rcshowhidemine-hide": "Bınımne",
        "rcshowhidecategorization": "kategorizasyoni $1",
        "rc-enhanced-expand": "Detaya bıvin (JavaScript lazımo)",
        "rc-enhanced-hide": "Melumat bınımne",
        "rc-old-title": "\"$1\"i orcinalê cı vıraşt",
-       "recentchangeslinked": "Vurnayışê elaqeyıni",
-       "recentchangeslinked-feed": "Vurnayışê elaqeyıni",
-       "recentchangeslinked-toolbox": "Vurnayışê elaqeyıni",
+       "recentchangeslinked": "Vırnayışê bestiyaey",
+       "recentchangeslinked-feed": "Vırnayışê bestiyaey",
+       "recentchangeslinked-toolbox": "Vırnayışê bestiyaey",
        "recentchangeslinked-title": "Heqa \"$1\" de vurnayışi",
        "recentchangeslinked-summary": "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.\n[[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
        "recentchangeslinked-page": "Namey perrer:",
        "filedelete-maintenance": "Esterayîş u resterasyonê dosyayî wextê texmirî de nibenê.",
        "filedelete-maintenance-title": "Dosyaya nêbesterneyêna",
        "mimesearch": "MIME bigêre",
-       "mimesearch-summary": "Na pele, dosyayanê MIME goreyê tewran ra parzûn kena. Cıkewtış: tewrê zerreki/tewro bınên ya zi tewrê zerreki/*, nımune: <code>image/jpeg</code>.",
+       "mimesearch-summary": "Na perre, dosyayanê MIME gorey tewran ra parzûn kena. Cıkewtış: tewrê zerreki/tewro bınên ya zi tewrê zerreki/*, nımune: <code>image/jpeg</code>.",
        "mimetype": "Babetê NIME",
        "download": "Bıselagnê",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "unusedtemplates": "Şablonê kı nêgurweyênê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
-       "randompage": "Pela raştameyiye",
+       "randompage": "Perra raştameyiye",
        "randompage-nopages": "Na {{PLURAL:$2|heruna namey|heruna nameyan}} de nê peli çıniyê: $1.",
        "randomincategory": "Ena kategoriye dı pela raştameye",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê perer",
-       "statistics-header-edits": "İstatistikê vurnayışan",
+       "statistics-header-edits": "İstatistikê vırnayışan",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Yewbina istatistiki",
        "statistics-articles": "Perê zerreki",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
        "protectedtitles-submit": "Sereki bımotne",
        "listusers": "Listeyê Karberan",
-       "listusers-editsonly": "Teyna karberanê vurnayış kerdoğan bımotne",
+       "listusers-editsonly": "Teyna karberanê vırnayış kerdoğan bımotne",
        "listusers-creationsort": "goreyê wextê vıraştışi rêz ker",
        "listusers-desc": "Kemeyen rézed ratn",
        "usereditcount": "$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}",
        "apisandbox-dynamic-parameters-add-label": "Parametre dek:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
        "apisandbox-submit-invalid-fields-title": "Tay çiy ters şı",
-       "apisandbox-results": "Neticey",
+       "apisandbox-results": "Peyniy",
        "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
        "apisandbox-request-time": "Demê waştışi: {{PLURAL:$1|$1 ms}}",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
-       "checkbox-invert": "Rageyre",
+       "checkbox-invert": "Verdindayış",
        "allpages": "Pêro peli",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
        "watchnologin": "Şıma cıkewtış nêvıraşto",
        "addwatch": "Lista seyrkerdışi ke",
-       "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|listeya seyri]] tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+       "addedwatchtext": "\"[[:$1]]\" u perra cıya werênayışi [[Special:Watchlist|lista şımaya ewniyayışi]] rê ameyo cıkerdış.",
        "addedwatchtext-short": "Pera $1`i çebyê listeya seyran de şıma",
        "removewatch": "Lista seyrkerdışi ra wedare",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "removedwatchtext-short": "Pera $1`i listeya seyran de şıma ra wedari yê",
        "watch": "Seyr ke",
-       "watchthispage": "Bewni ena per",
+       "watchthispage": "Şıma bewnê ena perre",
        "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "watchlist-hide": "Bınımne",
        "watchlist-submit": "Bımotne",
        "wlshowtime": "Periyoda zemani asenayışi:",
-       "wlshowhideminor": "vurriyayışê werdiy",
+       "wlshowhideminor": "vırnayışê werdiy",
        "wlshowhidebots": "boti",
        "wlshowhideliu": "karberê qeydıni",
        "wlshowhideanons": "karberê anonimi",
-       "wlshowhidepatr": "vurnayışê pawıteyi",
-       "wlshowhidemine": "vurnayışê mı",
+       "wlshowhidepatr": "Vırnayışê çım ra viyarniyaey",
+       "wlshowhidemine": "vırnayışê mı",
        "wlshowhidecategorization": "kategorizasyonê pele",
        "watchlist-options": "Tercihê liste da seyri",
        "watching": "Seyr ke...",
        "unwatching": "Seyr meke...",
-       "watcherrortext": "Sazanê listeda seyri vurnayış de pox ta \"$1\" xırabey vıcyê .",
+       "watcherrortext": "Key şıma lista seyrkerdışê xo \"$1\" rê vırnaêne, yew xeta veciya.",
        "enotif_reset": "Pela pêro ziyaret kerde deye mor ke",
        "enotif_impersonal_salutation": "{{SITENAME}} karber",
        "enotif_subject_deleted": "{{SITENAME}} de pera $1 {{gender:$2|$2}} esterıt.",
        "deleteotherreason": "Sebebo bin:",
        "deletereasonotherlist": "Sebebo bin",
        "deletereason-dropdown": "* Sebebê esterıtışê pêroyi\n** Vurnayışo nêwaşte (spam)\n** Vandalizm\n** İxlalê heqa telifi\n** Waştışê nuştoği\n** Oryantasyono xırabe",
-       "delete-edit-reasonlist": "Sebebê vurnayışan bıvurne",
+       "delete-edit-reasonlist": "Sebebê vırnayışan bıvurnê",
        "delete-toobig": "no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.\nqey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.",
        "delete-warning-toobig": "no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.\nhewn a kerdışê ıney {{SITENAME}} şuxul bıne gırano;\nbı diqqet dewam kerê.",
        "deleteprotected": "Şıma nêşenê ena perer esternê,  çıkı per starya ya.",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot",
        "rollbackfailed": "Peyserardış nêbi",
        "cantrollback": "karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.",
-       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra pelê ıney[[:$1]] de vurnayiş biyo u no vurnayiş tepiya nêgeriyeno;\nyewna ten pel de vurnayiş kerdo u pel tepiya nêgeriyeno.\n\noyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra perrê ıney[[:$1]] de vırnayış biyo u no vırnayiş tepeya nêgêriyeno;\nyewna ten perre de vırnayiş kerdo u perre tepiya nêgeriyeno.\n\noyo ke vırnayışo peyên kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Xulasay vurnayışi: <em>$1</em> bi",
        "revertpage": "Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.",
        "revertpage-nouser": "No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o",
        "protect-legend": "Pawıtışi araşt ke",
        "protectcomment": "Sebeb:",
        "protectexpiry": "Qediyeno:",
-       "protect_expiry_invalid": "Demo qediyayışi raşt niyo.",
+       "protect_expiry_invalid": "Demo peyên raşt niyo.",
        "protect_expiry_old": "Demo qediyayışi tarix dı.",
        "protect-unchain-permissions": "Zobina tercihanê mıhafezekerdışi kilıt meke",
        "protect-text": "Tı eşkeno bıvin u seviyê kılit-kerdışi bıvin '''$1'''.",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-search": "Dekerdena cı geyrê",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
-       "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
+       "sp-contributions-toponly": "Tenya tewr çım ra viyarnayışanê peyniyan bımocne",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
        "whatlinkshere": "Linkê tedeestey",
        "ipbexpiry": "Qedyayış:",
        "ipbreason": "Sebeb:",
        "ipbreason-dropdown": "*sebebê verni-grewtışi yê pêroyi\n** malumatê şaş têare kerdış\n** Zerreyê pelan vetış\n** keyepelê teberi re gırey eştış\n** pelani re qıseyê tewşan(toşan) eştış\n** Tehditwari hereket/Taciz\n** yew ra ziyed hesaban xırab şuxulnayiş\n** nameyê karberi yo ke meqbul niyo",
-       "ipb-hardblock": "KArberê ke ena IP ra dekewte de wa vurnayış nêkerê",
+       "ipb-hardblock": "Enê adresanê IPy ra karberi vırnayış u cıkwetış ra bloke kerê",
        "ipbcreateaccount": "Hesab viraştişi blok bik",
        "ipbemailban": "Ena karber rê destur medî  ke ay e-mail neşiravî",
        "ipbenableautoblock": "verniyê IPadresa peyin ê no karberi u wexta ke vurnayişi kerd ê IPadresani otomotik bıger.",
        "imagenocrossnamespace": "Dosya, ca yo ke qey nameyê dosyayan nêbıbo nêkırışiyeno",
        "nonfile-cannot-move-to-file": "Ekê dosya niyê, cade namande dosyaya nêahulneyênê",
        "imagetypemismatch": "Tipê dosyey newey rê pê nêgıneno",
-       "imageinvalidfilename": "nameyê dosyayi ya hedefi meqbul niyo.",
+       "imageinvalidfilename": "Namey dosyao ke hedefo nêvêreno.",
        "fix-double-redirects": "rayberdış ê ke sernameyê orjinali re işaret keni rocane bıker.",
        "move-leave-redirect": "pey de yew rayberdış roni",
        "protectedpagemovewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri, loge bivini:",
        "importinterwiki": "Zewbina wiki ra ard",
        "import-interwiki-text": "qey kırıştışê zerreyi yew wiki u pel bıvıcinê.\ntarixê revizyon u nameyê nuştoxi pawyene.\nkarê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê kırıştî de]] qeyd beno.",
        "import-interwiki-sourcewiki": "Çıme wiki:",
-       "import-interwiki-sourcepage": "Çıme pela:",
+       "import-interwiki-sourcepage": "Perra çımey:",
        "import-interwiki-history": "Qeydanê pele pêrune kopya ke",
        "import-interwiki-templates": "Şablonan pêro zerre ke",
        "import-interwiki-submit": "Zerre ke",
        "importnopages": "Pel çino ke import bike",
        "imported-log-entries": " $1 {{PLURAL:$1|logê dekerdişi|loganê dekerdişan}} ard.",
        "importfailed": "Împort nebiy: <nowiki>$1</nowiki>",
-       "importunknownsource": "Çimeyê tip ê împortî nizanyano",
+       "importunknownsource": "Tipê importê çımeyiyo ke nêşınasiyeno.",
        "importcantopen": "Nieşkenî dosyayê împortî a bike",
        "importbadinterwiki": "Linkê înterwîkîyî nihebitiyeno",
        "importsuccess": "Împort qediya!",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizyon|revizyon}} debya zere",
        "import-logentry-interwiki-detail": "$2 per da $1  ra{{PLURAL:$1|revizyon|revizyon}} debya zere",
        "javascripttest": "Cerebnayışê JavaScripti",
+       "javascripttest-pagetext-unknownaction": "Kerdışo ke nêşınasiyeno \"$1\".",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
        "tooltip-pt-userpage": "Pela {{GENDER:|şımaya karberi}}",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
        "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-anontalk": "vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker",
-       "tooltip-pt-preferences": "Tercihê {{GENDER:|to}}",
+       "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-ca-delete": "Ena pele bestere",
        "tooltip-ca-undelete": "Perer fına zey verê esternayışi kerê",
        "tooltip-ca-move": "Ena pele bıkırışe",
-       "tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
+       "tooltip-ca-watch": "Ena perre lista xoya seyrkerdışi ke",
        "tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
        "tooltip-search": "{{SITENAME}} de cı geyre",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
        "tooltip-ca-nstab-template": "Şabloni bıvêne",
        "tooltip-ca-nstab-help": "Pela peşti bıvêne",
        "tooltip-ca-nstab-category": "Pela kategoriye bıvêne",
-       "tooltip-minoredit": "Nay vırnayışa werdi nışan bıkeré",
+       "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-preview": "Vurnayışanê xo çım ra bıviyarnê. Qeydkerdış ra ver bıgurê cı!",
-       "tooltip-diff": "Metni sero vurnayışan mocneno",
+       "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ê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-watchlistedit-normal-submit": "Sernuşteyan wedare",
        "pageinfo-firsttime": "Vıraştena tarixê perrer",
        "pageinfo-lastuser": "Vurnayoğo peyên",
        "pageinfo-lasttime": "Deme u vurnayışo peyên",
-       "pageinfo-edits": "Amarina vurnayışan pêro",
+       "pageinfo-edits": "Amarê vırnayışano pêroyi",
        "pageinfo-authors": "Amarina nuştekaran pêro",
        "pageinfo-recent-edits": "Amariya vurnayışan ($1 ra nata)",
        "pageinfo-recent-authors": "Amarina nuştekaran pêro",
        "markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
        "markedaspatrolledtext": "Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo",
        "rcpatroldisabled": "Dewriyay vırnayışê peyêni nêxebetiyena",
-       "rcpatroldisabledtext": "Devriyeyê vurnayışê peyêni inke kefilnaye biyo u nihebitiyeno",
+       "rcpatroldisabledtext": "Dewriya vırnayışanê peyênan nêgırweniyena.",
        "markedaspatrollederror": "Nişan nibeno ke devriye biyo",
        "markedaspatrollederrortext": "Ti gani revizyon işaret bike ke Nişanê devriye biyo",
        "markedaspatrollederror-noautopatrol": "Ti nieşkeno ke vurnayişê xo nişan bike ke devriye biyê.",
        "filedelete-old-unregistered": "Ena dosya revizyoni yê weçinayi \"$1\" database ma de çini yo.",
        "filedelete-current-unregistered": "Ena dosyayê weçinayi \"$1\" database ma de çini yo.",
        "filedelete-archive-read-only": "Ena direktorê arşivi \"$1\" webserver de nieşkeno binusi.",
-       "previousdiff": "← Vurnayışê kıhanyer",
+       "previousdiff": "← Vırnayışê kıhanêr.",
        "nextdiff": "Vurnayışo peyên →",
        "mediawarning": "'''Teme''': Na dosya de belkia kodê xırabıni estê.\nGurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
        "imagemaxsize": "Lımita ebata resimi:<br />''(qande akerdışa perande dosyayan)''",
        "newimages-hidepatrolled": "Selaganë dewriyeyan bıvinë",
        "noimages": "Çik çini yo.",
        "ilsubmit": "Cı geyre",
-       "bydate": "goreyê zemani",
+       "bydate": "Gorey zemani",
        "sp-newimages-showfrom": "Dosyayanê newiyanê ke be $1, $2 ra dest pêkenê bımocne",
        "video-dims": "$1, $2 × $3",
        "seconds-abbrev": "$1 san",
        "exif-primarychromaticities": "Kromaticitiyê eveli",
        "exif-ycbcrcoefficients": "Cayê rengi yê transformasyon metriksê koefişinti",
        "exif-referenceblackwhite": "Çiftyê siya u sipe değerê referansi",
-       "exif-datetime": "Zeman u tarixê vurnayışê dosya",
+       "exif-datetime": "Zeman u tarixê vırnayışê dosya",
        "exif-imagedescription": "Serê resimi",
        "exif-make": "Vıraştoğê kamera",
        "exif-model": "Modelê kamera",
        "exif-compressedbitsperpixel": "Modê komprasyonê resimi",
        "exif-pixelxdimension": "Herayeya resimi",
        "exif-pixelydimension": "Berzeya resimi",
-       "exif-usercomment": "Mışewreyê karberi",
+       "exif-usercomment": "Mışewrey karberi",
        "exif-relatedsoundfile": "Derhekê dosya yê vengi",
        "exif-datetimeoriginal": "Demê afernayışê dayeyo sıfteyıni",
        "exif-datetimedigitized": "Dema  dijital kerdışi",
        "exif-subjectlocation": "cayê kerdoxi",
        "exif-exposureindex": "rêzê (indexê) pozi",
        "exif-sensingmethod": "metodê hiskerdışi",
-       "exif-filesource": "çimeyê dosyayi",
+       "exif-filesource": "Ã\87ımey dosya",
        "exif-scenetype": "tipa sehneyi",
        "exif-customrendered": "karê resmê xususiyi",
        "exif-exposuremode": "poz kerdışi",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-other": "Pelê xısusiyê bini",
        "specialpages-group-login": "Dekew / hesab vıraz",
-       "specialpages-group-changes": "Vurnayışê peyêni û qeydi",
+       "specialpages-group-changes": "Vırnayışê peyêni u qeydi",
        "specialpages-group-media": "Raporê medya û barkerdışi",
        "specialpages-group-users": "Karberi u heqê inan",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
        "expand_templates_generate_rawhtml": "Xam HTML'i bıvin",
        "expand_templates_preview": "Verqayt",
-       "pagelanguage": "Zıwanê perer bıvırnê",
+       "pagelanguage": "Zıwanê perre bıvırnê",
        "pagelang-name": "Pele",
        "pagelang-language": "Zıwan",
        "pagelang-use-default": "Zıwanê hesabiyayeyi bıgurene",
index f59d719..00c1e20 100644 (file)
        "passwordreset-emaildisabled": "E-mailowe funkcije su se na toś tom wikiju znjemóžnili.",
        "passwordreset-username": "Wužywarske mě:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "E-mail se woglědaś?",
-       "passwordreset-capture-help": "Jolic nakśickujoš toś ten kašćik, e-mail (z nachylnym gronidłom) buźo se pokazaś a wužywarjeju słaś.",
        "passwordreset-email": "E-mailowa adresa:",
        "passwordreset-emailtitle": "Kontowe drobnostki na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Něchten (nejskerjej ty, z IP-adresu $1) jo anulěrowanje gronidła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} pominał ($4).  {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane}}:\n\n$2\n\n{{PLURAL:$3|Toś to nachylne gronidło spadnjo|Toś tej nachylnej gronidle spadnjotej|Toś te nachylne gronidła spadnu}} za {{PLURAL:$5|jaden źeń|$5 dnja|$5 dny|$5 dnjow}}.\nTy by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten drugi jo toś to napšašowanje pósłał, abo jolic sy se zasej na spócetne gronidło spomnjeł a wěcej njocoš jo změniś, móžoš toś to zdźělenje ignorěrowaś a swójo stare gronidło dalej wužywaś.",
        "saveprefs": "Składowaś",
        "restoreprefs": "Wšykne standardne nastajenja wótnowiś (we wšych wótrězkach)",
        "prefs-editing": "Wobźěłaś",
-       "rows": "Rědki:",
-       "columns": "Słupy:",
        "searchresultshead": "Pytaś",
        "stub-threshold": "Formatěrowanje  <a href=\"#\" class=\"stub\">wótkaza na zarodk</a> (w bytach):",
        "stub-threshold-disabled": "Znjemóžnjony",
        "userrights-reason": "Pśicyna:",
        "userrights-no-interwiki": "Njamaš pšawo wužywarske pšawa w drugich wikijach změniś.",
        "userrights-nodatabase": "Datowa banka $1 njeeksistěrujo abo njejo lokalna.",
-       "userrights-nologin": "Musyš se z administratorowym kontom [[Special:UserLogin|pśizjawiś]], aby wužywarske pšawa změnił.",
-       "userrights-notallowed": "Njamaš trěbne pšawa, aby wužywarske pšawa pśipokazało abo zajmjeł.",
        "userrights-changeable-col": "Kupki, kótarež móžoš změniś",
        "userrights-unchangeable-col": "Kupki, kótarež njamóžoš změniś",
        "userrights-conflict": "Konflikt změnow wužywarskich pšawow! Pšosym pśeglědaj a wobkšuś swóje změny.",
-       "userrights-removed-self": "Sy swóje pšawa wuspěšnje wótpórał. Togodla njamaš južo pśistup na toś ten bok měś.",
        "group": "Kupka:",
        "group-user": "wužywarje",
        "group-autoconfirmed": "wobkšuśone wužywarje",
        "right-siteadmin": "Datowu banku zastajiś a zastajenje wótpóraś",
        "right-override-export-depth": "Boki inkluziwnje wótkazanych bokow až do dłyma 5 eksportěrowaś",
        "right-sendemail": "Drugim wužywarjam e-mail pósłaś",
-       "right-passwordreset": "E-maile za slědkstajanje gronidłow se woglědaś",
        "newuserlogpage": "Protokol nowych wužywarjow",
        "newuserlogpagetext": "To jo protokol wó nowych wužywarskich kontow.",
        "rightslog": "Protokol wužywarskich pšawow",
        "uploaddisabledtext": "Nagraśa datajow su znjemóžnjone.",
        "php-uploaddisabledtext": "Nagraśa PHP-datajow su znjemóžnjone. Pšosym pśekontrolěruj nastajenje file_uploads.",
        "uploadscripted": "Toś ta dataja wopśimjejo HTML abo script code, kótaryž móžo wót browsera se zamólnje wuwjasć.",
-       "uploadscriptednamespace": "Toś ta SVG-dataja wopśimujo njedowólony mjenjowy rum '$1'",
+       "uploadscriptednamespace": "Toś ta SVG-dataja wopśimujo njedowólony mjenjowy rum '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML w nagratej dataji njedajo se parsowaś.",
        "uploadvirus": "Toś ta dataja ma wirus! Nadrobnosći: $1",
        "uploadjava": "Toś ta dataja jo ZIP-dataja, kótaraž wopśimujo dataju .class z Javy.\nNagrawanje datajow Javy njejo dowólone, dokulaž mógli wobjeźenje wěstotnych wobgranicowanjow zmóžniś.",
        "feedback-thanks": "Źěkujomy se! Twój komentar jo se k bokoju \"[$2 $1]\" pósłał.",
        "searchsuggest-search": "Pytaś",
        "searchsuggest-containing": "wopśimujo...",
-       "api-error-badaccess-groups": "Njamaš pšawo dataje do toś togo wikija nagraś.",
        "api-error-badtoken": "Nutśikowna zmólka: Wopacny token",
-       "api-error-copyuploaddisabled": "Nagrawanje pśez URL jo na toś tom serwerje znjemóžnjone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jo|Stej|Su|Jo}} južo {{PLURAL:$1|druga dataja|drugej dataji|druge dataje|drugich datajow}} z tym samym wopśimjeśim na sedle",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Jo była druga dataja|Stej byłej drugej dataji|Su byli druge dataje|Jo było drugich datajow}} južo na websedle z tym samym wopśimjeśim, ale {{PLURAL:$1|jo se wulašowała|stej se wulašowałej|su se wulašowali|jo se wulašowało}}.",
-       "api-error-empty-file": "Dataja, kótaruž sy nagrał, jo prozna była.",
        "api-error-emptypage": "Napóranje nowych, proznych bokow njejo dowólone.",
-       "api-error-fetchfileerror": "Nutśikowna zmólka: Pśi wobstarowanju dataje něco njejo se raźiło.",
-       "api-error-fileexists-forbidden": "Dataja z mjenim \"$1\" južo eksistěrujo, a njedajo se pśepisaś.",
-       "api-error-fileexists-shared-forbidden": "Dataja z mjenim \"$1\" južo eksistěrujo w zgromadnem datajowem repozitoriumje a njedajo se pśepisaś.",
-       "api-error-file-too-large": "Dataja, kótaruž sy nagrał, jo pśewjelika była.",
-       "api-error-filename-tooshort": "Datajowe mě jo pśekrotke.",
-       "api-error-filetype-banned": "Toś ten datajowy typ jo zakazany.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|njejo dowólony datajowy typ|njejstej dowólenej datajowej typa|njejsu dowólone datajowe typy|njejsu dowólone datajowe typy}}. {{PLURAL:$3|Dowólony datajowy typ jo|Dowólenej datajowej typa stej|Dowólone datajowe typy su}} $2.",
-       "api-error-filetype-missing": "Dataja njama datajowu kóńcowku.",
-       "api-error-hookaborted": "Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjenje.",
-       "api-error-http": "Nutśikowna zmólka: Zwisk ze serwerom njemóžno.",
-       "api-error-illegal-filename": "Datajowe mě njejo dowólone.",
-       "api-error-internal-error": "Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki něco njejo se raźiło.",
-       "api-error-invalid-file-key": "Nutśikowna zmólka: Dataja njejo se w temporernem składowaku namakała.",
-       "api-error-missingparam": "Nutśikowna zmólka: Felujuce parametry pśi napšašowanju.",
-       "api-error-missingresult": "Nutśikowna zmólka: Njedajo se zwěsćiś, lěc kopěrowanje jo se raźiło.",
-       "api-error-mustbeloggedin": "Musyš pśizjawjony byś, aby dataje nagrał.",
-       "api-error-mustbeposted": "Nutśikowna zmólka: Napšašowanje pomina se HTTP POST.",
-       "api-error-noimageinfo": "Nagraśe jo se raźiło, ale serwer njejo nam žedne informacije wó dataji dał.",
-       "api-error-nomodule": "Nutśikowna zmólka: Žeden modul nastajony.",
-       "api-error-ok-but-empty": "Nutśikowna zmólka: Žedne wótegrono wót serwera.",
-       "api-error-overwrite": "Pśepisowanje eksistujuceje dataje njejo dowólone.",
-       "api-error-stashfailed": "Nutśikowna zmólka: Serwer njejo mógał temporernu dataju składowaś.",
        "api-error-publishfailed": "Nutśkowna zmólka: Serwer njejo mógł nachylnu dataju wozjawiś.",
-       "api-error-stasherror": "Pśi nagrawanju dataje do chowanki jo zmólka nastała.",
-       "api-error-timeout": "Serwer njejo we wócakanem casu wótgronił.",
-       "api-error-unclassified": "Njeznata zmólka jo nastała.",
-       "api-error-unknown-code": "Njeznata zmólka: \"$1\"",
-       "api-error-unknown-error": "Nutśikowna zmólka: Pśi nagrawanju twójeje dataje něco njejo se raźiło.",
+       "api-error-stashfailed": "Nutśikowna zmólka: Serwer njejo mógał temporernu dataju składowaś.",
        "api-error-unknown-warning": "Njeznate warnowanje: $1",
        "api-error-unknownerror": "Njeznata zmólka: \"$1\".",
-       "api-error-uploaddisabled": "Nagraśa su na toś tom wikiju znjemóžnjone.",
-       "api-error-verification-error": "Toś ta dataja by mógła wobkškóźona byś abo wopacnu kóńcowku měś.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunźe|sekundy|sekundow}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuśe|minuty|minutow}}",
        "duration-hours": "$1 {{PLURAL:$1|góźina|góźinje|góźiny|góźinow}}",
index 49818cc..cb1e286 100644 (file)
        "searcharticle": "जाओ",
        "history": "पाना इतिहास",
        "history_short": "पानाको इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "मेरो अन्तिम घुमाई पछि अद्यतन गरियाको",
        "printableversion": "छाप्द मिल्ल्या संस्करण",
        "permalink": "स्थायी लिङ्क",
        "views": "अवलोकन गरऽ",
        "toolbox": "औजारअन",
        "tool-link-userrights": "परिवर्तन{{GENDER:$1|प्रयोगकर्ता}}समूहहरू",
+       "tool-link-userrights-readonly": "{{GENDER:$1|प्रयोगकर्ता}} समूहअन तकऽ",
        "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}}लाई एइ इमेलमी पठाऽ",
        "userpage": "प्रयोगकर्ता पाना हेर्न्या",
        "projectpage": "प्रोजेक्ट पानो हेर्न्या",
        "invalidtitle-unknownnamespace": "अपछ्याणो नाउँबार अङ्क $1 रे पाठ \"$2\" भया: अमान्य शीर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "exception-nologin-text": "येए पन्नालाई चलुनाइ या केयि काम खिलाइ सक्षम हुनाइ लगइन अर:।",
+       "exception-nologin-text-manual": "येइ पन्‍ना या कारवाइ मी पहुँच समर्थता कि न्यूति कृपया $1 अरऽ।",
        "virus-badscanner": "गट्टी मिलजुल: अपछ्याणो भाइरस खोज्ज्या: <em>$1</em>",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "editingold": "<strong>चेतावनी: तम यै पानाको अति पुरानो अप्रचलित संशोधनलाई सम्पादन गद्द लाग्याछौ ।<strong>\nयदि तमीले यै परिवर्तनलाई सङ्ग्रह गर्यौ भण्या यै पछिका संशोधनहरू नष्ट हुन्याछन् ।",
        "yourdiff": "भिन्नताहरू",
        "copyrightwarning2": "कृपया ध्यान देओ यै {{SITENAME}}मी दियाका योगदानहरूलाई अन्य योगदानकर्ताहरूद्वारा सम्पादन गरिन्याछ, परिवर्तन गरिन्याछ अथवा हटाइन्याछ । यदि तमरो लेखलाई निर्दयता पूर्वक सम्पादन गरेको चाहदैनौ भण्या त्यो यहाँ जनराख।<br />\nयदि तमी किटानसाथ भन्नाछौ कि यो लेख तम आफैले लेख्याको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबठे लियाको हो (विवरणकोलागि हेर $1 ). \n'''कपीराइट भयाको रचना अनुमति बिना  यहाँ जनराख!'''",
-       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95 à¤®à¤°à¥\8dमतà¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dति à¤¬à¤¨à¥\8dद à¤\97रियाà¤\95à¥\8bà¤\9b, à¤¯à¥\88 à¤\95ारण à¤¤à¤®à¥\80 à¤\86फà¥\8dनà¥\8b à¤¸à¤®à¥\8dपादन à¤\85हिलà¥\87 à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97दà¥\8dद à¤¸à¤\95à¥\8dदà¥\8dयाहà¥\8cन à¥¤</strong>\n\nयदि à¤¤à¤®à¥\80 à¤\9aाहनà¥\8dà¤\9bà¥\8c à¤­à¤£à¥\8dया à¤\85हिलà¥\87 à¤¯à¤¹à¤¾à¤\81 à¤­à¤¯à¤¾à¤\95ा à¤ªà¤¾à¤ à¤²à¤¾à¤\88 à¤\95पि à¤\97रि à¤\95तà¥\88 à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f à¤«à¤¾à¤\87लमà¥\80 à¤ªà¥\87सà¥\8dà¤\9f à¤\97रिबर à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97दà¥\8dद à¤¸à¤\95à¥\8dदà¥\8dयाहà¥\8c à¥¤\n\nपà¥\8dरवनà¥\8dधà¤\95 à¤\9cनलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dयाà¤\95à¥\8b à¤\9b à¤\89नलà¥\87 à¤¯à¤¸à¥\8b à¤µà¤¿à¤µà¤°à¤£ à¤¦à¤¿à¤¯à¤¾à¤\95à¥\8b छ: $1",
+       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¡à¤¾à¤\9fाबà¥\87स à¤®à¤°à¥\8dमत à¤\96िलाà¤\88 à¤¬à¤¨à¥\8dद à¤\85रà¥\80रà¥\88à¤\9b, à¤\87सà¥\88 à¤\95ारण à¤¤à¤®à¥\80 à¤\85à¤\87ल à¤\86फà¥\81ना à¤¸à¤®à¥\8dपादनà¤\85न à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97दà¥\8dद à¤¸à¤\95à¥\8dदà¥\8dयाहà¥\8cन।</strong>\nतम à¤¯à¥\87à¤\87 à¤ªà¤¾à¤  à¤²à¤¾à¤\88 à¤¸à¤¾à¤¦à¤¾à¤ªà¤¾à¤  à¤«à¤¾à¤\87ल à¤®à¥\80 à¤¨à¤\95ल à¤\85रà¥\80बर à¤¸à¤¾à¤¦à¥\8dद à¤°à¥\87 à¤ªà¤\9bा à¤\96िलाà¤\87 à¤¸à¤\9eà¥\8dâ\80\8dà¤\9aय à¤\85रà¥\80बर à¤°à¤¾à¤\96à¥\80 à¤¸à¤\95नà¥\8dà¤\9bऽ।\n\nपà¥\8dरवनà¥\8dधà¤\95 à¤\9cनलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dयाà¤\95à¥\8b à¤\9b à¤\89नलà¥\87 à¤\87सà¥\8b à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रण à¤¦à¥\80राà¤\87छ: $1",
        "protectedpagewarning": "<strong>सूचना: यै पानालाई सुरक्षित गरियाको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यैलाई सम्पादन गद्द सक्द्याछन् ।</strong>\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइयाको छ:",
        "templatesused": "यै पानामी राखियाका {{PLURAL:$1|Template|ढाँचाहरू}} :",
        "templatesusedsection": "यै खण्डमी {{PLURAL:$1|ढाँचा प्रयोग गरियाको छ|ढाँचाहरू प्रयोग गरियाका छन्}}",
        "rev-suppressed-text-unhide": "यै पानाको पुनरावलोकन '''दमन''' गरियाको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पानो={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तम अगाडि बढ्ड चाहन्छौ भण्या पनि तमीले  [$1 यि संशोधनहरू हेद्द] पाउन्या हौ ।",
        "rev-delundel": "दधेखाउने/लुकाउन्या",
        "rev-showdeleted": "धेकाउन्या",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89नà¥\8dया/मà¥\87à¤\9fाà¤\88या à¤°à¤¦à¥\8dदà¤\97रà¥\8dनà¥\87  à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
+       "revisiondelete": "पà¥\81नरावलà¥\8bà¤\95नà¤\85न à¤®à¥\87à¤\9fà¥\8dयाऽ/मà¥\87à¤\9fà¥\8dयाऽ à¤°à¤¦à¥\8dद à¤\85दà¥\8dदà¥\8dया",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-no-file": "खुलाइएको पाना अस्तित्वमी छैन",
        "revdelete-show-file-submit": "हो",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमी)",
        "prefs-editing": "सम्पादन",
        "searchresultshead": "खोज",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
+       "stub-threshold": "ठूटो लिङ्क स्वरूपण ($1) खिलाइ थ्रेसहोल्ड:",
        "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "निष्क्रिय",
        "recentchangesdays": "हालको परिवर्तनमी धेकाउने दिनहरू:",
        "protect-default": "सब्बै प्रयोगकर्तानहरूलाई अनुमति दिन्या",
        "protect-level-autoconfirmed": "नौला तथा दर्ता भयाका प्रयोगकर्तानलाई मात्र अनुमति दिन्या",
        "protect-cascade": "यै पानामी संलग्न सुरक्षित पानाहरू (लामबद्द सुरक्षा)",
-       "protect-expiry-options": "२ à¤\98णà¥\8dà¤\9fाहरà¥\82:2 hours,१ à¤¦à¤¿à¤¨ :1 day,३ à¤¦à¤¿à¤¨à¤¹à¤°à¥\82:3 days,१ à¤¹à¤ªà¥\8dता:1 week,२ à¤¹à¤ªà¥\8dताहरà¥\82:2 weeks,१ à¤®à¤¹à¤¿à¤¨à¤¾:1 month,३ à¤®à¤¹à¤¿à¤¨à¤¾à¤¹à¤°à¥\82:3 months,६ à¤®à¤¹à¤¿à¤¨à¤¾à¤¹à¤°à¥\82:6 months,१ à¤µà¤°à¥\8dष:1 year,à¤\85नà¤\97िनà¥\8dतà¥\80:infinite",
+       "protect-expiry-options": "१ à¤\98णà¥\8dà¤\9fा:1 hour, à¥§ à¤¦à¤¿à¤¨ :1 day, à¥§ à¤¹à¤ªà¥\8dता:1 week, à¥¨ à¤¹à¤ªà¥\8dता:2 weeks, à¥§ à¤®à¥\88ना:1 month, à¥© à¤®à¥\88ना:3 months,६ à¤®à¥\88ना:6 months, à¥§ à¤¸à¤¾à¤²:1 year, à¤\85ननà¥\8dतà¤\95ाल:infinite",
        "restriction-type": "अनुमति:",
        "pagesize": "(अक्षरहरू)",
        "undeletepage": "मेट्याका पानाहरू हेद्या र पूर्वरुपमी फर्काउन्या",
index 1d12d07..c22982f 100644 (file)
@@ -14,6 +14,7 @@
        "tog-hideminor": "Lōga 'l mudéfichi pió céchi int al j ûltmi mudéfichi.",
        "tog-hidepatrolled": "Lōga 'l mudéfichi verifichêdi int al j ûltmi mudéfichi",
        "tog-newpageshidepatrolled": "Lōga al pàgini verifichêdi da l'elèinch dal pàgini pió nōvi.",
+       "tog-hidecategorization": "Scònd al categoréi dal pàgini",
        "tog-extendwatchlist": "Fà vèder tót' al mudéfichi fât a i tgnû sòt ôc, mìa sōl l'ûltma.",
        "tog-usenewrc": "Unés al mudéfichi per pàgina int al j ûltmi mudéfichi e in quî tgnû sòt' ôc.",
        "tog-numberheadings": "Cûnta automâtica di tétol ed sesiòun.",
@@ -24,6 +25,7 @@
        "tog-watchdefault": "Zûnta al pàgini e i file mudifichê int i tgnû 'd ôc specêl.",
        "tog-watchmoves": "Zûnta al pàgini e i file spustê int i tgnû 'd ôc specêl.",
        "tog-watchdeletion": "Zûnta al pàgini e i file scanşlê int i tgnû 'd ôc specêl.",
+       "tog-watchuploads": "Zûnta i file nōv che câregh a quî che tègn adrē",
        "tog-watchrollback": "Zûta al pàgini in dóv' ó fât al ritōren a la pàgina 'd préma a i tgnû 'd ôc specêl",
        "tog-minordefault": "Sègna ògni mudéfica cme céca (sōl cme pre-stabilî)",
        "tog-previewontop": "Fà vèder còl ch' ò fât sōver la caşèla ed mudéfica e mìa sòta.",
        "passwordreset-emaildisabled": "In cla wiki ché è stê bluchê al funsiòun ed la pôsta eletrônica.",
        "passwordreset-username": "Nòm utèint:",
        "passwordreset-domain": "Proprietê:",
-       "passwordreset-capture": "Vōt vèder còl che dèinter int al mesâg ed pôsta eletrônica?",
-       "passwordreset-capture-help": "S' es sernés cla caşèla ché, l'indirés ed pôsta eletrônica (cun la cêva 'd ingrès pruvişôria), év vîn fâ vèder, d'ed là 'd èser spidî a l'utèint.",
        "passwordreset-email": "Indirés pôsta eletrônica",
        "passwordreset-emailtitle": "Particulêr ed l'utèint só {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quelchidûn (prubabilmèint té, cun l'indirés IP $1) l'à dmandê de spidîregh 'na nōva cêva 'd ingrès per andêr dèinter a {{SITENAME}} ($4). {{PLURAL:$3|L'utèint inscrét| J utèint inscrét}} a sté indirés ed pôsta eletrônica în:\n \n$2 \n\n{{PLURAL:$3|Cla cêva 'd ingrès pruvişôria la scadrà| St' al cêvi 'd ingrès pruvişôri ché scadrân}} dôp {{PLURAL:$5|ûn dé|$5 dé}}. Ét duvrés andêr dèinter e sernîr 'na cêva 'd ingrès nōva adès. \n\nSe t'é mìa stê té a fêr la dmânda, o s' ét t'é ricurdê la cêva 'd ingrès uriginêla e an 't vō mia pió cambiêrla, ét pō scanşlêr cól mesâg ché e cuntinvêr a druvêr la tó cêva 'd ingrès vècia.",
        "saveprefs": "Sêlva",
        "restoreprefs": "Turnêr a mèter al j impustasiòun ed partèinsa (in tót al sesiòun)",
        "prefs-editing": "Caşèla 'd mudéfica",
-       "rows": "Rîghi",
-       "columns": "Clòuni:",
        "searchresultshead": "Sērca",
        "stub-threshold": "Pôrta per i colegamèint a j abòs ($1):",
        "stub-threshold-disabled": "Bluchê",
        "prefswarning-warning": "T'é fât dal mudéfichi al tō preferèinsi ch'în mìa stêdi salvêdi. S'ét vê fōra da cla pàgina ché sèinsa clichêr \"$1\" al preferèinsi a gnîran mìa arnuvêdi.",
        "prefs-tabs-navigation-hint": "Sugerimèint: è pusébil druvêr i tâst frècia a mansèina e a dréta per spustêres tr'al schēdi int l'elèinch dal schēdi.",
        "userrights": "Gestiòun di permès relatîv a j utèint",
-       "userrights-lookup-user": "Gestiòun di gróp utèint",
+       "userrights-lookup-user": "Sernîr 'n utèint",
        "userrights-user-editname": "Mèt dèinter al nòm utèint:",
-       "editusergroup": "Mudéfica i gróp {{GENDER:$1|utèint}}",
+       "editusergroup": "Mudéfica i gróp utèint.",
        "editinguser": "Mudéfica i dirét utèint ed j {{GENDER:$1|utèint}}<strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Mudéfica gróp utèint",
        "saveusergroups": "Sêlva i gróp{{GENDER:$1|utèint}}",
        "userrights-reason": "Mutîv:",
        "userrights-no-interwiki": "An es gh'à mìa i permès necesâri per cambiêr i dirét ed j utèint in sém a êter sît.",
        "userrights-nodatabase": "Al databēş $1 al gh'é mìa o an n' mìa un databêş lochêl.",
-       "userrights-nologin": "Per dêr i dirét a j utèint l'é necesâri [[Special:UserLogin|fêr l'ingrès]] cme aministardōr.",
-       "userrights-notallowed": "An 't gh'ê mìa al permès per zuntêr o tōr via i permès utèint.",
        "userrights-changeable-col": "Gróp ch'es pōlen mudifichêr.",
        "userrights-unchangeable-col": "Gróp ch'an 's pōlen mìa mudifichêr.",
        "userrights-conflict": "Cuntrâst ed mudéfica di dirét utèint! Cuntròla e cunfērma al tó mudéfichi.",
-       "userrights-removed-self": "T'é tôt via i tō dirét. E dòunca, an 't prê pió andêr dèinter a cla pàgina ché.",
        "group": "Gróp:",
        "group-user": "Utèint",
        "group-autoconfirmed": "Utèint cunvalidê da per ló",
        "group-bot": "Bot",
        "group-sysop": "Aministradōr",
        "group-bureaucrat": "Funsionâri",
-       "group-suppress": "Oversight",
+       "group-suppress": "Soppressori",
        "group-all": "(tót)",
        "group-user-member": "{{GENDER:$1|utèint}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utèint convalidê da per ló}}",
        "right-siteadmin": "Blōca e şblōca al databêş",
        "right-override-export-depth": "Pôrta fōra al pàgini cun insèm al pàgini coleghêdi per 'na larghèsa ed 5",
        "right-sendemail": "Spidés pôsta eletrônica a êter utèint",
-       "right-passwordreset": "A vèd i mesâg 'd arnōv ed la cêva 'ed ingrès",
        "right-managechangetags": "Fa e mèt in funsiòun/blôca al j [[Special:Tags|etichèti]]",
        "right-applychangetags": "Tâca dal [[Special:Tags|tichèti]] al tō mudéfichi",
        "right-changetags": "Zûta e tó via [[Special:Tags|tichèti]] precîşi só versiòun ónichi o vōş ed regéster",
        "action-upload_by_url": "carghêr cól file ché da 'n indirés URL",
        "action-writeapi": "drōva al j API in scritûra",
        "action-delete": "scanşlêr cla pàgina ché",
-       "action-deleterevision": "scanşlêr cla versiòun ché",
-       "action-deletedhistory": "guêrda la stòria scanşlêda de sté pàgina",
+       "action-deleterevision": "scanşlêr al versiòun",
+       "action-deletedhistory": "guêrda la stòria scanşlêda ed 'na pàgina",
        "action-browsearchive": "serchêr pàgini scanşlêdi",
-       "action-undelete": "tōr indrê cla pàgina ché",
-       "action-suppressrevision": "turnêr a vèder e mèter al mudéfichi lughêdi",
+       "action-undelete": "tōr indrê pàgini",
+       "action-suppressrevision": "turnêr a vèder e turnêr a mèter al versiòun lughêdi",
        "action-suppressionlog": "guardêr sté regéster privê",
        "action-block": "bluchê sté utèint in scritûra",
        "action-protect": "cambiêr i livē 'd prutesiòun per cla  pàgina ché",
        "uploaddisabledtext": "La cârga di file an n'é mìa atîva.",
        "php-uploaddisabledtext": "La cârga dal file cun PHP l'é bluchêda. Cuntròla che 'l file_uploads al sìa bèin impustê.",
        "uploadscripted": "Cól file ché al gh'à un côdis o di script, che prén èser mìa capî bèin da un navigadōr internèt.",
-       "uploadscriptednamespace": "Cól file SVG ché al gh'à un namespace '$1' mìa permés.",
+       "uploadscriptednamespace": "Cól file SVG ché al gh'à un namespace '<nowiki>$1</nowiki>' mìa permés.",
        "uploadinvalidxml": "Al côdis XML int al file al pōl mìa èser lavurê bèin.",
        "uploadvirus": "Cól fil ché al ghè un 'virus'! Particulêr: $1",
        "uploadjava": "Cól file ché l'é un file ZIP che 'l gh'à dèinter un file .class Java. Carghêr i file Java an n'é mìa permés, perché pōlen schivşêr i lémit ed sicurèsa.",
        "feedback-cancel": "Scanşela",
        "feedback-message": "Mesâg",
        "feedback-subject": "Argomèint:",
-       "searchsuggest-search": "Sèirca"
+       "searchsuggest-search": "Sērca dèinter ed {{SITENAME}}"
 }
index 555b3a2..70705e5 100644 (file)
        "searcharticle": "Μετάβαση",
        "history": "Ιστορικό σελίδας",
        "history_short": "Ιστορικό",
+       "history_small": "ιστορικό",
        "updatedmarker": "ενημερώθηκαν από την τελευταία επίσκεψή μου",
        "printableversion": "Εκτυπώσιμη έκδοση",
        "permalink": "Σταθερός σύνδεσμος",
        "views": "Προβολές",
        "toolbox": "Εργαλεία",
        "tool-link-userrights": "Αλλαγή ομάδων {{GENDER:$1|χρήστη}}",
+       "tool-link-userrights-readonly": "Εμφάνιση {{GENDER:$1|ομάδων}}  χρηστών",
        "tool-link-emailuser": "Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη",
        "userpage": "Προβολή σελίδας χρήστη",
        "projectpage": "Προβολή σελίδας εγχειρήματος",
        "createacct-benefit-body2": "{{PLURAL:$1|σελίδα|σελίδες}}",
        "createacct-benefit-body3": "{{PLURAL:$1|πρόσφατος συνεισφέρων|πρόσφατοι συνεισφέροντες}}",
        "badretype": "Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.",
-       "usernameinprogress": "Î\9cία Î´Î·Î¼Î¹Î¿Ï\85Ï\81γία Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d Î³Î¹Î± Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η ÎµÎ¯Î½Î±Î¹ Î®Î´Î· Ï\83ε ÎµÎ¾Î­Î»Î¹Î¾Î·.\nΠαÏ\81ακαλÏ\8e περιμένετε.",
+       "usernameinprogress": "Î\95ίναι Î®Î´Î· Ï\83ε ÎµÎ¾Î­Î»Î¹Î¾Î· Î´Î·Î¼Î¹Î¿Ï\85Ï\81γία Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d Î³Î¹Î± Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η.\nΠαÏ\81ακαλοÏ\8dμε περιμένετε.",
        "userexists": "Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.\nΠαρακαλούμε, διαλέξτε ένα διαφορετικό.",
        "loginerror": "Σφάλμα σύνδεσης",
        "createacct-error": "Σφάλμα δημιουργίας λογαριασμού",
        "nocookiesnew": "Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.",
        "nocookieslogin": "Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!",
        "nocookiesfornew": "Ο λογαριασμός χρήστη δεν δημιουργήθηκε, καθώς δεν μπορούσε να επιβεβαιώσει την πηγή του. \n Βεβαιωθείτε ότι έχετε ενεργοποιήσει τα cookies, ξαναφορτώστε αυτή τη σελίδα και προσπαθήστε ξανά.",
-       "createacct-loginerror": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î¼Îµ ÎµÏ\80ιÏ\84Ï\85Ï\87ία, Î±Î»Î»Î¬ Î´ÎµÎ½ Î¼Ï\80οÏ\81έÏ\83αÏ\84ε Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î±Ï\85Ï\84Ï\8cμαÏ\84α. Î Î±Ï\81ακαλÏ\8e [[Special:UserLogin|Ï\83Ï\85νδεθείÏ\84ε Ï\87ειÏ\81οκίνηÏ\84α]].",
+       "createacct-loginerror": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î¼Îµ ÎµÏ\80ιÏ\84Ï\85Ï\87ία, Î±Î»Î»Î¬ Î´ÎµÎ½ Î®Ï\84αν Î´Ï\85ναÏ\84Ï\8cν Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î±Ï\85Ï\84Ï\8cμαÏ\84α. Î Î±Ï\81ακαλοÏ\8dμε [[Special:UserLogin|Ï\83Ï\85νδεθείÏ\84ε Î¼Îµ Ï\84ο Ï\87έÏ\81ι]].",
        "noname": "Το όνομα χρήστη που έχετε καθορίσει δεν είναι έγκυρο.",
        "loginsuccesstitle": "Επιτυχής σύνδεση",
        "loginsuccess": "Είστε συνδεδεμένος(-η) στο {{SITENAME}} ως \"$1\".",
        "wrongpasswordempty": "Ο κωδικός πρόσβασης που εισάχθηκε ήταν κενός. Παρακαλούμε προσπαθήστε ξανά.",
        "passwordtooshort": "Οι κωδικοί πρέπει να περιέχουν τουλάχιστον {{PLURAL:$1|1 χαρακτήρα|$1 χαρακτήρες}}.",
        "passwordtoolong": "Οι κωδικοί πρόσβασης δεν μπορούν να υπερβαίνουν {{PLURAL:$1|τον 1 χαρακτήρα|τους $1 χαρακτήρες}}.",
-       "passwordtoopopular": "ΣÏ\85νήθÏ\89Ï\82 ÎµÏ\80ιλέγονÏ\84αι Î¿Î¹ ÎºÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î´ÎµÎ½ Î¼Ï\80οÏ\81οÏ\8dν Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιηθοÏ\8dν. Î Î±Ï\81ακαλÏ\8e ÎµÏ\80ιλέξÏ\84ε Î¼Î¹Î± Ï\80ιο Î¼Î¿Î½Î±Î´Î¹ÎºÏ\8c ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82.",
+       "passwordtoopopular": "Î\9aοινÏ\8cÏ\84Ï\85Ï\80α Ï\83Ï\85νθημαÏ\84ικά Ï\80οÏ\85 Ï\84είνοÏ\85ν Î½Î± ÎµÏ\80ιλέγονÏ\84αι Ï\83Ï\85Ï\87νά Î±Ï\80Ï\8c Ï\84οÏ\85Ï\82 Ï\87Ï\81ήÏ\83Ï\84εÏ\82 Î´ÎµÎ½ Î¼Ï\80οÏ\81οÏ\8dν Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιηθοÏ\8dν. Î Î±Ï\81ακαλοÏ\8dμε ÎµÏ\80ιλέξÏ\84ε ÎºÎ¬Ï\80οιο Ï\80ιο Î¼Î¿Î½Î±Î´Î¹ÎºÏ\8c Ï\83Ï\85νθημαÏ\84ικÏ\8c.",
        "password-name-match": "Ο κωδικός σου θα πρέπει να είναι διαφορετικός από το όνομα χρήστη σου.",
        "password-login-forbidden": "Η χρήση αυτού του ονόματος χρήστη και συνθηματικού έχουν  απαγορευτεί.",
        "mailmypassword": "Επαναφορά κωδικού",
        "resetpass_submit": "Δώστε κωδικό πρόσβασης και συνδεθείτε",
        "changepassword-success": "Ο κωδικός πρόσβασής σας άλλαξε!",
        "changepassword-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
-       "botpasswords": "Î\9aÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î³Î¹Î± Î\9cÏ\80οτ",
-       "botpasswords-summary": "<em>Î\9fι ÎºÏ\89δικοί Ï\84Ï\89ν Î¼Ï\80οÏ\84</em> Î´Î¯Î½Î¿Ï\85ν Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Î¼Î­Ï\83Ï\89 Ï\84οÏ\85 API Ï\87Ï\89Ï\81ίÏ\82 Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dνÏ\84αι Ï\84α Ï\83Ï\85νθημαÏ\84ικά Ï\84ηÏ\82 ÎºÏ\8dÏ\81ιαÏ\82 Ï\83Ï\8dνδεÏ\83ηÏ\82 Ï\84οÏ\85 Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d. Î¤Î± Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\8cÏ\84αν Î¼Îµ Ï\83Ï\8dνδεÏ\83η Î¼Î­Ï\83Ï\89 ÎºÏ\89δικοÏ\8d Î¼Ï\80οÏ\84 Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ¯Î½Î±Î¹ Ï\80εÏ\81ιοÏ\81ιÏ\83μένα.\n\nÎ\91ν Î´ÎµÎ½ Î¾Î­Ï\81εÏ\84ε Î³Î¹Î±Ï\84ί Î¸Î­Î»ÎµÏ\84ε Î½Î± Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε Î±Ï\85Ï\84Ï\8c, ÎºÎ±Î»Ï\8dÏ\84εÏ\81α Î½Î± Î¼Î·Î½ Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε. Î\9aανένα Î´ÎµÎ½ Î¸Î± Ï\80Ï\81έÏ\80ει Î½Î± Ï\83αÏ\82 Î¶Î·Ï\84ήÏ\83ει Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε Î­Î½Î± Ï\84έÏ\84οιο ÎºÏ\89δικÏ\8c ÎºÎ±Î¹ Î½Î± Ï\84οÏ\85 Ï\84ον γνωστοποιήσετε.",
-       "botpasswords-disabled": "Î\9fι ÎºÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\89ν Ï\81ομÏ\80Ï\8cÏ\84 ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένοι.",
-       "botpasswords-no-central-id": "Î\93ια Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84οÏ\85Ï\82 ÎºÏ\89δικοÏ\8dÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\89ν ρομπότ θα πρέπει να συνδεθείτε με έναν κεντρικό λογαριασμό.",
-       "botpasswords-existing": "Î¥Ï\80άÏ\81Ï\87ονÏ\84εÏ\82 ÎºÏ\89δικοί Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 ρομπότ",
-       "botpasswords-createnew": "Δημιουργία νέου κωδικού πρόσβασης ρομπότ",
-       "botpasswords-editexisting": "Επεξεργασία υπάρχοντος κωδικού πρόσβασης ρομπότ",
-       "botpasswords-label-appid": "Î\9fνομαÏ\83ία ρομπότ:",
+       "botpasswords": "ΣÏ\85νθημαÏ\84ικά Î³Î¹Î± Ï\81ομÏ\80Ï\8cτ",
+       "botpasswords-summary": "<em>Τα Ï\83Ï\85νθημαÏ\84ικά Î³Î¹Î± Ï\81ομÏ\80Ï\8cÏ\84</em> ÎµÏ\80ιÏ\84Ï\81έÏ\80οÏ\85ν Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Î¼Î­Ï\83Ï\89 Ï\84οÏ\85 API Ï\87Ï\89Ï\81ίÏ\82 Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dνÏ\84αι Ï\84α ÎºÏ\8dÏ\81ια Î´Î¹Î±Ï\80ιÏ\83Ï\84εÏ\85Ï\84ήÏ\81ια Ï\83Ï\8dνδεÏ\83ηÏ\82 Ï\84οÏ\85 Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d. Î¤Î± Î´Î¹Î±Î¸Î­Ï\83ιμα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\8cÏ\84αν ÎµÎ¯Î½Î±Î¹ Ï\83ε Ï\83Ï\8dνδεÏ\83η Î¼Î­Ï\83Ï\89 Ï\83Ï\85νθημαÏ\84ικοÏ\8d Î³Î¹Î± Ï\81ομÏ\80Ï\8cÏ\84 Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ¯Î½Î±Î¹ Ï\80εÏ\81ιοÏ\81ιÏ\83μένα.\n\nÎ\91ν Î´ÎµÎ½ Î¾Î­Ï\81εÏ\84ε Î³Î¹Î±Ï\84ί Î½Î± Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε Î±Ï\85Ï\84Ï\8c, ÎºÎ±Î»Ï\8dÏ\84εÏ\81α Î½Î± Î¼Î·Î½ Ï\84ο ÎºÎ¬Î½ÎµÏ\84ε. Î\9aανείÏ\82 Ï\80οÏ\84έ Î´ÎµÎ½ Ï\80Ï\81έÏ\80ει Î½Î± Ï\83αÏ\82 Î¶Î·Ï\84ήÏ\83ει Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε Î­Î½Î± Ï\84έÏ\84οιο Ï\83Ï\85νθημαÏ\84ικÏ\8c ÎºÎ±Î¹ Î½Î± Ï\84οÏ\85 Ï\84ο γνωστοποιήσετε.",
+       "botpasswords-disabled": "Τα Ï\83Ï\85νθημαÏ\84ικά Ï\84Ï\89ν Ï\81ομÏ\80Ï\8cÏ\84 ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένα.",
+       "botpasswords-no-central-id": "Î\93ια Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\83Ï\85νθημαÏ\84ικά Î³Î¹Î± ρομπότ θα πρέπει να συνδεθείτε με έναν κεντρικό λογαριασμό.",
+       "botpasswords-existing": "Î¥Ï\80άÏ\81Ï\87ονÏ\84α Ï\83Ï\85νθημαÏ\84ικά ρομπότ",
+       "botpasswords-createnew": "Δημιουργία νέου συνθηματικού ρομπότ",
+       "botpasswords-editexisting": "Επεξεργασία υπάρχοντος συνθηματικού ρομπότ",
+       "botpasswords-label-appid": "Î\8cνομα Ï\84οÏ\85 ρομπότ:",
        "botpasswords-label-create": "Δημιουργία",
        "botpasswords-label-update": "Ενημέρωση",
        "botpasswords-label-cancel": "Ακύρωση",
        "botpasswords-label-delete": "Διαγραφή",
-       "botpasswords-label-resetpassword": "Επαναφορά κωδικού",
+       "botpasswords-label-resetpassword": "Επαναφορά του συνθηματικού",
        "botpasswords-label-grants": "Ισχύουσες άδειες:",
-       "botpasswords-help-grants": "Î\9aάθε Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η Î´Î¯Î½ÎµÎ¹ Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83Ï\84α Î¿Ï\81ιÏ\83μένα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Ï\80οÏ\85 Î®Î´Î· Î­Ï\87ει Î­Î½Î±Ï\82 Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η. Î\94είÏ\84ε Ï\84η [[Special:ListGrants|Ï\80ίνακαÏ\82 παραχωρήσεων]] για περισσότερες πληροφορίες.",
+       "botpasswords-help-grants": "ΠαÏ\81αÏ\87Ï\89Ï\81εί Ï\84ην Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î®Î´Î· ÎºÎ±Ï\84έÏ\87ονÏ\84αι Î±Ï\80Ï\8c Ï\84ο Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82. Î\95νεÏ\81γοÏ\80οίηÏ\83η Î¼Î¹Î±Ï\82 Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83ηÏ\82 ÎµÎ´Ï\8e Î´ÎµÎ½ Ï\80αÏ\81έÏ\87ει Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84ηÏ\82 Ï\83αÏ\82 Î´Î¹Î±Ï\86οÏ\81εÏ\84ικά Î´ÎµÎ½ Î¸Î± ÎµÎ¯Ï\87ε. Î\94είÏ\84ε Ï\84ον [[Special:ListGrants|Ï\80ίνακα παραχωρήσεων]] για περισσότερες πληροφορίες.",
        "botpasswords-label-grants-column": "Χορηγήθηκε",
-       "botpasswords-bad-appid": "Î\97 Î¿Î½Î¿Î¼Î±Ï\83ία Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Â«$1» Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81η.",
+       "botpasswords-bad-appid": "Το Ï\8cνομα Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Â«$1» Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81ο.",
        "botpasswords-insert-failed": "Αποτυχία να προστεθεί το όνομα bot \"$1\". Έχει ήδη προστεθεί;",
-       "botpasswords-update-failed": "Î\91Ï\80οÏ\84Ï\85Ï\87ία ÎµÎ½Î·Î¼Î­Ï\81Ï\89Ï\83ηÏ\82 Ï\84ηÏ\82 Î¿Î½Î¿Î¼Î±Ï\83ίαÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Â«$1». Î\9cήÏ\80Ï\89Ï\82 Î´Î¹Î±Î³Ï\81άÏ\86Ï\84ηκε Î¿ ÎºÏ\89δικÏ\8cÏ\82;",
-       "botpasswords-created-title": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 του ρομπότ δημιουργήθηκε",
-       "botpasswords-created-body": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î³Î¹Î± Ï\84ο Ï\8cνομα Ï\81ομÏ\80Ï\8cÏ\84 \"$1\" Ï\84οÏ\85 Ï\87Ï\81ήÏ\83Ï\84η \"$2\" δημιουργήθηκε.",
-       "botpasswords-updated-title": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 του ρομπότ ενημερώθηκε",
-       "botpasswords-updated-body": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 «$1» του χρήστη «$2» ενημερώθηκε.",
-       "botpasswords-deleted-title": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Î´Î¹Î±Î³Ï\81άÏ\86Ï\84ηκε",
+       "botpasswords-update-failed": "Î\91Ï\80οÏ\84Ï\85Ï\87ία ÎµÎ½Î·Î¼Î­Ï\81Ï\89Ï\83ηÏ\82 Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Î¼Îµ Ï\8cνομα Â«$1». Î\9cήÏ\80Ï\89Ï\82 Î´Î¹Î±Î³Ï\81άÏ\86ηκε;",
+       "botpasswords-created-title": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c του ρομπότ δημιουργήθηκε",
+       "botpasswords-created-body": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Î³Î¹Î± Ï\84ο Ï\81ομÏ\80Ï\8cÏ\84 Î¼Îµ Ï\8cνομα Â«$1» Ï\84οÏ\85 Ï\87Ï\81ήÏ\83Ï\84η Â«$2» δημιουργήθηκε.",
+       "botpasswords-updated-title": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c του ρομπότ ενημερώθηκε",
+       "botpasswords-updated-body": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Î³Î¹Î± Ï\84ο Ï\81ομÏ\80Ï\8cÏ\84 Î¼Îµ Ï\8cνομα «$1» του χρήστη «$2» ενημερώθηκε.",
+       "botpasswords-deleted-title": "Το Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\84οÏ\85 Ï\81ομÏ\80Ï\8cÏ\84 Î´Î¹Î±Î³Ï\81άÏ\86ηκε",
        "botpasswords-deleted-body": "Ο κωδικός πρόσβασης για το όνομα ρομπότ \"$1\" του χρήστη \"$2\" διαγράφηκε.",
        "botpasswords-newpassword": "Ο νέος κωδικός πρόσβασης για να συνδεθείτε με το <strong>$1</strong> είναι <strong>$2</strong>. <em>Παρακαλούμε σημειώστε το για μελλοντική αναφορά.</em><br />(Για παλιά bot που απαιτούν το όνομα σύνδεσης να είναι το ίδιο με το τελικό όνομα χρήστη, μπορείτε επίσης να χρησιμοποιήσετε το  <strong>$3</strong> ως όνομα χρήστη και <strong>$4</strong> ως κωδικό.)",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider δεν είναι διαθέσιμο.",
+       "botpasswords-no-provider": "Το BotPasswordsSessionProvider δεν είναι διαθέσιμο.",
        "botpasswords-restriction-failed": "Περιορισμοί κωδικών πρόσβασης bot εμποδίζουν τη συγκεκριμένη σύνδεση.",
-       "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό κωδικό πρόσβασης bot (\"$1\").",
-       "botpasswords-not-exist": "Ο χρήστης \"$1\" δεν έχει κωδικό bot με όνομα \"$2\"",
+       "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό συνθηματικού ρομπότ («$1»).",
+       "botpasswords-not-exist": "Ο χρήστης «$1» δεν έχει συνθηματικό για ρομπότ με όνομα «$2».",
        "resetpass_forbidden": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν",
        "resetpass_forbidden-reason": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν: $1",
        "resetpass-no-info": "Πρέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας",
        "passwordreset-emailsentemail": "Αν αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου συνδέεται με το  λογαριασμό σας, τότε  θα σας αποσταλεί μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-emailsentusername": "Αν υπάρχει μια διεύθυνση ηλεκτρονικού ταχυδρομείου που συνδέεται με αυτό το όνομα χρήστη, τότε θα σας αποσταλεί ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-invalidemail": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "passwordreset-nodata": "Δεν δόθηκε όνομα χρήστη ή διεύθυνση email.",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
        "missingcommenttext": "Παρακαλούμε εισαγάγετε σχόλιο παρακάτω.",
        "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
-       "summary-preview": "Προεπισκόπηση σύνοψης:",
+       "summary-preview": "Προεπισκόπηση σύνοψης επεξεργασίας:",
        "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
        "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
-       "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτία που δόθηκε είναι ο εξής:\n\n:''$2''\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με έναν από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΣημειώστε ότι δεν μπορείτε να χρησιμοποιήσετε το χαρακτηριστικό \"στείλτε e-mail σε αυτό τον χρήστη\" εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρημένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής σας είναι #$5. Παρακαλώ συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτιολόγηση που δόθηκε είναι η εξής:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με κάποιον από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΝα σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3 και το αναγνωριστικό της φραγής σας είναι #$5. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "systemblockedtext": "Το όνομα χρήστη σας ή η διεύθυνση IP έχει αποκλειστεί αυτόματα από το MediaWiki.\nΗ αιτία που δόθηκε είναι:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Στόχος φραγής: $7\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3.\nΠαρακαλούμε να συμπεριλάβετε όλα τα παραπάνω στοιχεία σε τυχόν απορίες σας.",
        "blockednoreason": "δεν δόθηκε λόγος",
        "whitelistedittext": "Πρέπει να $1 για να επεξεργαστείτε σελίδες.",
-       "confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση e-mail σας πριν μπορέσετε να επεξεργαστείτε σελίδες. Παρακαλώ θέστε και επικυρώστε την διεύθυνση e-mail σας μέσω των [[Special:Preferences|προτιμήσεων χρήστη]] σας.",
+       "confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου πριν μπορέσετε να επεξεργαστείτε σελίδες. Παρακαλούμε καθορίστε και επικυρώστε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου μέσω των [[Special:Preferences|προτιμήσεων χρήστη]] σας.",
        "nosuchsectiontitle": "Δεν υπάρχει τέτοιο τμήμα",
        "nosuchsectiontext": "Προσπαθήσατε να επεξεργαστείτε μια ενότητα που δεν υπάρχει. Μπορεί να έχει μετακινηθεί ή διαγραφεί, ενώ βλέπατε τη σελίδα.",
        "loginreqtitle": "Απαιτείται η σύνδεση του χρήστη.",
        "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": "Δεν υπάρχει αναθεώρηση με αριθμό $1 για τη σελίδα με όνομα «{{FULLPAGENAME}}».\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο ιστορικού προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
-       "userpage-userdoesnotexist": "Î\9f Î\9bογαÏ\81ιαÏ\83μÏ\8cÏ\82 Ï\84οÏ\85 Ï\87Ï\81ήÏ\83Ï\84η \"<nowiki>$1</nowiki>\" Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ ÎºÎ±Ï\84αÏ\87Ï\89Ï\81ημένοÏ\82. Î Î±Ï\81ακαλÏ\8e Î´ÎµÎ¯Ï\84ε Î±Î½ Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε/εÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î±Ï\85Ï\84ή τη σελίδα.",
+       "userpage-userdoesnotexist": "Î\9f Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η Â«$1» Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ ÎµÎ³Î³ÎµÎ³Ï\81αμμένοÏ\82. Î Î±Ï\81ακαλοÏ\8dμε ÎµÎ»Î­Î³Î¾Ï\84ε Î±Î½ Î¸Î± Î¸Î­Î»Î±Ï\84ε Î½Î± Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε/εÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î±Ï\85Ï\84ήν τη σελίδα.",
        "userpage-userdoesnotexist-view": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "blocked-notice-logextract": "Επί του παρόντος, αυτός ο χρήστης έχει υποστεί φραγή. Παρακάτω παρέχεται για αναφορά η πιο πρόσφατη καταχώρηση του αρχείου φραγών.",
-       "clearyourcache": "''' Σημείωση:''' μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n * '''Firefox / Safari:''' Κρατήστε πατημένο το ''Shift'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'' ή πιέστε ''Ctrl-F5'' ή ''Ctrl-R'' ('' ⌘-R'' σε Mac)\n * '''Google Chrome:''' Πιέστε ''Ctrl-Shift-R'' (''⌘-Shift-R'' σε Mac)\n * '''Internet Explorer:''' Κρατήστε πατημένο το ''Ctrl'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'', ή πιέστε ''Ctrl-F5'' \n * '''Opera:''' Εκκαθαρίστε την προσωρινή μνήμη από το μενού ''Εργαλεία → Προτιμήσεις''",
+       "clearyourcache": "<strong>Σημείωση:</strong> μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n* <strong>Firefox / Safari:</strong> Κρατήστε πατημένο το <em>Shift</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em> ή πιέστε <em>Ctrl-F5</em> ή <em>Ctrl-R</em> (<em>⌘-R</em> σε Mac)\n* <strong>Google Chrome:</strong> Πιέστε <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> σε Mac)\n* <strong>Internet Explorer:</strong> Κρατήστε πατημένο το <em>Ctrl</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em>, ή πιέστε <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Εκκαθαρίστε την προσωρινή μνήμη από το μενού <em>Εργαλεία → Προτιμήσεις</em>",
        "usercssyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τα νέα σας CSS πριν τα αποθηκεύσετε.",
        "userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
        "usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
        "previewnote": "'''Να θυμάστε ότι αυτή είναι μόνο μια προεπισκόπηση.'''\nΟι αλλαγές σας δεν έχουν ακόμη αποθηκευτεί!",
        "continue-editing": "Μεταβείτε στην περιοχή επεξεργασίας",
        "previewconflict": "Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.",
-       "session_fail_preview": "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\nΠαρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι.'''",
-       "session_fail_preview_html": "'''Λυπούμαστε! Δεν μπορέσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.'''\n\n<em>Επειδή το {{SITENAME}} επιτρέπει την εισαγωγή ακατέργαστου HTML, η προεπισκόπηση είναι κρυμμένη ως προφύλαξη ενάντια σε επιθέσεις με Javascript.</em>\n\n<strong>Αν αυτή είναι μια έγκυρη προσπάθεια επεξεργασίας, παρακαλώ προσπαθήστε ξανά..</strong> Αν και πάλι δε λειτουργεί, δοκιμάστε να [[[[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι και δείτε αν ο φυλλομετρητής σας επιτρέπει cookies απ'αυτόν τον ιστότοπο.",
-       "token_suffix_mismatch": "'''Η επεξεργασία σας απορρίφθηκε γιατί το πρόγραμμα-πελάτη σας κατακρεούργησε τους χαρακτήρες στίξης στο κουπόνι επεξεργασίας. Η επεξεργασία απορρίφθηκε για να αποφευχθεί η παραφθορά του κειμένου της σελίδας.\nΑυτό μερικές φορές συμβαίνει όταν χρησιμοποιείται ένας ανώνυμος διακομιστής μεσολάβησης διαθέσιμος μέσω του παγκόσμιου ιστού με σφάλματα.'''",
-       "edit_form_incomplete": "'''Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Ελέγξτε ότι οι αλλαγές σας είναι άθικτες και προσπαθήστε ξανά.'''",
+       "session_fail_preview": "Λυπούμαστε! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\n\nΜπορεί να έχετε αποσυνδεθεί. <strong>Παρακαλούμε επιβεβαιώστε ότι βρίσκεστε ακόμα σε σύνδεση και προσπαθήστε ξανά</strong>.\nΑν εξακολουθεί να μην λειτουργεί, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε ξανά, και βεβαιωθείτε ότι το πρόγραμμα περιήγησής σας επιτρέπει cookies από αυτόν τον ιστότοπο.",
+       "session_fail_preview_html": "Λυπούμαστε! Δεν μπορέσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.\n\n<em>Επειδή το {{SITENAME}} επιτρέπει την εισαγωγή ακατέργαστου HTML, η προεπισκόπηση είναι κρυμμένη ως προφύλαξη ενάντια σε επιθέσεις με Javascript.</em>\n\n<strong>Αν αυτή είναι μια έγκυρη προσπάθεια επεξεργασίας, Παρακαλούμε προσπαθήστε ξανά.</strong>\nΑν και πάλι δεν λειτουργεί, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε ξανά και βεβαιωθείτε ότι το πρόγραμμα περιήγησής σας επιτρέπει cookies από αυτόν τον ιστότοπο.",
+       "token_suffix_mismatch": "<strong>Η επεξεργασία σας απορρίφθηκε γιατί το πρόγραμμα-πελάτης σας κατακρεούργησε τους χαρακτήρες στίξης στο κουπόνι επεξεργασίας.</strong>\nΗ επεξεργασία απορρίφθηκε για να αποφευχθεί η παραφθορά του κειμένου της σελίδας.\nΑυτό μερικές φορές συμβαίνει όταν χρησιμοποιείτε κάποια ελαττωματική ανώνυμη υπηρεσία διαμεσολάβησης μέσω Ιστού.",
+       "edit_form_incomplete": "<strong>Ορισμένα τμήματα της φόρμας επεξεργασίας δεν έφθασαν στο διακομιστή. Διπλο-ελέγξτε ότι οι επεξεργασίες σας είναι άθικτες και προσπαθήστε ξανά.</strong>",
        "editing": "Επεξεργασία $1",
        "creating": "Δημιουργία: $1",
        "editingsection": "Επεξεργασία $1 (ενότητα)",
        "parser-unstrip-loop-warning": "εντοπίστηκε ένας βρόχος unstrip",
        "parser-unstrip-recursion-limit": "Υπέρβαση του ορίου αναδρομής Unstrip ($1)",
        "converter-manual-rule-error": "Εντοπίστηκε σφάλμα σε μη αυτόματο κανόνα μετατροπής γλώσσας",
-       "undo-success": "Η επεξεργασία μπορεί να αναστραφεί. Παρακαλώ ελέγξτε την σύγκριση παρακάτω για να επιβεβαιώσετε ότι αυτό είναι το οποίο θέλετε να κάνετε, και έπειτα αποθηκεύστε τις αλλαγές παρακάτω για να τελειώσετε την αναστροφή της επεξεργασίας.",
+       "undo-success": "Η επεξεργασία μπορεί να αναιρεθεί.\nΠαρακαλούμε ελέγξτε την σύγκριση παρακάτω για να επιβεβαιώσετε ότι είναι αυτό το οποίο θέλετε να κάνετε και έπειτα αποθηκεύστε τις αλλαγές παρακάτω για να ολοκληρώσετε την αναίρεση της επεξεργασίας.",
        "undo-failure": "Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.",
        "undo-norev": "Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.",
        "undo-nochange": "Η επεξεργασία φαίνεται να έχει ήδη αναιρεθεί.",
        "search-interwiki-caption": "Αδελφικά εγχειρήματα",
        "search-interwiki-default": "$1 αποτελέσματα:",
        "search-interwiki-more": "(περισσότερα)",
+       "search-interwiki-more-results": "περισσότερα αποτελέσματα",
        "search-relatedarticle": "Σχετικά",
        "searchrelated": "σχετικά",
        "searchall": "όλα",
        "search-external": "Εξωτερική αναζήτηση",
        "searchdisabled": "Η αναζήτηση για τον ιστότοπο \"{{SITENAME}}\" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου \"{{SITENAME}}\" μπορεί να είναι απαρχαιωμένοι.",
        "search-error": "Παρουσιάστηκε σφάλμα κατά την αναζήτηση:$1",
+       "search-warning": "Παρουσιάστηκε προειδοποίηση κατά την αναζήτηση: $1",
        "preferences": "Προτιμήσεις",
        "mypreferences": "Προτιμήσεις",
        "prefs-edits": "Αριθμός επεξεργασιών:",
-       "prefsnologintext2": "Παρακαλώ συνδεθείτε για να αλλάξετε τις προτιμήσεις σας.",
+       "prefsnologintext2": "Παρακαλούμε συνδεθείτε για να αλλάξετε τις προτιμήσεις σας.",
        "prefs-skin": "Θέμα εμφάνισης",
        "skin-preview": "Προεπισκόπηση",
        "datedefault": "Χωρίς προτίμηση",
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "username": "{{GENDER:$1|Όνομα χρήστη}}:",
        "prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
+       "group-membership-link-with-expiry": "$1 (μέχρι τις $3 στις $4)",
        "prefs-registration": "Χρόνος εγγραφής:",
        "yourrealname": "Πραγματικό όνομα:",
        "yourlanguage": "Γλώσσα:",
        "prefswarning-warning": "Έχετε κάνει αλλαγές στις προτιμήσεις σας που δεν έχουν αποθηκευτεί ακόμα.\nΕάν αφήσετε αυτή τη σελίδα χωρίς να κάνετε κλικ στο \"$1\" οι προτιμήσεις σας δεν θα ενημερωθούν.",
        "prefs-tabs-navigation-hint": "Συμβουλή: Μπορείτε να χρησιμοποιήσετε τα πλήκτρα διευθύνσεων αριστερά και δεξιά για να πλοηγηθείτε μεταξύ των καρτελών στη λίστα καρτελών.",
        "userrights": "Διαχείριση δικαιωμάτων χρηστών",
-       "userrights-lookup-user": "Î\94ιαÏ\87είÏ\81ιÏ\83η Î¿Î¼Î¬Î´Ï\89ν Ï\87Ï\81ηÏ\83Ï\84Ï\8eν",
+       "userrights-lookup-user": "Î\95Ï\80ιλέξÏ\84ε Ï\87Ï\81ήÏ\83Ï\84η",
        "userrights-user-editname": "Δηλώστε όνομα χρήστη:",
-       "editusergroup": "Î\95Ï\80εξεÏ\81γαÏ\83ία {{GENDER:$1|ομάδÏ\89ν}} χρηστών",
+       "editusergroup": "ΦÏ\8cÏ\81Ï\84Ï\89Ï\83η Î¿Î¼Î¬Î´Ï\89ν χρηστών",
        "editinguser": "Αλλαγή δικαιωμάτων χρήστη {{GENDER:$1|του χρήστη|της χρήστριας}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Επεξεργασία ομάδων χρηστών",
        "saveusergroups": "Αποθήκευση {{GENDER:$1|ομάδων}}  χρηστών",
        "userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
-       "userrights-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.",
+       "userrights-expiry-current": "Λήγει στις $2 στις $3",
+       "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-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλούμε επανεξετάστε και επικυρώστε τις αλλαγές σας.",
        "group": "Ομάδα:",
        "group-user": "Χρήστες",
        "group-autoconfirmed": "Αυτοεπιβεβαιωμένοι χρήστες",
        "right-editmyprivateinfo": "Επεξεργαστείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
        "right-editmyoptions": "Επεξεργασία των προτιμήσεών σας",
        "right-rollback": "Γρήγορη αναστροφή των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια σελίδα",
-       "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών μποτ",
+       "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών ρομπότ",
        "right-noratelimit": "Να μην επηρεάζεται από τα όρια ρυθμού",
        "right-import": "Εισαγωγή σελίδων από άλλα wikis",
        "right-importupload": "Εισαγωγή σελίδων με ανέβασμα αρχείου",
        "right-override-export-depth": "Εξαγωγή σελίδων συμπεριλαμβάνοντας συνδεδεμένες σελίδες έως ένα βάθος 5 επιπέδων",
        "right-sendemail": "Αποστολή ηλεκτρονικού μηνύματος σε άλλους χρήστες",
        "right-managechangetags": "Δημιουργία και (απ)ενεργοποίηση [[Special:Tags|ετικετών]]",
-       "right-applychangetags": "Εφαρμόστε [[Special:Tags|ετικέτες]] μαζί με τις αλλαγές",
+       "right-applychangetags": "Εφαρμογή [[Special:Tags|ετικετών]] παράλληλα με τις όποιες αλλαγές κάνει κάποιος",
        "right-changetags": "Προσθέστε και αφαιρέστε αυθαίρετες [[Special:Tags|ετικέτες]] σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "right-deletechangetags": "Διαγραφή [[Special:Tags|ετικετών]] από τη βάση δεδομένων",
        "grant-group-page-interaction": "Αλληλεπίδραση με σελίδες",
        "grant-blockusers": "Φραγή και αναίρεση φραγής χρηστών",
        "grant-createaccount": "Δημιουργία λογαριασμών",
        "grant-createeditmovepage": "Δημιουργία, επεξεργασία και μετακίνηση σελίδων",
-       "grant-delete": "Διαγραφή σελίδων, αναθεωρήσεων, και αρχείων καταγραφής",
-       "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και της CSS/JavaScript χρήστη",
-       "grant-editmycssjs": "Επεξεργαστείτε το δικό σας CSS/JavaScript",
-       "grant-editmyoptions": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\84Ï\89ν Ï\80Ï\81οÏ\84ιμήÏ\83εÏ\8eν χρήστη σας",
+       "grant-delete": "Διαγραφή σελίδων, αναθεωρήσεων και καταχωρίσεων σε αρχεία καταγραφής",
+       "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και των CSS/JavaScript των χρηστών",
+       "grant-editmycssjs": "Επεξεργασία των CSS/JavaScript χρήστη σας",
+       "grant-editmyoptions": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\84Ï\89ν Ï\80Ï\81οÏ\84ιμήÏ\83εÏ\89ν χρήστη σας",
        "grant-editmywatchlist": "Επεξεργασία της λίστας παρακολούθησής σας",
        "grant-editpage": "Επεξεργασία υπαρχουσών σελίδων",
        "grant-editprotected": "Επεξεργασία προστατευμένων σελίδων",
-       "grant-highvolume": "Î¥Ï\88ηλήÏ\82 Î­Î½Ï\84αÏ\83ηÏ\82 ÎµÏ\80εξεÏ\81γαÏ\83ία",
+       "grant-highvolume": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\85Ï\88ηλοÏ\8d Ï\8cγκοÏ\85",
        "grant-oversight": "Απόκρυψη χρηστών και καταστολή αναθεωρήσεων",
        "grant-patrol": "Περιπολία αλλαγών σε σελίδες",
        "grant-privateinfo": "Πρόσβαση σε προσωπικές πληροφορίες",
        "grant-protect": "Προστασία και κατάργηση προστασίας σελίδων",
-       "grant-rollback": "Î\97 Îµπαναφορά αλλαγών σε σελίδες",
+       "grant-rollback": "Î\95παναφορά αλλαγών σε σελίδες",
        "grant-sendemail": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε άλλους χρήστες",
-       "grant-uploadeditmovefile": "Ανέβασμα, αντικατάσταση, και μετακίνηση αρχείων",
+       "grant-uploadeditmovefile": "Ανέβασμα, αντικατάσταση και μετακίνηση αρχείων",
        "grant-uploadfile": "Ανέβασμα νέων αρχείων",
        "grant-basic": "Βασικά δικαιώματα",
-       "grant-viewdeleted": "Î\94είÏ\84ε Ï\84α Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένα Î±Ï\81Ï\87εία ÎºÎ±Î¹ Ï\83ελίδεÏ\82",
+       "grant-viewdeleted": "ΠÏ\81οβολή Î´Î¹Î±Î³ÎµÎ³Ï\81αμμένÏ\89ν Î±Ï\81Ï\87είÏ\89ν ÎºÎ±Î¹ Ï\83ελίδÏ\89ν",
        "grant-viewmywatchlist": "Προβολή της λίστας παρακολούθησής σας",
+       "grant-viewrestrictedlogs": "Προβολή υποκείμενων σε περιορισμούς καταχωρίσεων στα αρχεία καταγραφών",
        "newuserlogpage": "Αρχείο καταγραφών δημιουργίας χρηστών",
        "newuserlogpagetext": "Αυτή είναι μια καταγραφή δημιουργίας χρηστών.",
        "rightslog": "Αρχείο καταγραφών δικαιωμάτων χρηστών",
        "action-upload_by_url": "να επιφορτώσετε αυτό το αρχείο από μια διεύθυνση URL",
        "action-writeapi": "να χρησιμοποιήσετε το API για εγγραφή",
        "action-delete": "να διαγράψετε αυτή τη σελίδα",
-       "action-deleterevision": "να διαγράψετε αυτή την έκδοση",
-       "action-deletedhistory": "να προβάλετε το διαγεγραμμένο ιστορικό αυτής της σελίδας",
+       "action-deleterevision": "διαγράψετε αναθεωρήσεις",
+       "action-deletelogentry": "διαγράψτε καταχωρήσεις καταγραφών",
+       "action-deletedhistory": "προβάλετε διαγεγραμμένο ιστορικό σελίδας",
+       "action-deletedtext": "να προβάλετε κείμενο διαγεγραμμένων αναθεωρήσεων",
        "action-browsearchive": "να αναζητήσετε διαγεγραμμένες σελίδες",
-       "action-undelete": "να Î±ÎºÏ\85Ï\81Ï\8eÏ\83εÏ\84ε Ï\84η Î´Î¹Î±Î³Ï\81αÏ\86ή Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82",
-       "action-suppressrevision": "να ÎµÏ\80ιθεÏ\89Ï\81ήÏ\83εÏ\84ε ÎºÎ±Î¹ Î±Ï\80οκαÏ\84αÏ\83Ï\84ήÏ\83εÏ\84ε Î±Ï\85Ï\84ή Ï\84ην ÎºÏ\81Ï\85μμένη Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η",
+       "action-undelete": "να Î±Î½Î±Î¹Ï\81έÏ\83εÏ\84ε Ï\84η Î´Î¹Î±Î³Ï\81αÏ\86ή Ï\83ελίδÏ\89ν",
+       "action-suppressrevision": "να ÎµÏ\80ιθεÏ\89Ï\81ήÏ\83εÏ\84ε ÎºÎ±Î¹ Î½Î± Î±Ï\80οκαÏ\84αÏ\83Ï\84ήÏ\83εÏ\84ε ÎºÏ\81Ï\85μμένεÏ\82 Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83ειÏ\82",
        "action-suppressionlog": "να δείτε αυτόν τον ιδιωτικό κατάλογο",
        "action-block": "να φράξετε τις επεξεργασίες αυτού του χρήστη",
        "action-protect": "να αλλάξετε τα επίπεδα προστασίας για αυτή τη σελίδα",
        "action-userrights-interwiki": "επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki",
        "action-siteadmin": "να κλειδώσετε ή ξεκλειδώσετε τη βάση δεδομένων",
        "action-sendemail": "αποστείλετε μηνύματα ηλεκτρονικού ταχυδρομείου",
+       "action-editmyoptions": "επεξεργαστείτε τις προτιμήσεις σας",
        "action-editmywatchlist": "επεξεργαστείτε τη λίστα παρακολούθησής σας",
        "action-viewmywatchlist": "προβάλετε τη λίστα παρακολούθησής σας",
        "action-viewmyprivateinfo": "προβάλετε τις προσωπικές σας πληροφορίες",
        "action-editmyprivateinfo": "επεξεργαστείτε τις προσωπικές σας πληροφορίες",
        "action-editcontentmodel": "επεξεργαστείτε το μοντέλο περιεχομένου σελίδας",
        "action-managechangetags": "δημιουργήσετε και διαγράψετε ετικέτες από τη βάση δεδομένων",
-       "action-applychangetags": "εφαρμογή ετικετών μαζί με τις αλλαγές σας",
+       "action-applychangetags": "εφαρμογή ετικετών παράλληλα με τις αλλαγές σας",
        "action-changetags": "πρόσθεση και αφαίρεση αυθαίρετων ετικετών σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "action-deletechangetags": "διαγράψετε ετικέτες από τη βάση δεδομένων",
        "action-purge": "εκκαθάριση αυτής της σελίδας",
        "recentchanges-noresult": "Χωρίς αλλαγές κατά τη διάρκεια της συγκεκριμένης χρονικής περιόδου, με αυτά τα κριτήρια.",
        "recentchanges-feed-description": "Παρακολούθηση των πιο πρόσφατων αλλαγών στο wiki σε αυτή τη ροή.",
        "recentchanges-label-newpage": "Αυτή η επεξεργασία δημιούργησε μια νέα σελίδα",
-       "recentchanges-label-minor": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¼Î¹ÎºÏ\81ή Ï\84Ï\81οÏ\80οÏ\80οίηÏ\83η",
+       "recentchanges-label-minor": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¼Î¹ÎºÏ\81οεÏ\80εξεÏ\81γαÏ\83ία",
        "recentchanges-label-bot": "Αυτή η επεξεργασία έγινε από ένα ρομπότ",
        "recentchanges-label-unpatrolled": "Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Προβολή",
+       "rcfilters-activefilters": "Ενεργά φίλτρα",
        "rcfilters-restore-default-filters": "Επαναφορά προεπιλεγμένων φίλτρων",
        "rcfilters-clear-all-filters": "Εκκαθάριση όλων των φίλτρων",
+       "rcfilters-search-placeholder": "Φιλτράρισμα πρόσφατων αλλαγών (περιηγηθείτε ή αρχίστε να πληκτρολογείτε)",
+       "rcfilters-invalid-filter": "Μη έγκυρο φίλτρο",
        "rcfilters-empty-filter": "Χωρίς ενεργά φίλτρα. Εμφανίζονται όλες οι συνεισφορές.",
+       "rcfilters-filterlist-title": "Φίλτρα",
+       "rcfilters-filterlist-noresults": "Δεν βρέθηκαν φίλτρα",
+       "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-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-filtergroup-automated": "Αυτοματοποιημένες συνεισφορές",
+       "rcfilters-filter-bots-label": "Ρομπότ",
+       "rcfilters-filter-bots-description": "Επεξεργασίες που έγιναν από αυτοματοποιημένα εργαλεία.",
+       "rcfilters-filter-humans-label": "Ανθρώπινες (όχι από ρομπότ)",
+       "rcfilters-filter-humans-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": "Επεξεργασίες σε περιεχόμενο του 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": "Διαχειριστικές ενέργειες, δημιουργίες λογαριασμών, διαγραφές σελίδων, ανεβάσματα αρχείων....",
        "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
-       "rcshowhideminor": "$1 μικρών τροποποιήσεων",
+       "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "rcshowhideminor-hide": "Απόκρυψη",
        "rcshowhidebots": "$1 ρομπότ",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
        "upload-tryagain": "Υποβολή τροποποιημένης περιγραφής αρχείου",
        "uploadnologin": "Δεν έχετε συνδεθεί!",
-       "uploadnologintext": "Παρακαλώ $1 για να επιφορτώσετε αρχεία.",
+       "uploadnologintext": "Παρακαλούμε $1 για να ανεβάσετε αρχεία.",
        "upload_directory_missing": "Λείπει το αποθηκευτήριο επιφορτώσεων ($1) και δεν μπορεί να δημιουργηθεί από τον webserver.",
        "upload_directory_read_only": "Δεν είναι δυνατή η εγγραφή στον κατάλογο ($1) από τον server.",
        "uploaderror": "Σφάλμα στο ανέβασμα αρχείου",
        "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε {{GENDER:|σίγουρος|σίγουρη}} αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
        "filepageexists": "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά αυτήν τη στιγμή δεν υπάρχει αρχείο με αυτό το όνομα.\nΗ σύνοψη που εισαγάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.\nΓια να εμφανιστεί η σύνοψή σας εκεί, θα χρειαστεί να την επεξεργαστείτε με το χέρι.\n[[$1|thumb]]",
        "fileexists-extension": "Υπάρχει ένα αρχείο με παρόμοιο όνομα: [[$2|thumb]]\n* Όνομα του προς ανέβασμα αρχείου: <strong>[[:$1]]</strong>\n* Όνομα υπάρχοντος αρχείου: <strong>[[:$2]]</strong>\nΜήπως θα θέλατε να χρησιμοποιήσετε κάποιο όνομα που να ξεχωρίζει περισσότερο;",
-       "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
+       "fileexists-thumbnail-yes": "Το αρχείο φαίνεται να είναι μια εικόνα μειωμένου μεγέθους <em>(μικρογραφία)</em>. \n[[$1|thumb]]\nΠαρακαλούμε ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το υπό έλεγχο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να ανεβάσετε κάποια επιπλέον μικρογραφία.",
        "file-thumbnail-no": "Το όνομα αρχείου αρχίζει με <strong>$1</strong>.\nΦαίνεται πως είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''.\nΑν έχετε αυτή την εικόνα σε πλήρη ανάλυση, επιφορτώστε τη, αλλιώς αλλάξτε παρακαλώ το όνομα του αρχείου.",
        "fileexists-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη στο χώρο φύλαξης κοινών αρχείων.\nΕάν θέλετε παρ' όλ' αυτά να επιφορτώσετε το δικό σας αρχείο, παρακαλούμε πηγαίνετε πίσω και χρησιμοποιήστε ένα νέο όνομα. [[File:$1|thumb|center|$1]]",
        "file-deleted-duplicate": "Αρχείο παρόμοιο με αυτό εδώ ([[:$1]]) έχει προηγουμένως διαγραφεί. Θα πρέπει να ελέγξετε το ιστορικό διαγραφής του πριν να προχωρήσετε στην επαναφόρτωσή του.",
        "file-deleted-duplicate-notitle": "Ένα αρχείο πανομοιότυπο με αυτό έχει προηγουμένως διαγραφεί, και ο τίτλος έχει κατασταλεί.\nΘα πρέπει να ζητήσετε από κάποιον με την δυνατότητα προβολής κατεσταλμένου αρχείου δεδομένων για να εξετάσει την κατάσταση προτού προχωρήσετε σε επαναφόρτωση του.",
        "uploadwarning": "Προειδοποίηση φόρτωσης",
-       "uploadwarning-text": "Παρακαλώ αλλάξτε την περιγραφή του αρχείου παρακάτω και προσπαθήστε ξανά.",
+       "uploadwarning-text": "Παρακαλούμε τροποποιήστε την περιγραφή του αρχείου παρακάτω και προσπαθήστε ξανά.",
        "savefile": "Αποθήκευση αρχείου",
        "uploaddisabled": "Το ανέβασμα αρχείων είναι απενεργοποιημένο.",
        "copyuploaddisabled": "Το ανέβασμα μέσω URL έχει απενεργοποιηθεί.",
        "uploaded-setting-handler-svg": "Κάθε SVG που θέτει το χαρακτηριστικό «χειρισμού» με απομακρυσμένο προορισμό/προορισμό δεδομένων/προορισμό δέσμης ενεργειών είναι αποκλεισμένο. Βρέθηκε <code>$1=\"$2\"</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-remote-url-svg": "Κάθε SVG που θέτει οποιοδήποτε χαρακτηριστικό στυλ με απομακρυσμένη διεύθυνση URL είναι αποκλεισμένο. Βρέθηκε <code>$1=\"$2\"</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-image-filter-svg": "Βρέθηκε φίλτρο εικόνας με διεύθυνση URL: <code>&lt;$1 $2=\"$3\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
-       "uploadscriptednamespace": "Αυτό το αρχείο SVG περιέχει μη αποδεκτό ονοματοχώρο «$1».",
+       "uploadscriptednamespace": "Αυτό το αρχείο SVG περιέχει μη αποδεκτό ονοματοχώρο «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
        "uploadvirus": "Το αρχείο περιέχει ιό! Λεπτομέρειες: $1",
        "uploadjava": "Το αρχείο είναι αρχείο ZIP, το οποίο περιέχει ένα αρχείο .class της γλώσσας Java.\nΔεν επιτρέπεται η αποστολή αρχείων Java, επειδή μπορούν να προκαλέσουν παράκαμψη των περιορισμών ασφαλείας του συστήματος.",
        "upload-copy-upload-invalid-domain": "Δεν υπάρχουν διαθέσιμα ανεβάσματα αντιγράφων από αυτό τον τομέα.",
        "upload-dialog-title": "Ανέβασμα αρχείου",
        "upload-dialog-button-cancel": "Ακύρωση",
+       "upload-dialog-button-back": "Πίσω",
        "upload-dialog-button-done": "Ολοκληρώθηκε",
        "upload-dialog-button-save": "Αποθήκευση",
        "upload-dialog-button-upload": "Ανέβασμα",
        "upload-form-label-infoform-categories": "Κατηγορίες",
        "upload-form-label-infoform-date": "Ημερομηνία",
        "upload-form-label-own-work-message-generic-local": "Επιβεβαιώνω ότι επιφορτώνω  αυτό το αρχείο κατά τους όρους της υπηρεσίας και πολιτικές αδειοδότησης για τον ιστότοπο {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "Î\95άν Î´ÎµÎ½ ÎµÎ¯Ï\83Ï\84ε Ï\83ε Î¸Î­Ï\83η Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84ηÏ\82  {{SITENAME}}, Ï\80αÏ\81ακαλÏ\8e ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î½Î± ÎµÏ\80ιÏ\87ειÏ\81ήÏ\83εÏ\84ε Î¼Î¹Î± Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿Ï\82.",
+       "upload-form-label-not-own-work-message-generic-local": "Î\95άν Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84οÏ\85 {{SITENAME}}, Ï\80αÏ\81ακαλοÏ\8dμε ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε ÎºÎ¬Ï\80οιαν Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿.",
        "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": "Î\95άν Î´ÎµÎ½ ÎµÎ¯Ï\83Ï\84ε Ï\83ε Î¸Î­Ï\83η Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84ηÏ\82 shared repository, Ï\80αÏ\81ακαλÏ\8e ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î½Î± ÎµÏ\80ιÏ\87ειÏ\81ήÏ\83εÏ\84ε Î¼Î¹Î± Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿Ï\82.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Î\95άν Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Ï\83Ï\84ο Ï\80λαίÏ\83ιο Ï\84Ï\89ν Ï\80ολιÏ\84ικÏ\8eν Ï\84οÏ\85 ÎºÎ¿Î¹Î½Î¿Ï\8d Î±Ï\80οθεÏ\84ηÏ\81ίοÏ\85, Ï\80αÏ\81ακαλοÏ\8dμε ÎºÎ»ÎµÎ¯Ï\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80αÏ\81άθÏ\85Ï\81ο Î´Î¹Î±Î»Ï\8cγοÏ\85 ÎºÎ±Î¹ Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε ÎºÎ¬Ï\80οια Î¬Î»Î»Î· Î¼Î­Î¸Î¿Î´Î¿.",
        "upload-form-label-not-own-work-local-generic-foreign": "Επίσης, μπορεί να θέλετε να δοκιμάσετε χρησιμοποιώντας το [[Special:Upload|τη σελίδα ανεβάσματος για το {{SITENAME}}]], αν αυτό το αρχείο μπορεί να φορτωθεί κάτω σύμφωνα με τις πολιτικές τους.",
        "backend-fail-stream": "Αδύνατη η μετάδοση του αρχείου $1.",
        "backend-fail-backup": "Αδύνατη η δημιουργία αντίγραφου ασφαλείας του αρχείου $1.",
        "apisandbox-dynamic-parameters-add-label": "Προσθήκη παραμέτρου:",
        "apisandbox-dynamic-parameters-add-placeholder": "Ονομασία παραμέτρου",
        "apisandbox-dynamic-error-exists": "Η παράμετρος με την ονομασία \"$1\" υπάρχει ήδη",
+       "apisandbox-deprecated-parameters": "Παρωχημένες παράμετροι",
        "apisandbox-submit-invalid-fields-title": "Κάποια από τα πεδία δεν είναι έγκυρα",
-       "apisandbox-submit-invalid-fields-message": "Παρακαλώ διορθώστε τα σημειωμένα πεδία και προσπαθήστε ξανά.",
+       "apisandbox-submit-invalid-fields-message": "Παρακαλούμε διορθώστε τα σημειωμένα πεδία και προσπαθήστε ξανά.",
        "apisandbox-results": "Αποτελέσματα",
        "apisandbox-sending-request": "Αποστολή αιτήματος API...",
        "apisandbox-loading-results": "Λήψη αποτελεσμάτων API...",
        "apisandbox-request-url-label": "Αίτηση URL:",
        "apisandbox-request-json-label": "Αίτημα JSON:",
        "apisandbox-request-time": "Χρόνος αιτήματος: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-field": "Η τιμή αυτού του πεδίου δεν είναι έγκυρη.",
+       "apisandbox-continue": "Συνέχεια",
+       "apisandbox-continue-clear": "Διαγραφή",
+       "apisandbox-multivalue-all-namespaces": "$1 (Όλοι οι ονοματοχώροι)",
+       "apisandbox-multivalue-all-values": "$1 (Όλες οι τιμές)",
        "booksources": "Πηγές βιβλίων",
        "booksources-search-legend": "Αναζήτηση για πηγές βιβλίων",
        "booksources-isbn": "ISBN:",
        "watchlistanontext": "Παρακαλούμε συνδεθείτε για να δείτε ή να επεξεργαστείτε αντικείμενα στη λίστα παρακολούθησής σας.",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
-       "addedwatchtext": "Το Î»Î®Î¼Î¼Î± Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84οÏ\85 Î­Ï\87οÏ\85ν Ï\80Ï\81οÏ\83Ï\84εθεί Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82.",
+       "addedwatchtext": "Î\97 Ï\83ελίδα Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84ηÏ\82 Ï\80Ï\81οÏ\83Ï\84έθηκαν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].",
        "addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
        "removedwatchtext": "Το λήμμα «[[:$1]]» και η σελίδα συζήτησής του έχουν αφαιρεθεί από τη [[Special:Watchlist|λίστα παρακολούθησής]] σας.",
        "watchlist-hide": "Απόκρυψη",
        "watchlist-submit": "Προβολή",
        "wlshowtime": "Περίοδος χρόνου για να εμφανιστεί:",
-       "wlshowhideminor": "μικÏ\81έÏ\82 Ï\84Ï\81οÏ\80οÏ\80οιήÏ\83εις",
+       "wlshowhideminor": "μικÏ\81οεÏ\80εξεÏ\81γαÏ\83ίες",
        "wlshowhidebots": "bots",
        "wlshowhideliu": "εγγεγραμμένοι χρήστες",
        "wlshowhideanons": "ανώνυμοι χρήστες",
        "deleting-backlinks-warning": "<strong>Προσοχή:</strong>  [[Special:WhatLinksHere/{{FULLPAGENAME}}|Άλλες σελίδες]] συνδέουν ή ενσωματώνουν τη σελίδα που πρόκειται να διαγράψετε.",
        "rollback": "Επαναφορά επεξεργασιών",
        "rollbacklink": "αναστροφή",
-       "rollbacklinkcount": "Î\95Ï\80αναÏ\86οÏ\81ά $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
-       "rollbacklinkcount-morethan": "εÏ\80αναÏ\86οÏ\81ά περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
+       "rollbacklinkcount": "Î\91ναÏ\83Ï\84Ï\81οÏ\86ή $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
+       "rollbacklinkcount-morethan": "αναÏ\83Ï\84Ï\81οÏ\86ή περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
        "rollbackfailed": "Η επαναφορά απέτυχε.",
        "cantrollback": "Δεν είναι δυνατή η αναίρεση αυτής της αλλαγής, πρόκειται για την αρχική ενέργεια δημιουργίας της σελίδας.",
        "alreadyrolled": "Αδύνατον να αναιρεθεί η τελευταία αλλαγή της σελίδας [[:$1]] από το χρήστη ([[User:$2|$2]] ([[User talk:$2|Συζήτηση]]){{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), διότι κάποιος έχει ήδη αναιρέσει την αλλαγή ή έχει αλλάξει εκ νέου τη σελίδα.\n\nΤελευταία αλλαγή από το χρήστη ([[User:$3|$3]] ([[User talk:$3|Συζήτηση]]){{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "nocontribs": "Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.",
        "uctop": "(τρέχουσα)",
        "month": "Από το μήνα (και νωρίτερα):",
-       "year": "Î\91Ï\80Ï\8c Ï\84η Ï\87Ï\81ονιά (και νωρίτερα):",
+       "year": "Î\91Ï\80Ï\8c Ï\84ο Î­Ï\84οÏ\82 (και νωρίτερα):",
        "sp-contributions-newbies": "Εμφάνιση των συνεισφορών των νέων λογαριασμών μόνο",
        "sp-contributions-newbies-sub": "Για νέους λογαριασμούς",
        "sp-contributions-newbies-title": "Συνεισφορές χρηστών για νέους λογαριασμούς",
        "sp-contributions-username": "Διεύθυνση IP ή όνομα χρήστη:",
        "sp-contributions-toponly": "Εμφάνιση μόνο των επεξεργασιών που είναι πρόσφατες αναθεωρήσεις",
        "sp-contributions-newonly": "Εμφάνιση μόνο των επεξεργασιών που είναι δημιουργία σελίδας",
+       "sp-contributions-hideminor": "Απόκρυψη μικροεπεξεργασιών",
        "sp-contributions-submit": "Αναζήτηση",
        "whatlinkshere": "Τι συνδέει εδώ",
        "whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
        "movepagetext": "Χρησιμοποιώντας τη φόρμα που ακολουθεί θα γίνει μετονομασία σελίδας, μεταφέροντας όλο το ιστορικό της στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει σελίδα ανακατεύθυνσης προς τον νέο τίτλο.\nΜπορείτε να ενημερώσετε αυτόματα τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο.\nΑν επιλέξετε να μην ενημερωθούν αυτόματα, μην ξεχάσετε να ελέγξετε για [[Special:DoubleRedirects|διπλές]] ή [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίναι δική σας ευθύνη να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να δείχνουν προς τη σωστή κατεύθυνση.\n\nΛάβετε υπόψιν σας ότι η σελίδα <strong>δεν</strong> θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα υπό το νέο τίτλο, εκτός αν η σελίδα αυτή είναι ανακατεύθυνση και δεν έχει ιστορικό επεξεργασίας.\n\nΑυτό σημαίνει ότι σε περίπτωση λάθους μπορείτε να μετονομάσετε ξανά μια σελίδα δίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n<strong>Σημείωση:</strong>\nΑυτή η αλλαγή μπορεί να αποβεί δραστική και αναπάντεχη όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε βεβαιωθείτε ότι αντιλαμβάνεστε τις επιπτώσεις αυτής της ενέργειας πριν προχωρήσετε.",
        "movepagetext-noredirectfixer": "Χρησιμοποιώντας τη φόρμα που ακολουθεί μπορείτε να μετονομάσετε σελίδες και να μεταφέρετε όλο το ιστορικό τους στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει μια σελίδα ανακατεύθυνσης στο νέο τίτλο.\nΜπορείτε να ενημερώσετε τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο αυτόματα.\nΑν επιλέξετε να μην γίνει, θα πρέπει να ελέγξετε τις  [[Special:DoubleRedirects|διπλές]] και τις [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίστε υπεύθυνος να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να οδηγούν προς τις κατευθύνσεις που πρέπει.\n\nΛάβετε υπόψη σας ότι η σελίδα <strong>δεν</strong>  θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα κάτω από το νέο τίτλο, εκτός αν η σελίδα αυτή είναι κενή ή είναι ανακατεύθυνση χωρίς ιστορικό επεξεργασίας.\nΑυτό σημαίνει ότι, στην περίπτωση που έχετε κάνει λάθος, μπορείτε να μετονομάσετε μια σελίδα ξαναδίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n<strong>Σημείωση:</strong> \nΗ μετονομασία σελίδας είναι μια αιφνίδια και δραστική αλλαγή όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε, πριν το αποφασίσετε, να εξετάσετε προσεκτικά τις πιθανές επιπτώσεις αυτής της ενέργειας.",
        "movepagetalktext": "Αν τσεκάρετε αυτό το κουτί, η σχετιζόμενη σελίδα συζήτησης θα μετακινηθεί αυτόματα στο νέο τίτλο, εκτός αν υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή.\n\nΣε αυτή την περίπτωση, θα πρέπει να μετακινήσετε ή να συγχωνεύσετε τη σελίδα με το χέρι αν είναι επιθυμητό.",
-       "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
+       "moveuserpage-warning": "<strong>Προειδοποίηση:</strong> Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Παρακαλούμε λάβετε υπόψιν σας ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης <em>δεν</em> θα μετονομαστεί.",
        "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πρόκειται να μετακινήσετε μια σελίδα κατηγορίας. Έχετε υπόψη ότι θα μετακινηθεί μόνο η σελίδα και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα μεταφερθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "import-nonewrevisions": "Καμία αναθεώρηση δεν εισήχθει (όλες είτε ήταν ήδη παρούσες, ή παραλήφθηκαν λόγω σφαλμάτων).",
        "xml-error-string": "$1 στη γραμμή $2, στήλη $3 (byte $4): $5",
        "import-upload": "Ανέβασμα δεδομένων XML",
-       "import-token-mismatch": "Î\91Ï\80Ï\8eλεια Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν Ï\80εÏ\81ιÏ\8cδοÏ\85 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γίαÏ\82.\n\nÎ\9cÏ\80οÏ\81εί Î½Î± Î­Ï\87οÏ\85ν Î±Ï\80οÏ\83Ï\85νδεθεί. <strong>ΠαÏ\81ακαλοÏ\8dμε Î²ÎµÎ²Î±Î¹Ï\89θείÏ\84ε Ï\8cÏ\84ι ÎµÎ¯Ï\83Ï\84ε Î±ÎºÏ\8cμα Ï\83Ï\85νδεδεμένοι ÎºÎ±Î¹ Ï\80Ï\81οÏ\83Ï\80αθήÏ\83Ï\84ε Î¾Î±Î½Î¬</strong>.\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ ÎµÏ\80αναÏ\83Ï\85νδεθείÏ\84ε, ÎºÎ±Î¹ ÎµÎ»Î­Î³Î¾Ï\84ε Ï\8cÏ\84ι Î¿ browser Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει cookies Î±Ï\80Ï\8c Î±Ï\85Ï\84Ï\8c Ï\84ον Î¹Ï\83Ï\84οÏ\84Ï\8cπο.",
+       "import-token-mismatch": "Î\91Ï\80Ï\8eλεια Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν Ï\80εÏ\81ιÏ\8cδοÏ\85 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γίαÏ\82.\n\nÎ\9cÏ\80οÏ\81εί Î½Î± Î­Ï\87εÏ\84ε Î±Ï\80οÏ\83Ï\85νδεθεί. <strong>ΠαÏ\81ακαλοÏ\8dμε ÎµÏ\80ιβεβαιÏ\8eÏ\83Ï\84ε Ï\8cÏ\84ι Î²Ï\81ίÏ\83κεÏ\83Ï\84ε Î±ÎºÏ\8cμα Ï\83ε Ï\83Ï\8dνδεÏ\83η ÎºÎ±Î¹ Ï\80Ï\81οÏ\83Ï\80αθήÏ\83Ï\84ε Î¾Î±Î½Î¬</strong>.\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î¾Î±Î½Î¬, ÎºÎ±Î¹ Î²ÎµÎ²Î±Î¹Ï\89θείÏ\84ε Ï\8cÏ\84ι Ï\84ο Ï\80Ï\81Ï\8cγÏ\81αμμα Ï\80εÏ\81ιήγηÏ\83ήÏ\82 Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει cookies Î±Ï\80Ï\8c Î±Ï\85Ï\84Ï\8cν Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οπο.",
        "import-invalid-interwiki": "Δεν είναι δυνατή η εισαγωγή από το καθορισμένο wiki.",
        "import-error-edit": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την επεξεργαστείτε.",
        "import-error-create": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την δημιουργήσετε.",
        "pageinfo-category-pages": "Αριθμός σελίδων",
        "pageinfo-category-subcats": "Αριθμός υποκατηγοριών",
        "pageinfo-category-files": "Αριθμός αρχείων",
+       "pageinfo-user-id": "Αναγνωριστικό χρήση",
        "markaspatrolleddiff": "Σήμανση ως ελεγμένο",
        "markaspatrolledtext": "Σήμανση αυτής της σελίδας ως ελεγμένης",
        "markaspatrolledtext-file": "Επισημάνετε αυτή τη έκδοση του αρχείου ως ελεγμένη",
        "patrol-log-header": "Αυτό είναι μητρώο ελεγμένων αναθεωρήσεων.",
        "log-show-hide-patrol": "$1 μητρώου ελέγχου επεξεργασιών",
        "log-show-hide-tag": "$1 ετικέττα καταγραφής",
+       "confirm-markpatrolled-button": "Εντάξει",
        "deletedrevision": "Η παλιά έκδοση της $1 διαγράφτηκε",
        "filedeleteerror-short": "Σφάλμα κατά τη διαγραφή του αρχείου: $1",
        "filedeleteerror-long": "Αντιμετωπίστηκαν προβλήματα κατά τη διαγραφή του αρχείου:\n\n$1",
        "show-big-image-preview-differ": "Το μέγεθος αυτής της $3 προεπισκόπησης αυτού του $2 το αρχείο: $1.",
        "show-big-image-other": "Άλλες {{PLURAL:$2|ανάλυση|αναλύσεις}}: $1.",
        "show-big-image-size": "$1 × $2 εικονοστοιχεία",
-       "file-info-gif-looped": "περιτυλιγμένο",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}",
-       "file-info-png-looped": "Σε Î¬Ï\80ειÏ\81ο Î²Ï\81Ï\8cγÏ\87ο",
+       "file-info-gif-looped": "κυκλικά επαναλαμβανόμενο",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|καρέ}}",
+       "file-info-png-looped": "κÏ\85κλικά ÎµÏ\80αναλαμβανÏ\8cμενο",
        "file-info-png-repeat": "έπαιξε $1 {{PLURAL:$1|φορά|φορές}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}",
        "file-no-thumb-animation": "'''Σημείωση: λόγω τεχνικών περιορισμών, μικρογραφίες αυτού του τύπου αρχείου δεν θα είναι κινούμενες.'''",
        "exif-licenseurl": "Διεύθυνση URL για πνευματικά δικαιώματα άδειας χρήσης",
        "exif-morepermissionsurl": "Εναλλακτική πληροφορίες άδειας χρήσης",
        "exif-attributionurl": "Όταν επαναχρησιμοποιείτε αυτό το έργο, παρακαλούμε να βάλετε σύνδεσμο προς",
-       "exif-preferredattributionname": "Όταν επαναχρησιμοποιείτε αυτό το έργο, παρακαλώ αναφέρετε την πηγή",
+       "exif-preferredattributionname": "Όταν επαναχρησιμοποιείτε αυτό το έργο, παρακαλούμε να αναφέρετε την πηγή",
        "exif-pngfilecomment": "Σχόλιο αρχείου PNG",
        "exif-disclaimer": "Αποποίηση ευθυνών",
        "exif-contentwarning": "Προειδοποίηση περιεχομένου",
        "scarytranscludefailed-httpstatus": "[Η λήψη προτύπου απέτυχε για  το $1: HTTP  $2]",
        "scarytranscludetoolong": "[Η διεύθυνση URL είναι πολύ μεγάλη.]",
        "deletedwhileediting": "'''Προσοχή''': Αυτή η σελίδα έχει διαγραφεί αφότου ξεκινήσατε την επεξεργασία!",
-       "confirmrecreate": "Ο χρήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: <em>$2</em>\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
-       "confirmrecreate-noreason": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
+       "confirmrecreate": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτήν τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: <em>$2</em>\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτήν τη σελίδα.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτήν τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτήν τη σελίδα.",
        "recreate": "Αναδημιουργία",
        "confirm_purge_button": "Εντάξει",
-       "confirm-purge-top": "Î\9aαθαÏ\81ιÏ\83μÏ\8cÏ\82 Ï\84ηÏ\82 Î»Î±Î½Î¸Î¬Î½Î¿Ï\85Ï\83αÏ\82 Î¼Î½Î®Î¼Î·Ï\82 Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82.",
-       "confirm-purge-bottom": "Î\97 ÎµÎºÎºÎ±Î¸Î¬Ï\81ιÏ\83η Î¼Î¹Î±Ï\82 Ï\83ελίδαÏ\82 ÎµÎºÎºÎ±Î¸Î±Ï\81ίζει Ï\84ην Î¼Î½Î®Î¼Î· cache ÎºÎ±Î¹ ÎµÎ¾Î±Î½Î±Î³ÎºÎ¬Î¶ÎµÎ¹ Ï\84ην Ï\80λέον Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84η Î­ÎºÎ´Î¿ση να εμφανιστεί.",
+       "confirm-purge-top": "Î\9dα Î±Ï\80αλειÏ\86θεί Î· Ï\80Ï\81οÏ\83Ï\89Ï\81ινή Î¼Î½Î®Î¼Î· Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82;",
+       "confirm-purge-bottom": "Î\9f ÎºÎ±Î¸Î±Ï\81ιÏ\83μÏ\8cÏ\82 Ï\83ελίδαÏ\82 Î±Ï\80αλείÏ\86ει Ï\84ην Ï\80Ï\81οÏ\83Ï\89Ï\81ινή Î¼Î½Î®Î¼Î· ÎºÎ±Î¹ ÎµÎ¾Î±Î½Î±Î³ÎºÎ¬Î¶ÎµÎ¹ Ï\84ην Ï\80λέον Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84η Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηση να εμφανιστεί.",
        "confirm-watch-button": "Εντάξει",
        "confirm-watch-top": "Προσθήκη αυτής της σελίδας στη λίστα παρακολούθησης σας;",
        "confirm-unwatch-button": "Εντάξει",
        "htmlform-cloner-delete": "Αφαίρεση",
        "htmlform-cloner-required": "Απαιτείται τουλάχιστον μία τιμή.",
        "htmlform-date-placeholder": "ΕΕΕΕ-ΜΜ-ΗΗ",
+       "htmlform-time-placeholder": "ΩΩ:ΛΛ:ΔΔ",
+       "htmlform-datetime-placeholder": "ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΛΛ:ΔΔ",
        "htmlform-date-invalid": "Η τιμή που καθορίσατε δεν είναι μια αναγνωρισμένη ημερομηνία. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΕΕΕΕ-MM-ΗΗ.",
+       "htmlform-time-invalid": "Η τιμή που καθορίσατε δεν είναι κάποια αναγνωρίσιμη ώρα. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΩΩ:ΛΛ:ΔΔ.",
+       "htmlform-datetime-invalid": "Η τιμή που καθορίσατε δεν είναι κάποια αναγνωρίσιμη ημερομηνία και ώρα. Δοκιμάστε να χρησιμοποιήσετε τη μορφή ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΛΛ:ΔΔ.",
        "htmlform-title-badnamespace": "[[:$1]] δεν είναι στο \"{{ns:$2}}\" ονοματοχώρο.",
        "htmlform-title-not-creatable": "\"$1\" - η  σελίδα τίτλου δεν είναι δυνατόν να δημιουργηθεί",
        "htmlform-title-not-exists": "Το $1 δεν υπάρχει.",
        "expand_templates_generate_xml": "Εμφάνιση δέντρου συντακτικής ανάλυσης XML",
        "expand_templates_generate_rawhtml": "Εμφάνιση ανεπεξέργαστης HTML",
        "expand_templates_preview": "Προεπισκόπηση",
-       "expand_templates_preview_fail_html": "<em>Î\95Ï\80ειδή Ï\84ο {{SITENAME}} Î­Ï\87ει ÎµÎ½ÎµÏ\81γοÏ\80οιημένη Î±ÎºÎ±Ï\84έÏ\81γαÏ\83Ï\84η HTML ÎºÎ±Î¹ Ï\85Ï\80ήÏ\81ξε Î¼Î¹Î± Î±Ï\80Ï\8eλεια Ï\84ηÏ\82 Ï\83Ï\85νÏ\8cδοÏ\85 Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν, Î· Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83η ÎµÎ¯Î½Î±Î¹ ÎºÏ\81Ï\85μμένη Ï\89Ï\82 Î­Î½Î± Ï\80Ï\81οληÏ\80Ï\84ικÏ\8c Î¼Î­Ï\84Ï\81ο ÎºÎ±Ï\84ά ÎµÏ\80ιθέÏ\83εÏ\89ν JavaScript.</em>\n\n<strong>Î\91ν Î±Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î´Î¹ÎºÎ±Î¹Î¿Î»Î¿Î³Î·Î¼Î­Î½Î· Ï\80Ï\81οÏ\83Ï\80άθεια Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83ηÏ\82, Ï\80αÏ\81ακαλοÏ\8dμε Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î¾Î±Î½Î¬.</strong>\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ Î½Î± Ï\83Ï\85νδεθείÏ\84ε Ï\80άλι, ÎºÎ±Î¸Ï\8eÏ\82 ÎºÎ±Î¹ Î½Î± ÎµÎ»Î­Î³Î¾ÎµÏ\84ε Ï\80Ï\89Ï\82 Î¿ Ï\86Ï\85λλομεÏ\84Ï\81ηÏ\84ήÏ\82 Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει Ï\84ην Ï\87Ï\81ήÏ\83η cookies Î±Ï\80Ï\8c Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οÏ\80ο Î±Ï\85Ï\84Ï\8c.",
+       "expand_templates_preview_fail_html": "<em>Î\95Ï\80ειδή Ï\84ο {{SITENAME}} ÎµÏ\80ιÏ\84Ï\81έÏ\80ει Ï\84ην ÎµÎ¹Ï\83αγÏ\89γή Î±ÎºÎ±Ï\84έÏ\81γαÏ\83Ï\84οÏ\85 HTML ÎºÎ±Î¹ Ï\85Ï\80ήÏ\81ξε Î¼Î¹Î± Î±Ï\80Ï\8eλεια Ï\84Ï\89ν Î´ÎµÎ´Î¿Î¼Î­Î½Ï\89ν Ï\83Ï\85νÏ\8cδοÏ\85, Î· Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83η ÎµÎ¯Î½Î±Î¹ ÎºÏ\81Ï\85μμένη Ï\89Ï\82 Î­Î½Î± Ï\80Ï\81οληÏ\80Ï\84ικÏ\8c Î¼Î­Ï\84Ï\81ο ÎºÎ±Ï\84ά ÎµÏ\80ιθέÏ\83εÏ\89ν JavaScript.</em>\n\n<strong>Î\91ν Î±Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¸ÎµÎ¼Î¹Ï\84ή Ï\80Ï\81οÏ\83Ï\80άθεια Ï\80Ï\81οεÏ\80ιÏ\83κÏ\8cÏ\80ηÏ\83ηÏ\82, Ï\80αÏ\81ακαλοÏ\8dμε Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î¾Î±Î½Î¬.</strong>\nÎ\91ν ÎµÎ¾Î±ÎºÎ¿Î»Î¿Ï\85θεί Î½Î± Î¼Î·Î½ Î»ÎµÎ¹Ï\84οÏ\85Ï\81γεί, Î´Î¿ÎºÎ¹Î¼Î¬Ï\83Ï\84ε Î½Î± [[Special:UserLogout|αÏ\80οÏ\83Ï\85νδεθείÏ\84ε]] ÎºÎ±Î¹ Î½Î± Ï\83Ï\85νδεθείÏ\84ε Î¾Î±Î½Î¬ ÎºÎ±Î¹ Î²ÎµÎ²Î±Î¹Ï\89θείÏ\84ε Ï\8cÏ\84ι Ï\84ο Ï\80Ï\81Ï\8cγÏ\81αμμα Ï\80εÏ\81ιήγηÏ\83ήÏ\82 Ï\83αÏ\82 ÎµÏ\80ιÏ\84Ï\81έÏ\80ει cookies Î±Ï\80Ï\8c Î±Ï\85Ï\84Ï\8cν Ï\84ον Î¹Ï\83Ï\84Ï\8cÏ\84οÏ\80ο.",
        "expand_templates_preview_fail_html_anon": "<em>Επειδή το {{SITENAME}} έχει ενεργοποιημένη raw HTML και δεν είστε συνδεδεμένοι, η προεπισκόπηση είναι κρυμμένη ως ένα προληπτικό μέτρο ενάντια σε επιθέσεις JavaScript.</em>\n\n<strong>Αν αυτό είναι δικαιολογημένη απόπειρα προεπισκόπησης, παρακαλούμε να [[Special:UserLogin|συνδεθείτε]] και δοκιμάστε πάλι.</strong>",
        "pagelanguage": "Αλλαγή γλώσσας σελίδας",
        "pagelang-name": "Σελίδα",
        "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 έχει ήδη οριστεί στην προεπιλεγμένη γλώσσα περιεχομένου του wiki.",
+       "pagelang-db-failed": "Η βάση δεδομένων απέτυχε να αλλάξει τη γλώσσα σελίδας.",
        "right-pagelang": "Αλλαγή γλώσσας σελίδας",
        "action-pagelang": "αλλαγή της γλώσσας σελίδας",
        "log-name-pagelang": "Αρχείο καταγραφών αλλαγών γλώσσας",
        "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": "Προσθήκη κατηγορίας...",
+       "mw-widgets-usersmultiselect-placeholder": "Προσθήκη περισσότερων...",
        "sessionprovider-generic": "$1 συνεδρίες",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "συνεδρίες με βάση τα cookies",
        "sessionprovider-nocookies": "Τα Cookies μπορούν να απενεργοποιηθούν. Βεβαιωθείτε ότι έχετε ενεργοποιημένα τα cookies και ξεκινήστε πάλι.",
        "randomrootpage": "Τυχαία κύρια σελίδα",
        "log-action-filter-block": "Τύπος φραγής:",
+       "log-action-filter-delete": "Τύπος διαγραφής:",
+       "log-action-filter-import": "Τύπος εισαγωγής:",
+       "log-action-filter-move": "Τύπος μετακίνησης:",
+       "log-action-filter-newusers": "Τύπος δημιουργίας λογαριασμού:",
+       "log-action-filter-protect": "Τύπος προστασίας:",
        "log-action-filter-rights": "Πληκτρολογήστε για αλλαγή δικαιωμάτων:",
+       "log-action-filter-upload": "Τύπος ανεβάσματος:",
        "log-action-filter-all": "Όλα",
        "log-action-filter-block-block": "Φραγή",
        "log-action-filter-block-reblock": "Τροποποίηση φραγής",
        "log-action-filter-block-unblock": "Άρση φραγής",
+       "log-action-filter-contentmodel-change": "Αλλαγή του μοντέλου περιεχομένου",
+       "log-action-filter-contentmodel-new": "Δημιουργία σελίδας με μη προεπιλεγμένο μοντέλο περιεχομένου",
+       "log-action-filter-delete-delete": "Διαγραφή σελίδας",
+       "log-action-filter-import-upload": "Εισαγωγή μέσω ανεβάσματος XML",
+       "log-action-filter-managetags-create": "Δημιουργία ετικέτας",
+       "log-action-filter-managetags-delete": "Διαγραφή ετικέττας",
        "log-action-filter-protect-protect": "Προστασία",
        "log-action-filter-protect-modify": "Τροποποίηση προστασίας",
        "log-action-filter-protect-unprotect": "Άρση προστασίας",
index 9991eb7..bf06e49 100644 (file)
                        "Paladox",
                        "SamanthaNguyen",
                        "Usandaru555",
-                       "Aefgh39622"
+                       "Aefgh39622",
+                       "Anomie",
+                       "Dr. Shikha Jaggi",
+                       "Xð"
                ]
        },
        "tog-underline": "Link underlining:",
@@ -56,7 +59,7 @@
        "tog-shownumberswatching": "Show the number of watching users",
        "tog-oldsig": "Your existing signature:",
        "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
-       "tog-uselivepreview": "ක්‍රියාත්මකව අති පෙරහුරුවක් පෙන්වන්න",
+       "tog-uselivepreview": "Use live preview",
        "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
        "tog-watchlisthideown": "Hide my edits from the watchlist",
        "tog-watchlisthidebots": "Hide bot edits from the watchlist",
        "and": "&#32;and",
        "qbfind": "Find",
        "qbbrowse": "Browse",
-       "qbedit": "Edit",
-       "qbpageoptions": "This page",
-       "qbmyoptions": "My pages",
+       "qbedit": "संपादित करें",
+       "qbpageoptions": "यह पन्ना",
+       "qbmyoptions": "मेरे पृष्ठों",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "Actions",
        "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
        "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
        "protect": "Protect",
-       "protect_change": "ترميميو",
+       "protect_change": "change",
        "protectthispage": "Protect this page",
-       "unprotect": "تحفظ جي سطح بدلايو",
+       "unprotect": "Change protection",
        "unprotectthispage": "Change protection of this page",
        "newpage": "New page",
        "talkpage": "Discuss this page",
-       "talkpagelinktext": "Talk",
+       "talkpagelinktext": "talk",
        "specialpage": "Special page",
        "personaltools": "Personal tools",
        "articlepage": "View content page",
        "viewhelppage": "View help page",
        "categorypage": "View category page",
        "viewtalkpage": "View discussion",
-       "otherlanguages": "Muilla kielillä",
+       "otherlanguages": "In other languages",
        "redirectedfrom": "(Redirected from $1)",
        "redirectpagesub": "Redirect page",
        "redirectto": "Redirect to:",
index 81d9af1..098adb6 100644 (file)
        "selfredirect": "<strong>Warning:</strong> You are redirecting this page to itself.\nYou may have specified the wrong target for the redirect, or you may be editing the wrong page.\nIf you click \"{{int:savearticle}}\" again, the redirect will be created anyway.",
        "missingcommenttext": "Please enter a comment below.",
        "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-       "summary-preview": "Summary preview:",
-       "subject-preview": "Subject preview:",
+       "summary-preview": "Preview of edit summary:",
+       "subject-preview": "Preview of subject:",
        "previewerrortext": "An error occurred while attempting to preview your changes.",
        "blockedtitle": "User is blocked",
        "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
        "search-interwiki-default": "Results from $1:",
        "search-interwiki-custom": "",
        "search-interwiki-more": "(more)",
+       "search-interwiki-more-results": "more results",
        "search-relatedarticle": "Related",
        "searchrelated": "related",
        "searchall": "all",
        "editusergroup": "Load user groups",
        "editinguser": "Changing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Viewing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edit user groups",
-       "userrights-viewusergroup": "View user groups",
+       "userrights-editusergroup": "Edit {{GENDER:$1|user}} groups",
+       "userrights-viewusergroup": "View {{GENDER:$1|user}} groups",
        "saveusergroups": "Save {{GENDER:$1|user}} groups",
        "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.",
+       "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-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-changeable-col": "Groups you can change",
        "userrights-unchangeable-col": "Groups you cannot change",
        "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Expires $1",
        "userrights-expiry-none": "Does not expire",
        "userrights-expiry": "Expires:",
        "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-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
        "group": "Group:",
        "group-user": "Users",
        "rcfilters-invalid-filter": "Invalid filter",
        "rcfilters-empty-filter": "No active filters. All contributions are shown.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
+       "rcfilters-highlightbutton-title": "Highlight results",
+       "rcfilters-highlightmenu-title": "Select a color",
        "rcfilters-filterlist-noresults": "No filters found",
        "rcfilters-filtergroup-registration": "User registration",
        "rcfilters-filter-registered-label": "Registered",
        "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
-       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
+       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
        "uploadvirus": "The file contains a virus!\nDetails: $1",
        "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
        "editcomment": "The edit summary was: <em>$1</em>.",
        "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+       "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Reverted edits by $1;\nchanged back to last revision by $2. [$3 Show changes]",
        "sessionfailure-title": "Session failure",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Add a category...",
+       "mw-widgets-usersmultiselect-placeholder": "Add more...",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
index be9b811..d5c5258 100644 (file)
        "uploaded-setting-handler-svg": "SVGa dosiero kiu ensignas la traktilan atributon (''<span lang=\"en\">handler</span>'') kun fora/datena/skripta estas blokita. Trovis <code>$1=\"$2\"</code> en la alsûtita SVGa dosiero.",
        "uploaded-remote-url-svg": "SVG-a dosiero kiu asignas ajnan stilan atributon kun fora URL estas blokita. Ni trovis <code>$1=\"$2\"</code> en la alsûtita SVG-a dosiero.",
        "uploaded-image-filter-svg": "Trovis bildan filtrilon kun URL:  <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝutita SVGa dosiero.",
-       "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"$1\"",
+       "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Ne eblas interpreti la XML-sintakson en la alŝutita dosiero",
        "uploadvirus": "Viruso troviĝas en la dosiero! Detaloj: $1",
        "uploadjava": "La dosiero estas ZIP-dosiero kiu enhavas .class-dosieron de Java.\nAlŝutante Java-dosieron estas malpermesita, ĉar ili povas kaŭzi sekureco-limigojn esti preterpasitaj.",
index b45923e..9a31dbd 100644 (file)
        "category-file-count-limited": "{{PLURAL:$1|El siguiente archivo pertenece|Los siguientes $1 archivos pertenecen}} a esta categoría.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Páginas indizadas",
-       "noindex-category": "Páginas no indexadas",
+       "noindex-category": "Páginas no indizadas",
        "broken-file-category": "Páginas con enlaces rotos a archivos",
        "about": "Acerca de",
        "article": "Página de contenido",
        "editsection": "editar",
        "editold": "editar",
        "viewsourceold": "ver código",
-       "editlink": "modificar",
+       "editlink": "editar",
        "viewsourcelink": "ver código",
        "editsectionhint": "Editar sección: $1",
        "toc": "Contenido",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
-       "transaction-duration-limit-exceeded": "Para evitar la creación de lentitud alta de respuesta, la transacción fue abortada porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi estás cambiando muchos elementos a la vez, trata de hacer operaciones similares más pequeñas.",
+       "transaction-duration-limit-exceeded": "Con el fin de evitar un aumento excesivo del retardo de replicación, se anuló esta transacción porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi estás cambiando muchos elementos a la vez, trata de hacer operaciones similares más pequeñas.",
        "laggedslavemode": "<strong>Advertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
        "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
        "filerenameerror": "No se ha podido renombrar el archivo «$1» a «$2».",
        "filedeleteerror": "No se ha podido borrar el archivo «$1».",
        "directorycreateerror": "No se ha podido crear el directorio «$1».",
-       "directoryreadonlyerror": "La carpeta «$1» es de solo lectura.",
-       "directorynotreadableerror": "La carpeta «$1» no tiene permisos de lectura.",
+       "directoryreadonlyerror": "El directorio «$1» es de solo lectura.",
+       "directorynotreadableerror": "El directorio «$1» no tiene permisos de lectura.",
        "filenotfound": "No se ha encontrado el archivo «$1».",
        "unexpected": "Valor inesperado: «$1»=«$2».",
        "formerror": "Error: no se ha podido enviar el formulario.",
        "selfredirect": "<strong>Advertencia:</strong> estás redirigiendo esta página a sí misma.\nPuede que hayas especificado erróneamente el destino de la redirección, o quizá estés editando la página equivocada. En cualquier caso, si haces clic de nuevo en \"{{int:savearticle}}\", se creará la redirección.",
        "missingcommenttext": "Escribe un comentario a continuación.",
        "missingcommentheader": "<strong>Atención:</strong> no has escrito un asunto para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
-       "summary-preview": "Previsualización del resumen:",
+       "summary-preview": "Previsualización del resumen de edición:",
        "subject-preview": "Previsualización del asunto:",
        "previewerrortext": "Se ha producido un error al intentar la vista previa de los cambios.",
        "blockedtitle": "El usuario está bloqueado",
        "search-interwiki-caption": "Proyectos hermanos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(más)",
+       "search-interwiki-more-results": "más resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionado",
        "searchall": "todos",
        "editusergroup": "Cargar grupos de usuarios",
        "editinguser": "Cambio de los permisos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Visualización de los derechos {{GENDER:$1|del usuario|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar grupos {{GENDER:$1|del usuario| de la usuaria}}",
-       "userrights-viewusergroup": "Ver grupos de usuarios",
+       "userrights-editusergroup": "Modificar grupos {{GENDER:$1|del usuario|de la usuaria}}",
+       "userrights-viewusergroup": "Ver grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
-       "userrights-groups-help": "Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:\n* Un recuadro marcado significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.\n* Un recuadro no marcado significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.\n* Un * indica que no podrás eliminar el grupo una vez que lo agregues, o viceversa.",
+       "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-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.",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-highlightbutton-title": "Resaltar los resultados",
+       "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-filterlist-noresults": "No se encontraron filtros",
        "rcfilters-filtergroup-registration": "Registro de usuario",
        "rcfilters-filter-registered-label": "Registrados",
        "uploaded-setting-handler-svg": "Están bloqueados los archivos SVG que configuran el atributo \"handler\" con remote/data/script. Se encontró <code>$1=\"$2\"</code> en el archivo SVG cargado.",
        "uploaded-remote-url-svg": "Se bloquean los SVG que contienen URL de estilo externas. El archivo SVG cargado contiene <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Se encontró un filtro de imagen con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> en el archivo SVG cargado.",
-       "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombres no permitido: \"$1\".",
+       "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombres no permitido: «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "No se pudo analizar el XML del archivo cargado.",
        "uploadvirus": "¡El archivo contiene un virus!\nDetalles: $1",
        "uploadjava": "El archivo es un ZIP que contiene un archivo .class de Java.\nNo se permite subir archivos Java, porque pueden causar que se puedan saltar restricciones de seguridad.",
        "filedelete-comment": "Motivo:",
        "filedelete-submit": "Eliminar",
        "filedelete-success": "<strong>$1</strong> se ha borrado.",
-       "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 ha sido borrada.",
+       "filedelete-success-old": "La versión de <strong>[[Media:$1|$1]]</strong> del $2 a las $3 se ha borrado.",
        "filedelete-nofile": "<strong>$1</strong> no existe.",
        "filedelete-nofile-old": "No existe una versión guardada de <strong>$1</strong> con los atributos especificados.",
        "filedelete-otherreason": "Otra razón:",
        "historywarning": "<strong>Atención:</strong> la página que estás a punto de borrar tiene un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
        "historyaction-submit": "Mostrar",
        "confirmdeletetext": "Estás a punto de borrar una página, así como todo su historial.\nConfirma que realmente quieres hacer esto, que entiendes las consecuencias y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}}|las políticas]].",
-       "actioncomplete": "Acción completada",
-       "actionfailed": "Falló la acción",
+       "actioncomplete": "Se ha realizado la acción",
+       "actionfailed": "Ha fallado la acción",
        "deletedtext": "«$1» ha sido borrado.\nVéase $2 para un registro de los borrados recientes.",
        "dellogpage": "Registro de borrados",
        "dellogpagetext": "A continuación se muestra una lista de los borrados más recientes.",
        "editcomment": "El resumen de la edición fue: <em>$1</em>.",
        "revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revertidas las ediciones de $1; recuperada la última versión de $2.",
+       "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
        "sessionfailure-title": "Error de sesión",
-       "sessionfailure": "Parece que hay un problema con tu sesión;\nesta acción ha sido cancelada como medida de precaución contra secuestros de sesión.\nPor favor, pulsa «Atrás», recarga la página de la que viniste e inténtalo de nuevo.",
+       "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nVuelve a la página anterior, recárgala e inténtalo de nuevo.",
        "changecontentmodel": "Cambiar el modelo de contenido de una página",
        "changecontentmodel-legend": "Cambiar el modelo de contenido",
        "changecontentmodel-title-label": "Título de página",
        "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
        "sp-contributions-search": "Buscar contribuciones",
        "sp-contributions-username": "Dirección IP o nombre de usuario:",
-       "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
+       "sp-contributions-toponly": "Mostrar solo últimas ediciones de página",
        "sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
        "sp-contributions-hideminor": "Ocultar ediciones menores",
        "sp-contributions-submit": "Buscar",
        "reblock-logentry": "cambió el bloqueo para  [[$1]] con una caducidad de $2 $3",
        "blocklogtext": "Esto es un registro de acciones de bloqueo y desbloqueo de usuarios.\nLas direcciones IP bloqueadas automáticamente no aparecen aquí.\nConsulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueos y prohibiciones de operar en vigor.",
        "unblocklogentry": "desbloqueó a $1",
-       "block-log-flags-anononly": "sólo anónimos",
+       "block-log-flags-anononly": "solo anónimos",
        "block-log-flags-nocreate": "desactivada la creación de cuentas",
        "block-log-flags-noautoblock": "bloqueo automático desactivado",
        "block-log-flags-noemail": "correo electrónico desactivado",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambio|cambios}}",
        "tags-manage-no-permission": "No tienes permiso para gestionar las etiquetas de cambios.",
-       "tags-manage-blocked": "No puedes gestionar etiquetas de cambio mientras estés {{GÉNERO:$1|bloqueado|bloqueada}}.",
+       "tags-manage-blocked": "No puedes gestionar etiquetas de cambio mientras estés {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-create-heading": "Crear una etiqueta",
        "tags-create-explanation": "De manera predeterminada, las etiquetas nuevas estarán disponibles para su uso por usuarios y bots.",
        "tags-create-tag-name": "Nombre de la etiqueta:",
        "mw-widgets-titleinput-description-new-page": "la página aún no existe",
        "mw-widgets-titleinput-description-redirect": "redirigir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Agregar una categoría...",
+       "mw-widgets-usersmultiselect-placeholder": "Agregar más...",
        "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies",
index c93e9f9..eb89f59 100644 (file)
        "createacct-email-ph": "Sisesta e-posti aadress",
        "createacct-another-email-ph": "Sisesta e-posti aadress",
        "createaccountmail": "Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile",
+       "createaccountmail-help": "Saab kasutada konto loomiseks teisele kasutajale ilma parooli teada saamata.",
        "createacct-realname": "Pärisnimi (valikuline)",
        "createaccountreason": "Põhjus:",
        "createacct-reason": "Põhjus",
        "createacct-reason-ph": "Miks lood teist kontot?",
+       "createacct-reason-help": "Sõnum, mida näidatakse konto loomise logis",
        "createacct-submit": "Loo konto",
        "createacct-another-submit": "Loo konto",
+       "createacct-continue-submit": "Jätka konto loomist",
+       "createacct-another-continue-submit": "Jätka konto loomist",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "createacct-benefit-body1": "{{PLURAL:$1|muudatus|muudatust}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lehekülg|lehekülge}}",
        "nocookiesnew": "Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.",
        "nocookieslogin": "{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.",
        "nocookiesfornew": "Kasutajakonto jäi loomata, kuna me ei saanud selle allikat kindlaks teha.\nVeendu, et sul on küpsised lubatud, taaslaadi see lehekülg ja proovi uuesti.",
+       "createacct-loginerror": "Konto on edukalt loodud, aga automaatselt ei õnnestunud sisse logida. Et jätkata, [[Special:UserLogin|logi palun sisse käsitsi]].",
        "noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
        "loginsuccesstitle": "Sisse logitud",
        "loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
        "passwordreset-domain": "Domeen:",
        "passwordreset-email": "E-posti aadress:",
        "passwordreset-emailtitle": "{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed",
-       "passwordreset-emailtext-ip": "Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
+       "passwordreset-emailtext-ip": "Keegi IP-aadressilt $1, arvatavasti sina ise, palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailtext-user": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailelement": "Kasutajanimi: \n$1\n\nAjutine parool: \n$2",
        "passwordreset-emailsentemail": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
        "missingcommentheader": "<strong>Meeldetuletus:</strong> Sa pole kirjutanud kommentaarile teemat.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar ilma teemata.",
        "summary-preview": "Resümee eelvaade:",
-       "subject-preview": "Alaosa pealkirja eelvaade:",
+       "subject-preview": "Resümee eelvaade:",
        "previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
        "blockedtitle": "Kasutaja on blokeeritud",
        "blockedtext": "'''Sinu kasutajanimi või IP-aadress on blokeeritud.'''\n\nBlokeeris $1.\nTema põhjendus on järgmine: ''$2''.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi.\n\nSinu praegune IP-aadress on $3 ning blokeeringu number on #$5. Lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "content-json-empty-object": "Tühi objekt",
        "content-json-empty-array": "Tühi massiiv",
        "deprecated-self-close-category": "Vigaste endassesuletud HTML-siltidega leheküljed",
+       "deprecated-self-close-category-desc": "Leheküljel on endassesuletud HTML-silte nagu <code>&lt;b/></code> või <code>&lt;span/></code>. Nende kuvamisviis viiakse peagi vastavusse HTML5 spetsifikatsiooniga. Seetõttu selliseid silte vikitekstis enam kasutama ei peaks.",
        "duplicate-args-warning": "<strong>Hoiatus:</strong> [[:$1]] kutsub malli [[:$2]] nii, et parameetrile \"$3\" vastab rohkem kui üks väärtus. Väärtustest kasutatakse ainult viimast.",
        "duplicate-args-category": "Leheküljed, kus mallikutses on topeltargument",
        "duplicate-args-category-desc": "Lehekülg sisaldab mallikutseid, kus mõnd argumenti on kasutatud mitu korda, näiteks <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> või <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "search-interwiki-caption": "Sõsarprojektid",
        "search-interwiki-default": "Tulemused asukohast $1:",
        "search-interwiki-more": "(veel)",
+       "search-interwiki-more-results": "veel tulemusi",
        "search-relatedarticle": "Seotud",
        "searchrelated": "seotud",
        "searchall": "kõik",
        "youremail": "E-posti aadress:",
        "username": "{{GENDER:$1|Kasutajanimi}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Järgmise rühma|Järgmiste rühmade}} {{GENDER:$2|liige}}:",
+       "group-membership-link-with-expiry": "$1 (tähtaeg $2)",
        "prefs-registration": "Registreerumise aeg:",
        "yourrealname": "Tegelik nimi:",
        "yourlanguage": "Keel:",
        "editusergroup": "Laadi kasutajarühmad",
        "editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
        "viewinguserrights": "{{GENDER:$1|Kasutaja}} <strong>[[User:$1|$1]]</strong> $2 õiguste vaatamine",
-       "userrights-editusergroup": "Kasutajarühmade muutmine",
-       "userrights-viewusergroup": "Kasutajarühmade vaatamine",
+       "userrights-editusergroup": "{{GENDER:$1|Kasutajarühmade}} muutmine",
+       "userrights-viewusergroup": "{{GENDER:$1|Kasutajarühmade}} vaatamine",
        "saveusergroups": "Salvesta {{GENDER:$1|kasutajarühmad}}",
        "userrights-groupsmember": "Kuulub rühmadesse:",
        "userrights-groupsmember-auto": "Kuulub vaikimisi rühmadesse:",
-       "userrights-groups-help": "Sa võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud kast tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata kast tähendab, et kasutaja ei kuulu sellesse rühma.\n* Aga * kasutajarühma juures tähistab õigust, mida sa peale lisamist enam eemaldada ei saa, või siis ka vastupidi.",
+       "userrights-groups-help": "Võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud ruut tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata ruut tähendab, et kasutaja ei kuulu sellesse rühma.\n* Märk * tähistab kasutajarühma, mida sa ei saa pärast lisamist eemaldada, või vastupidi.\n* Märk # tähistab kasutajarühma, millesse kuulumise aegumistähtaega saad ainult edasi lükata, sa ei saa tähtaega varasemale ajale tuua.",
        "userrights-reason": "Põhjus:",
        "userrights-no-interwiki": "Sul ei ole luba muuta kasutajaõigusi teistes vikides.",
        "userrights-nodatabase": "Andmebaasi $1 ei ole olemas või pole see kohalik.",
        "userrights-changeable-col": "Rühmad, mida sa saad muuta",
        "userrights-unchangeable-col": "Rühmad, mida sa ei saa muuta",
+       "userrights-expiry-current": "Aegumistähtaeg $1",
+       "userrights-expiry-none": "Ei aegu",
+       "userrights-expiry": "Aegumistähtaeg:",
+       "userrights-expiry-existing": "Kehtiv aegumistähtaeg: $2, kell $3",
+       "userrights-expiry-othertime": "Muu tähtaeg:",
+       "userrights-expiry-options": "1 päev:1 day,1 nädal:1 week,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year",
+       "userrights-invalid-expiry": "Rühma \"$1\" aegumistähtaeg on vigane.",
+       "userrights-expiry-in-past": "Rühma \"$1\" aegumistähtaeg on minevikus.",
+       "userrights-cannot-shorten-expiry": "Rühma \"$1\" aegumistähtaega ei saa varasemale ajale tuua. Ainult kasutajad, kellel on õigus seda rühma lisada ja eemaldada, saavad aegumistähtaegu varsemale ajale tuua.",
        "userrights-conflict": "Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.",
        "group": "Rühm:",
        "group-user": "Kasutajad",
        "action-writeapi": "kirjutamise rakendusliidest kasutada",
        "action-delete": "seda lehekülge kustutada",
        "action-deleterevision": "redaktsioone kustutada",
+       "action-deletelogentry": "logisissekandeid kustutada",
        "action-deletedhistory": "vaadata lehekülje kustutatud ajalugu",
+       "action-deletedtext": "vaadata kustutatud redaktsioonide teksti",
        "action-browsearchive": "kustutatud lehekülgi otsida",
        "action-undelete": "lehekülgi taastada",
        "action-suppressrevision": "peidetud redaktsioone vaadata ega taastada",
        "action-userrights-interwiki": "teiste vikide kasutajate õigusi muuta",
        "action-siteadmin": "andmebaasi lukustada või avada",
        "action-sendemail": "e-kirju saata",
+       "action-editmyoptions": "muuta oma eelistusi",
        "action-editmywatchlist": "oma jälgimisloendit redigeerida",
        "action-viewmywatchlist": "oma jälgimisloendit vaadata",
        "action-viewmyprivateinfo": "oma eraandmeid vaadata",
        "action-managechangetags": "märgiseid koostada ega (in)aktiveerida",
        "action-applychangetags": "rakendada märgiseid oma muudatuste suhtes",
        "action-changetags": "käsitsi rakendatavaid märgiseid üksikute redaktsioonide ega logisissekannete juures lisada ega eemaldada",
+       "action-deletechangetags": "märgiseid andmebaasist kustutada",
        "nchanges": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimase vaatamise järel}}",
        "enhancedrc-history": "ajalugu",
        "file-thumbnail-no": "Failinimi algab eesliitega <strong>$1</strong>.\nSee paistab vähendatud suurusega pilt (''pisipilt'') olevat.\nKui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
        "fileexists-forbidden": "Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.\nPalun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Samanimeline fail on juba olemas jagatud meediavaramus.\nKui soovid siiski oma faili üles laadida, siis palun mine tagasi ja kasuta teist failinime.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Üleslaaditav fail on faili <strong>[[:$1]]</strong> praeguse versiooni üksühene duplikaat.",
+       "fileexists-duplicate-version": "Üleslaaditav fail on faili <strong>[[:$1]]</strong> {{PLURAL:$2|vanema versiooni|vanemate versioonide}} üksühene duplikaat.",
        "file-exists-duplicate": "See fail on {{PLURAL:$1|järgmise faili|järgmiste failide}} duplikaat:",
        "file-deleted-duplicate": "Selle failiga ([[:$1]]) identne fail on hiljuti kustutatud.\nVaata selle faili kustutamise ajalugu enne jätkamist.",
        "file-deleted-duplicate-notitle": "Selle failiga identne fail on varem kustutatud ja pealkiri on varjatud.\nEnne kui jätkad uuesti üleslaadimisega, peaksid paluma olukorda hinnata kellelgi, kes saab vaadata varjatud andmeid.",
        "uploaded-script-svg": "Üleslaaditud SVG-failist leiti skriptitav element \"$1\".",
        "uploaded-hostile-svg": "Üleslaaditud SVG-faili laadielemendist leiti ebaturvaline CSS.",
        "uploaded-event-handler-on-svg": "Sündmuse halduse atribuutide <code>$1=\"$2\"</code> seadmine pole SVG-failis lubatud.",
+       "uploaded-href-attribute-svg": "SVG-failis on lubatud href-atribuudiga viidata ainult sihtkohta skeemiga http:// või https://. Leiti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Üleslaaditud SVG-failist leiti href, mis viitab ebaturvalistele andmetele: URI sihtkoht <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "Üleslaaditud SVG-failist leiti silt \"animate\", mis võib href-i muuta, kasutades from-atribuuti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-event-handler-svg": "Sündmuse halduse atribuutide seadmine on keelatud, üleslaaditud SVG-failist leiti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-handler-svg": "SVG-failid, mis seavad atribuudile \"handler\" kaug-, andme- või skriptisihtkoha, on keelatud. Üleslaaditud SVG-failist leiti <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG-fail, mis kasutab mistahes laadiatribuudi seadmiseks kaug-URL-i, on keelatud. Üleslaaditud SVG-failist leiti <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Üleslaaditud SVG-failist leiti URL-iga pildifilter: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "See SVG-fail sisaldab keelatud nimeruumi \"$1\".",
+       "uploadscriptednamespace": "See SVG-fail sisaldab keelatud nimeruumi \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Üleslaaditud failis sisalduvat XMLi ei õnnestunud liigendada.",
        "uploadvirus": "Fail sisaldab viirust! Täpsemalt: $1",
        "uploadjava": "See fail on ZIP-fail, milles on Java .class-fail.\nJava failide üleslaadimine on keelatud, kuna nende kaudu võidaks turvapiiranguist mööda minna.",
        "upload-too-many-redirects": "URL sisaldas liiga palju ümbersuunamisi",
        "upload-http-error": "HTTP-viga: $1",
        "upload-copy-upload-invalid-domain": "Sellest domeenist pole kopeerimise teel üleslaadimine võimalik.",
+       "upload-foreign-cant-upload": "Selles vikis pole häälestatud failide üleslaadimine päritud välisesse failihoidlasse.",
+       "upload-foreign-cant-load-config": "Ei õnnestunud laadida häälestust, mis puudutab failide üleslaadimist välisesse failihoidlasse.",
+       "upload-dialog-disabled": "Selle dialoogi kasutamine üleslaadimiseks on siin vikis keelatud.",
        "upload-dialog-title": "Faili üleslaadimine",
        "upload-dialog-button-cancel": "Loobu",
+       "upload-dialog-button-back": "Tagasi",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Salvesta",
        "upload-dialog-button-upload": "Laadi üles",
        "upload-form-label-infoform-title": "Üksikasjad",
        "upload-form-label-infoform-name": "Pealkiri",
+       "upload-form-label-infoform-name-tooltip": "Ainukordne ja kirjeldav pealkiri, millest saab failinimi. Võid kasutada lihtteksti ja tühikuid. Ära lisa nimele faililaiendit.",
        "upload-form-label-infoform-description": "Kirjeldus",
+       "upload-form-label-infoform-description-tooltip": "Anna teose kohta lühidalt edasi kõik märkimisväärne.\nFoto juures maini, mida on kujutatud, mis sündmuse või kohaga on tegu.",
        "upload-form-label-usage-title": "Kasutus",
        "upload-form-label-usage-filename": "Failinimi",
-       "upload-form-label-own-work": "See on minu enda töö",
+       "upload-form-label-own-work": "See on minu enda looming.",
        "upload-form-label-infoform-categories": "Kategooriad",
        "upload-form-label-infoform-date": "Kuupäev",
        "upload-form-label-own-work-message-generic-local": "Kinnitan, et seda faili üles laadides järgin saidi {{SITENAME}} kasutustingimusi ja litsentsipõhimõtteid.",
        "zip-wrong-format": "Valitud fail ei ole ZIP-fail.",
        "zip-bad": "See ZIP-fail on kas rikutud või muul põhjusel loetamatu.\nSelle turvalisust ei saa kontrollida.",
        "zip-unsupported": "See ZIP-fail kasutab ZIP-funktsioone, mida MediaWiki ei toeta.\nSelle turvalisust ei saa kontrollida.",
-       "uploadstash": "Üleslaaditud failide algne hoidla",
+       "uploadstash": "Üleslaadimise peithoidla",
        "uploadstash-summary": "See lehekülg pakub juurdepääsu failidele, mis on üles laaditud (või mida parasjagu üles laaditakse), kuid mis pole veel vikis avaldatud. Need failid on nähtavad üksnes kasutajale, kes need üles laadis.",
-       "uploadstash-clear": "Kustuta failid algsest hoidlast",
-       "uploadstash-nofiles": "Sul pole algses hoidlas faile.",
+       "uploadstash-clear": "Eemalda peitfailid",
+       "uploadstash-nofiles": "Sul pole peitfaile.",
        "uploadstash-badtoken": "Toiming ebaõnnestus, võib-olla redigeerimismandaadi aegumise tõttu. Palun proovi uuesti.",
-       "uploadstash-errclear": "Failide kustutamine ebaõnnestus.",
+       "uploadstash-errclear": "Failide eemaldamine ebaõnnestus.",
        "uploadstash-refresh": "Värskenda faililoendit",
+       "uploadstash-thumbnail": "vaata pisipilti",
+       "uploadstash-exception": "Üleslaaditavat faili ei õnnestunud peithoidlas talletada ($1): \"$2\".",
        "invalid-chunk-offset": "Tüki vigane nihe",
        "img-auth-accessdenied": "Juurdepääs keelatud",
        "img-auth-nopathinfo": "PATH_INFO puudub.\nSinu server pole seadistatud seda teavet edastama.\nSee võib olla CGI-põhine ja ei toeta img_auth-i.\nVaata lehekülge https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "filerevert-submit": "Taasta",
        "filerevert-success": "Faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2 kasutusel olnud versioon] on taastatud.",
        "filerevert-badversion": "Ette antud ajatempliga kohalik versioon sellest failist puudub.",
+       "filerevert-identical": "Praegune versioon on valitud versiooniga juba identne.",
        "filedelete": "Kustuta $1",
        "filedelete-legend": "Faili kustutamine",
        "filedelete-intro": "Oled kustutamas faili '''[[Media:$1|$1]]''' ja kogu selle ajalugu.",
        "uncategorizedcategories": "Kategoriseerimata kategooriad",
        "uncategorizedimages": "Kategoriseerimata failid",
        "uncategorizedtemplates": "Kategoriseerimata mallid",
+       "uncategorized-categories-exceptionlist": " # Loetelu kategooriatest, mis ei peaks kajastuma leheküljel \"Eri:Kategoriseerimata kategooriad\". Üks kategooria rea kohta, rea alguses \"*\". Muu märgiga (sh tühemik) algavaid ridu eiratakse. Komentaari jaoks kasuta märki \"#\".",
        "unusedcategories": "Kasutamata kategooriad",
        "unusedimages": "Kasutamata failid",
        "wantedcategories": "Kõige oodatumad kategooriad",
        "trackingcategories-name": "Sõnumi nimi",
        "trackingcategories-desc": "Kategooriasse arvamise kriteeriumid",
        "restricted-displaytitle-ignored": "Eiratava kuvapealkirjaga leheküljed",
+       "restricted-displaytitle-ignored-desc": "Leheküljel on <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, mida eiratakse, sest see ei vasta lehekülje tegelikule pealkirjale.",
        "noindex-category-desc": "Robotid ei indekseeri lehekülge, sest sellel on võlusõna <code><nowiki>__NOINDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud.",
        "index-category-desc": "Leheküljel on <code><nowiki>__INDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud ning seetõttu indekseerivad robotid lehekülge seal, kus nad muidu seda ei teeks.",
        "post-expand-template-inclusion-category-desc": "Kõigi mallide hõrendamise järel on lehekülg suurem kui <code>$wgMaxArticleSize</code>, mistõttu jäid mõned mallid hõrendamata.",
        "emailccsubject": "Koopia sinu sõnumist kasutajale $1: $2",
        "emailsent": "E-kiri saadetud",
        "emailsenttext": "Sinu teade on e-kirjaga saadetud.",
-       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"{{int:emailuser}}\" abil. Sinu kiri saadetakse otse algse kirja saatjale, mistõttu saab ta sinu e-posti aadressi teada.",
+       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"{{int:emailuser}}\" abil. Kui vastad sellele e-kirjale, saadetakse sinu e-kiri otse algse kirja saatjale, mistõttu saab ta teada sinu e-posti aadressi.",
        "usermessage-summary": "Jätan süsteemiteate.",
        "usermessage-editor": "Süsteemiteadete edastaja",
        "watchlist": "Jälgimisloend",
        "rollbacklinkcount": "tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}",
        "rollbacklinkcount-morethan": "tühista üle {{PLURAL:$1|ühe muudatuse|10 muudatuse}}",
        "rollbackfailed": "Muudatuste tühistamine ebaõnnestus",
+       "rollback-missingparam": "Päringus puuduvad nõutavad parameetrid.",
+       "rollback-missingrevision": "Redaktsiooni andmeid ei õnnestu laadida.",
        "cantrollback": "Ei saa muudatusi eemaldada, sest viimane kaastööline on artikli ainus autor.",
        "alreadyrolled": "Muudatust, mille tegi lehele [[:$1]] kasutaja [[User:$2|$2]] ([[User talk:$2|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), ei saa tühistada, sest keegi teine on seda lehte vahepeal muutnud.\n\nLehte muutis viimasena [[User:$3|$3]] ([[User talk:$3|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Redaktsiooni resümee oli: <em>$1</em>.",
        "revertpage": "Tühistati kasutaja [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]]) tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
        "revertpage-nouser": "Tühistati peidetud kasutaja muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
        "rollback-success": "Tühistati muudatused, mille tegi $1;\npöörduti tagasi viimasele muudatusele, mille tegi $2.",
+       "rollback-success-notify": "Tühistatud kasutaja $1 tehtud muudatused;\npöördutud tagasi kasutaja $2 viimase redaktsiooni juurde. [$3 Näita muudatusi]",
        "sessionfailure-title": "Seansiviga",
        "sessionfailure": "Sinu sisselogimisseansiga näib probleem olevat.\nSee toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.\nMine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.",
        "changecontentmodel": "Lehekülje sisumudeli muutmine",
        "changecontentmodel-success-text": "Lehekülje [[:$1]] sisumudel on muudetud.",
        "changecontentmodel-cannot-convert": "Lehekülje [[:$1]] sisumudelit ei saa teisendada tüübiks $2.",
        "changecontentmodel-nodirectediting": "Sisumudel $1 ei võimalda otseredigeerimist.",
+       "changecontentmodel-emptymodels-title": "Sisumudeleid pole saadaval",
+       "changecontentmodel-emptymodels-text": "Lehekülje [[:$1]] sisu ei saa teisendada ühtegi tüüpi mudelisse.",
        "log-name-contentmodel": "Sisumudeli muutmislogi",
        "log-description-contentmodel": "Siin on loetletud lehekülgede sisumudelite muudatused ning leheküljed, mis loodi vaikeväärtusest erineva sisumudeliga.",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|lõi}} lehekülje $3 vaikeväärtusest erineva sisumudeliga \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" sisumudeli: \"$4\" → \"$5\"",
        "logentry-contentmodel-change-revertlink": "võta tagasi",
        "logentry-contentmodel-change-revert": "tagasi võetud",
        "protect-norestrictiontypes-title": "Kaitstamatu lehekülg",
        "protect-legend": "Kaitse kinnitamine",
        "protectcomment": "Põhjus:",
-       "protectexpiry": "Aegub:",
+       "protectexpiry": "Aegumistähtaeg:",
        "protect_expiry_invalid": "Sobimatu aegumise tähtaeg.",
        "protect_expiry_old": "Aegumise tähtaeg on minevikus.",
        "protect-unchain-permissions": "Ava edasised kaitsmissuvandid",
        "protect-cantedit": "Sa ei saa lehekülje kaitsetaset muuta, sest sul puudub lehekülje redigeerimise õigus.",
        "protect-othertime": "Muu aeg:",
        "protect-othertime-op": "muu aeg",
-       "protect-existing-expiry": "Kehtiv aegumisaeg: $2 kell $3",
-       "protect-existing-expiry-infinity": "Kehtiv aegumisaeg: igavene",
+       "protect-existing-expiry": "Kehtiv aegumistähtaeg: $2, kell $3",
+       "protect-existing-expiry-infinity": "Kehtiv aegumistähtaeg: tähtajatu",
        "protect-otherreason": "Muu või täiendav põhjus:",
        "protect-otherreason-op": "Muu põhjus",
        "protect-dropdown": "*Tavalised kaitsmise põhjused\n** Liigne vandalism\n** Liigne rämpspostitamine\n** Redigeerimissõja pidamine\n** Suure liiklusega lehekülg",
        "protect-edit-reasonlist": "Muudatuste eest kaitsmise põhjused",
-       "protect-expiry-options": "1 tund:1 hour,1 päev:1 day,1 nädal:1 week,2 nädalat: 2 weeks,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year,igavene:infinite",
+       "protect-expiry-options": "1 tund:1 hour,1 päev:1 day,1 nädal:1 week,2 nädalat: 2 weeks,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year,tähtajatu:infinite",
        "restriction-type": "Lubatud:",
        "restriction-level": "Kaitsmise tase:",
        "minimum-size": "Min suurus",
        "blockip-legend": "Kasutaja blokeerimine",
        "blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.\nIP-aadresside vahemikke saad blokeerida [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-süntaksi abil; suurim lubatud vahemik on IPv4 jaoks /$1 ja IPv6 jaoks /$2.",
        "ipaddressorusername": "IP-aadress või kasutajanimi:",
-       "ipbexpiry": "Kehtivus:",
+       "ipbexpiry": "Aegumistähtaeg:",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Tavalised blokeerimise põhjused\n** Valeandmete lisamine\n** Lehekülgedelt sisu kustutamine\n** Välislinkide rämpspostitus\n** Sodimine\n** Hirmutav käitumine/ahistamine\n** Mitme konto väärkasutus\n** Lubamatu kasutajanimi",
        "ipb-hardblock": "Keela sellelt IP-aadressilt sisseloginud kasutajatel redigeerida",
        "ipblocklist-submit": "Otsi",
        "ipblocklist-localblock": "Kohalik blokeering",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Muu blokeering|Muud blokeeringud}}",
-       "infiniteblock": "igavene",
+       "infiniteblock": "tähtajatu",
        "expiringblock": "aegumistähtaeg $1, $2",
        "anononlyblock": "ainult nimetuna",
        "noautoblockblock": "IP-aadressi ei blokita automaatselt",
        "proxyblockreason": "Sinu IP-aadress on blokeeritud, sest see on avatud proksi. Palun võta ühendust oma internetiteenuse pakkujaga või tehnilise toega ja teata neile sellest probleemist.",
        "sorbsreason": "Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.",
        "sorbs_create_account_reason": "Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.\nSa ei saa kasutajakontot luua.",
+       "softblockrangesreason": "Sinu IP-aadressilt ($1) pole anonüümne kaastöö lubatud. Palun logi sisse.",
        "xffblockreason": "X-Forwarded-Fori päises esinev IP-aadress, mis kuulub kas sulle või proksiserverile, mida kasutad, on blokeeritud. Blokeerimise algne põhjus oli: $1",
        "cant-see-hidden-user": "Kasutaja, keda blokeerida üritad, on juba blokeeritud ning peidetud. Kuna sul pole õigust blokeerida kasutajanimesid, peites need avalikkuse eest, ei saa sa selle kasutaja blokeeringut vaadata ega muuta.",
        "ipbblocked": "Sa ei saa teisi blokeerida ega nende blokeeringuid eemaldada, sest oled ise blokeeritud.",
        "lockdbsuccesstext": "Andmebaas on nüüd lukustatud.<br />\nKui sinu hooldustöö on läbi, ära unusta [[Special:UnlockDB|kirjutuspääsu taastada]]!",
        "unlockdbsuccesstext": "Andmebaasi kirjutuspääs on taastatud.",
        "lockfilenotwritable": "Andmebaasi lukufail ei ole kirjutatav.\nAndmebaasi lukustamiseks ja avamiseks peavad veebiserveril olema sellele kirjutusõigused.",
+       "databaselocked": "Andmebaas on juba lukustatud.",
        "databasenotlocked": "Andmebaas ei ole lukustatud.",
        "lockedbyandtime": "(lukustas $1; $2, kell $3)",
        "move-page": "Lehekülje \"$1\" teisaldamine",
        "cant-move-to-user-page": "Sul ei ole õigust teisaldada lehekülge kasutajaleheks (ei käi kasutaja alamlehe kohta).",
        "cant-move-category-page": "Sul pole õigust kategoorialehekülgi teisaldada.",
        "cant-move-to-category-page": "Sul pole õigust teisaldada lehekülge kategoorialeheküljele.",
+       "cant-move-subpages": "Sul pole lubatud alamlehekülgi teisaldada.",
+       "namespace-nosubpages": "Nimeruumis \"$1\" pole alamleheküljed lubatud.",
        "newtitle": "Uus pealkiri:",
        "move-watch": "Jälgi lähte- ja sihtlehekülge",
        "movepagebtn": "Teisalda lehekülg",
        "movelogpagetext": "See logi sisaldab infot lehekülgede teisaldamistest.",
        "movesubpage": "{{PLURAL:$1|Alamlehekülg|Alamleheküljed}}",
        "movesubpagetext": "Selle lehekülje $1 {{PLURAL:$1|alamlehekülg|alamlehekülge}} on kuvatud allpool.",
+       "movesubpagetalktext": "Seonduval aruteluleheküljel on $1 allnäidatud {{PLURAL:$1|alamlehekülg|alamlehekülge}}.",
        "movenosubpage": "Sellel leheküljel pole alamlehekülgi.",
        "movereason": "Põhjus:",
        "revertmove": "taasta",
        "pageinfo-length": "Lehekülje pikkus (baitides)",
        "pageinfo-article-id": "Lehekülje identifikaator",
        "pageinfo-language": "Lehekülje sisu keel",
+       "pageinfo-language-change": "muuda",
        "pageinfo-content-model": "Lehekülje sisumudel",
        "pageinfo-content-model-change": "muuda",
        "pageinfo-robot-policy": "Robotindekseering",
        "log-show-hide-patrol": "$1 kontrollimislogi",
        "log-show-hide-tag": "$1 märgiste logi",
        "confirm-markpatrolled-button": "Sobib",
+       "confirm-markpatrolled-top": "Kas märgid lehekülje $2 redaktsiooni $3 kontrollituks?",
        "deletedrevision": "Kustutatud vanem versioon $1",
        "filedeleteerror-short": "Tõrge faili kustutamisel: $1",
        "filedeleteerror-long": "Faili kustutamisel esines tõrkeid:\n\n$1",
        "exif-photometricinterpretation-0": "Mustvalge (valge on 0)",
        "exif-photometricinterpretation-1": "Mustvalge (must on 0)",
        "exif-photometricinterpretation-3": "Palett",
+       "exif-photometricinterpretation-4": "Läbipaistvusmask",
        "exif-photometricinterpretation-5": "Eraldatud (arvatavasti CMYK)",
        "exif-photometricinterpretation-9": "CIE L*a*b* (ICC kodeering)",
        "exif-photometricinterpretation-10": "CIE L*a*b* (ITU kodeering)",
        "confirmemail_body_set": "Keegi IP-aadressilt $1, arvatavasti sina ise, on {{GRAMMAR:genitive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks määranud selle aadressi.\n\nKinnitamaks, et see konto kuulub tõesti sulle ja et aktiveerida e-posti teenused, ava võrgulehitsejas järgmine link:\n\n$3\n\nKui konto *ei* kuulu sulle, kasuta e-posti aadressi kinnituse tühistamiseks järgmist linki:\n\n$5\n\nSelle kinnituskoodi aegumistähtaeg on $4.",
        "confirmemail_invalidated": "E-posti aadressi kinnitamine tühistati",
        "invalidateemail": "E-posti aadressi kinnituse tühistamine",
+       "notificationemail_subject_changed": "{{GRAMMAR:inessive|{{SITENAME}}}} registreeritud e-posti aadress on muudetud",
+       "notificationemail_subject_removed": "{{GRAMMAR:inessive|{{SITENAME}}}} registreeritud e-posti aadress on eemaldatud",
+       "notificationemail_body_changed": "Keegi IP-aadressilt $1, arvatavasti sina ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks \"$3\".\n\nKui see ei olnud sina, siis võta viivitamata ühendust saidi administraatoriga.",
+       "notificationemail_body_removed": "Keegi IP-aadressilt $1, arvatavasti sina ise,\neemaldas {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressi.\n\nKui see ei olnud sina, siis võta viivitamata ühendust saidi administraatoriga.",
        "scarytranscludedisabled": "[Vikidevaheline mallina kasutamine on keelatud]",
        "scarytranscludefailed": "[Malli $1 hankimine ebaõnnestus]",
        "scarytranscludefailed-httpstatus": "[Malli $1 hankimine ebaõnnestus: HTTP $2]",
        "confirm-unwatch-button": "Sobib",
        "confirm-unwatch-top": "Kas eemaldad selle lehekülje oma jälgimisloendist?",
        "confirm-rollback-button": "Sobib",
+       "confirm-rollback-top": "Kas tühistad sellel leheküljel tehtud muudatused?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← eelmine lehekülg",
        "imgmultipagenext": "järgmine lehekülg →",
        "watchlisttools-edit": "vaata ja redigeeri jälgimisloendit",
        "watchlisttools-raw": "redigeeri jälgimisloendi toorandmeid",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])",
+       "timezone-local": "Kohalik",
        "duplicate-defaultsort": "'''Hoiatus:''' Järjestamisvõti \"$2\" tühistab eespool oleva järjestamisvõtme \"$1\".",
        "duplicate-displaytitle": "<strong>Hoiatus:</strong> Kuvatava pealkirjaga \"$2\" kirjutatakse üle varasem kuvatav pealkiri \"$1\".",
+       "restricted-displaytitle": "<strong>Hoiatus:</strong> Kuvapealkirja \"$1\" eirati, sest see ei vasta lehekülje tegelikule pealkirjale.",
        "invalid-indicator-name": "<strong>Tõrge:</strong> Lehekülje olekunäidu juures ei tohi atribuudi <code>name</code> väärtus puududa.",
        "version": "Versioon",
        "version-extensions": "Paigaldatud lisad",
        "redirect-page": "Lehekülje identifikaator",
        "redirect-revision": "Lehekülje redaktsioon",
        "redirect-file": "Failinimi",
+       "redirect-logid": "Logi identifikaator",
        "redirect-not-exists": "Väärtust ei leitud",
        "fileduplicatesearch": "Faili duplikaatide otsimine",
        "fileduplicatesearch-summary": "Otsi duplikaatfaile nende räsiväärtuse järgi.",
        "tags-delete-not-found": "Märgist \"$1\" pole.",
        "tags-delete-too-many-uses": "Märgist \"$1\" on rakendatud rohkem kui {{PLURAL:$2|ühe|$2}} redaktsiooni juures, mistõttu ei saa seda kustutada.",
        "tags-delete-warnings-after-delete": "Märgis \"$1\" on kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
+       "tags-delete-no-permission": "Sul pole lubatud muudatusmärgiseid kustutada.",
        "tags-activate-title": "Märgise lubamine",
        "tags-activate-question": "Siinkohal lubad märgise \"$1\".",
        "tags-activate-reason": "Põhjus:",
        "htmlform-cloner-create": "Lisa veel",
        "htmlform-cloner-delete": "Eemalda",
        "htmlform-cloner-required": "Vähemalt üks väärtus on nõutav.",
+       "htmlform-date-placeholder": "AAAA-KK-PP",
+       "htmlform-time-placeholder": "TT:MM:SS",
+       "htmlform-datetime-placeholder": "AAAA-KK-PP TT:MM:SS",
        "htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
        "htmlform-title-not-exists": "Lehekülge $1 pole olemas.",
index f51c6ed..b0b5e1f 100644 (file)
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
        "editusergroup": "Erabiltzaile taldeak kargatu",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|lankidearen}} erabiltzaile-eskubideak aldatzen",
-       "userrights-editusergroup": "Erabiltzaile taldeak editatu",
+       "userrights-editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
        "saveusergroups": "Erabiltzaile {{GENDER:$1|taldeak}} gorde",
        "userrights-groupsmember": "Ondorengo talde honetako kide da:",
        "userrights-groupsmember-auto": "Honen kide inplizitua:",
-       "userrights-groups-help": "Lankide hau zein taldetakoa den alda dezakezu:\n* Laukia hautatuta baldin badago, esan nahi du lankidea talde horretakoa dela.\n* Laukia hautatu gabe baldin badago, esan nahi du lankidea talde horretakoa ez dela.\n* Izartxoak (*) erakusten du ezin duzula talde horretatik kendu, taldera gehitu eta gero; edo alderantziz, ezin duzula talde horretara gehitu, taldetik kendu eta gero.",
+       "userrights-groups-help": "Lankide hau zein taldetakoa den alda dezakezu:\n* Laukia hautatuta baldin badago, esan nahi du lankidea talde horretakoa dela.\n* Laukia hautatu gabe baldin badago, esan nahi du lankidea talde horretakoa ez dela.\n* Izartxoak (*) erakusten du ezin duzula talde horretatik kendu, taldera gehitu eta gero; edo alderantziz, ezin duzula talde horretara gehitu, taldetik kendu eta gero.\n* Traolak (#) erakusten du taldearen iraungipen data luzatu egin dezakezula soilik; ez ordea aurreratu.",
        "userrights-reason": "Arrazoia:",
        "userrights-no-interwiki": "Ez duzu beste wikietan erabiltzaile eskumenak aldatzeko baimenik.",
        "userrights-nodatabase": "$1 datubasea ez da existitzen edo ez dago lokalki.",
        "rcfilters-filtergroup-authorship": "Edizioaren egiletza",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-minor-label": "Aldaketa txikiak",
-       "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
+       "rcnotefrom": "Jarraian azaltzen diren {{PLURAL:$5|aldaketak}} data honetatik aurrerakoak dira: <strong>$3,$4</strong> (gehienez <b>$1</b> erakusten dira).",
        "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "rcshowhideminor": "$1 aldaketa txikiak",
        "rcshowhideminor-show": "Erakutsi",
        "emailccsubject": "Zure mezuaren kopia $1(r)i: $2",
        "emailsent": "Mezua bidali egin da",
        "emailsenttext": "Zure e-posta mezua bidali egin da.",
-       "emailuserfooter": "E-posta hau $1(e)k {{GENDER:$1|bidali}} dio {{GENDER:$2|$2}}(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz.",
+       "emailuserfooter": "E-posta hau $1(e)k {{GENDER:$1|bidali}} dio {{GENDER:$2|$2}}(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz. Email honi erantzuten {{GENDER:$2|badiozu}}, zure emaila zuzenean jatorrizko {{GENDER:$1|igorleari}} bidaliko zaio eta {{GENDER:$1|harentzat}} {{GENDER:$2|zure}} email helbidea ikusgai geratuko da.",
        "usermessage-summary": "Sistema mezua uzten.",
        "usermessage-editor": "Sistemako mezularia",
        "watchlist": "Jarraipen zerrenda",
        "addedwatchtext": "\"[[:$1]]\" eta haren eztabaida orria zure [[Special:Watchlist|jarraipen zerrendara]] erantsi da. \n\nOrri honetan aurrerantzean egindako aldaketak zerrenda horretan agertuko dira.",
        "addedwatchtext-short": "$1 orria zure jarraipen zerrendara gehitu da.",
        "removewatch": "Kendu zure jarraipen zerrendatik",
-       "removedwatchtext": "\"[[:$1]]\" orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.",
+       "removedwatchtext": "\"[[:$1]]\" eta haren eztabaida orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.",
        "removedwatchtext-short": "$1 orria zure jarraipen zerrendatik ezabatu da.",
        "watch": "Jarraitu",
        "watchthispage": "Orrialde hau jarraitu",
        "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
-       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
+       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua {{GENDER:$2|sortu}} du",
        "logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da",
+       "logentry-newusers-autocreate": "$1 erabiltzaile kontua automatikoki {{GENDER:$2|sortu da}}",
        "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
        "log-name-tag": "Etiketen erregistroa",
        "rightsnone": "(bat ere ez)",
index c4f30c9..ff28894 100644 (file)
@@ -56,7 +56,8 @@
                        "Matma Rex",
                        "4nn1l2",
                        "Namo",
-                       "Alifakoor"
+                       "Alifakoor",
+                       "Dejavu"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "searcharticle": "برو",
        "history": "تاریخچهٔ صفحه",
        "history_short": "تاریخچه",
+       "history_small": "تاریخچه",
        "updatedmarker": "به‌روزشده از آخرین باری که سرزده‌ام",
        "printableversion": "نسخهٔ قابل چاپ",
        "permalink": "پیوند پایدار",
        "blockedtitle": "کاربر بسته شده‌است",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
+       "systemblockedtext": "نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.\nدلیل ارائه‌شده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n* قطع دسترسی‌شده مورد نظر: $7\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.",
        "blockednoreason": "دلیلی مشخص نشده‌است",
        "whitelistedittext": "برای ویرایش مقاله‌ها باید $1.",
        "confirmedittext": "شما باید، پیش از ویرایش صفحات، آدرس ایمیل خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
        "search-interwiki-caption": "پروژه‌های خواهر",
        "search-interwiki-default": "نتایج از $1:",
        "search-interwiki-more": "(بیشتر)",
+       "search-interwiki-more-results": "نتایج بیشتر",
        "search-relatedarticle": "مرتبط",
        "searchrelated": "مرتبط",
        "searchall": "همه",
        "youremail": "ایمیل:",
        "username": "{{GENDER:$1|نام کاربری}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروه|گروه}}:",
+       "group-membership-link-with-expiry": "$1 (تا $2)",
        "prefs-registration": "زمان ثبت‌نام:",
        "yourrealname": "نام واقعی:",
        "yourlanguage": "زبان:",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
        "editusergroup": "بارگیری گروه‌های کاربر",
        "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": "ثبت گروه‌های {{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": "شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.",
        "userrights-nodatabase": "پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.",
        "userrights-changeable-col": "گروه‌هایی که می‌توانید تغییر دهید",
        "userrights-unchangeable-col": "گروه‌هایی که نمی‌توانید تغییر دهید",
+       "userrights-expiry-current": "منقضی$1",
+       "userrights-expiry-none": "دایمی است",
+       "userrights-expiry": "زمان سرآمدن:",
+       "userrights-expiry-existing": "زمان انقضای موجود: $2، $3",
+       "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": "استفاده از API نوشتن",
        "action-delete": "حذف این صفحه",
-       "action-deleterevision": "حذف این نسخه",
+       "action-deleterevision": "حذف نسخه‌ها",
+       "action-deletelogentry": "حذف سیاههٔ ورودی‌ها",
        "action-deletedhistory": "مشاهدهٔ تاریخچهٔ حذف شدهٔ این صفحه",
+       "action-deletedtext": "مشاهدهٔ متن نسخهٔ حذف‌شده",
        "action-browsearchive": "جستجوی صفحه‌های حذف‌شده",
-       "action-undelete": "احÛ\8cاÛ\8c Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87",
+       "action-undelete": "احÛ\8cاÛ\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا",
        "action-suppressrevision": "مشاهده و احیای ویرایش‌های حذف شده",
        "action-suppressionlog": "مشاهدهٔ این سیاههٔ خصوصی",
        "action-block": "قطع دسترسی این کاربر از ویرایش‌کردن",
        "action-userrights-interwiki": "ویرایش اختیارات کاربری کاربران یک ویکی دیگر",
        "action-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "action-sendemail": "ارسال ایمیل",
+       "action-editmyoptions": "ویرایش ترجیحاتتان",
        "action-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید",
        "action-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
        "action-viewmyprivateinfo": "اطلاعات خصوصی خود را ببینید",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "recentchanges-submit": "نمایش",
+       "rcfilters-activefilters": "فعال‌کردن پالایه‌ها",
+       "rcfilters-restore-default-filters": "بازگردانی پالایه‌های پیش‌فرض",
+       "rcfilters-clear-all-filters": "پاک‌کردن پالایش‌ها",
+       "rcfilters-search-placeholder": "پالایش تغییرات اخیر (جستجو یا شروع به تایپ)",
+       "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
+       "rcfilters-empty-filter": "پالایه‌ای فعال نیست. همهٔ مشارکت‌های دیده می‌شوند.",
+       "rcfilters-filterlist-title": "پالایه‌ها",
+       "rcfilters-filterlist-feedbacklink": "ارسال بازخورد برای پالایه‌های جدید (آزمایشی)",
+       "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
+       "rcfilters-highlightmenu-title": "انتخاب رنگ",
+       "rcfilters-filterlist-noresults": "پالایه‌ای یافت نشد",
+       "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-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-filtergroup-automated": "ویرایش‌های خودکار",
+       "rcfilters-filter-bots-label": "ربات",
+       "rcfilters-filter-bots-description": "ویرایش توسط ابزارهای خودکار.",
+       "rcfilters-filter-humans-label": "انسان (ربات نه)",
+       "rcfilters-filter-humans-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>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "uploaded-setting-handler-svg": "پرونده SVG تنظیم شده با مشخصهٔ \"handler\"  با remote/data/script بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-remote-url-svg": "پرونده SVG تنظیم شده با remote URL بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-image-filter-svg": "پالایه پرونده در نشانی:<code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده SVG بارگذاری‌شده یافت شد.",
-       "uploadscriptednamespace": "اÛ\8cÙ\86 Ù¾Ù\88Ø´Ù\87 Ø§Ø³â\80\8cÙ\88Û\8câ\80\8cجÛ\8c Ø´Ø§Ù\85Ù\84 Ù\81ضاÛ\8c Ù\86اÙ\85 ØºÛ\8cرÙ\82اÙ\86Ù\88Ù\86Û\8c '$1' است",
+       "uploadscriptednamespace": "اÛ\8cÙ\86 Ù¾Ù\88Ø´Ù\87 Ø§Ø³â\80\8cÙ\88Û\8câ\80\8cجÛ\8c Ø­Ø§Ù\88Û\8c Ù\86اÙ\85 ØºÛ\8cرÙ\82اÙ\86Ù\88Ù\86Û\8c '<nowiki>$1</nowiki>' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
        "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
        "uncategorizedcategories": "رده‌های رده‌بندی‌نشده",
        "uncategorizedimages": "پرونده‌های رده‌بندی‌نشده",
        "uncategorizedtemplates": "الگوهای رده‌بندی‌نشده",
+       "uncategorized-categories-exceptionlist": "# شامل فهرست رده‌هایی که باید در ویژه:رده‌های_رده‌بندی‌نشده اصلاح شوند. هر خطی که با \"*\" شروع شده‌است. خطوطی که با نویسه‌های دیگر شروع شده‌اند در نظر گرفته نمی‌شوند (حتی فاصله). برای توضیحات از \"#\" استفاده کنید.",
        "unusedcategories": "رده‌های استفاده‌نشده",
        "unusedimages": "پرونده‌های استفاده‌نشده",
        "wantedcategories": "رده‌های مورد نیاز",
        "apisandbox-sending-request": "ارسال درخواست ای‌پی‌آی...",
        "apisandbox-loading-results": "دریافت درخواست‌های ای‌پی‌آی...",
        "apisandbox-results-error": "در زمان بارگیری پاسخ کوئری API خطایی رخ داده‌است: $1.",
+       "apisandbox-request-selectformat-label": "نمایش داده‌های مورد درخواست به عنوان:",
+       "apisandbox-request-format-url-label": "آدرس اینترنتی متن پرسمان",
        "apisandbox-request-url-label": "درخواست آدرس:",
+       "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": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.",
+       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.\n\nاگر {{GENDER:$2|شما}} به این ایمیل پاسخ دهید، به {{GENDER:$2|فرستنده}} ایمیل اصلی را ارسال {{GENDER:$1|کنید}}، آدرس ایمیل شما برای {{GENDER:$1|آنها}} ارسال می‌شود.",
        "usermessage-summary": "گذاشتن پیغام سامانه.",
        "usermessage-editor": "پیغام رسان سامانه",
        "watchlist": "فهرست پی‌گیری",
        "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
-       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک‌کردن آن هستید دارای یک تاریخچه همراه $1 {{PLURAL:$1|بازبینی|بازبینی}} است:",
+       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک کردن آن هستید دارای یک تاریخچه همراه با $1 {{PLURAL:$1|بازبینی|بازبینی}} است:",
        "historyaction-submit": "نمایش",
        "confirmdeletetext": "شما در حال حذف کردن یک صفحه یا تصویر از پایگاه داده‌ها همراه با تمام تاریخچهٔ آن هستید.\nلطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
        "actioncomplete": "عمل انجام شد",
        "editcomment": "خلاصهٔ ویرایش این بود:  <em>«$1»</em>.",
        "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
        "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[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-emptymodels-title": "هيچ مدل محتوایی در دسترس نيست",
        "changecontentmodel-emptymodels-text": "محتوای موجود در [[:$1]] به هيچ نوعی نمی‌تواند تبديل شود.",
        "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
-       "log-description-contentmodel": "رÙ\88Û\8cدادÙ\87اÛ\8c Ù\85رتبط Ø¨Ø§ Ù\86Ù\85Ù\88Ù\86Ù\87 Ù\85حتÙ\88Û\8câ\80\8cÙ\87اÛ\8c Û\8cÚ© ØµÙ\81Ø­Ù\87",
+       "log-description-contentmodel": "اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 ØªØºÛ\8cÛ\8cرات Ù\85حتÙ\88Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø¨Ø§ Ù\85حتÙ\88Û\8c ØºÛ\8cر Ø§Ø² Ù¾Û\8cØ´â\80\8cÙ\81رض Ø§Û\8cجاد Ø´Ø¯Ù\87â\80\8cاÙ\86دØ\8c Ø±Ø§ Ù\81Ù\87رست Ù\85Û\8câ\80\8cÚ©Ù\86د.",
        "logentry-contentmodel-new": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
        "logentry-contentmodel-change": "نمونه محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
        "logentry-contentmodel-change-revertlink": "واگردانی",
        "proxyblockreason": "نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.\nلطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.",
        "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده است.",
        "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
+       "softblockrangesreason": "کاربران ثبت‌نام نکرده نمی‌توانند از IP شما ($1) برای ویرایش استفاده کنند. لطفاً به سامانه وارد شوید.",
        "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1",
        "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
        "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": "صفحه منتقل شود",
        "pageinfo-length": "حجم صفحه  (بایت)",
        "pageinfo-article-id": "شناسهٔ صفحه",
        "pageinfo-language": "زبان محتوای صفحه",
+       "pageinfo-language-change": "تغییر",
        "pageinfo-content-model": "ساختار محتوای صفحه",
        "pageinfo-content-model-change": "تغییر",
        "pageinfo-robot-policy": "‌فهرست‌کردن توسط ربات‌ها",
        "logentry-tag-update-logentry": "$1 برچسب سیاههٔ $5 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
        "rightsnone": "(هیچ)",
        "revdelete-summary": "خلاصه ویرایش",
+       "rightslogentry-temporary-group": "$1 (موقت، تا $2)",
        "feedback-adding": "افزودن بازخورد به صفحه...",
        "feedback-back": "بازگشت",
        "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
        "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 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
        "limitreport-expansiondepth": "بیشترین عمق گسترش",
        "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
-       "expandtemplates": "بسطدادن الگوها",
+       "expandtemplates": "بسط دادن الگوها",
        "expand_templates_intro": "این صفحهٔ ویژه متنی را دریافت کرده و تمام الگوهای به‌کاررفته در آن را به طور بازگشتی بسط می‌دهد. همچنین تابع‌های تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون  <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط می‌دهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت می‌گیرد.",
        "expand_templates_title": "عنوان موضوع، برای {{FULLPAGENAME}} و غیره:",
        "expand_templates_input": "متن ورودی:",
        "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 برای محتوی زبانی پیش‌فرض ویکی، تعریف شده‌است.",
+       "pagelang-db-failed": "پایگاه داده برای تغییر زبان صفحه خطا داد.",
        "right-pagelang": "تغییر صفحهٔ زبان",
        "action-pagelang": "تغییر زبان صفحه",
        "log-name-pagelang": "سیاههٔ تغییر زبان",
        "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": "نوع بسته شدن:",
-       "log-action-filter-contentmodel": "تغییر نوع contentmodel:",
+       "log-action-filter-contentmodel": "نوع تغییرات مدل محتوا:",
        "log-action-filter-delete": "نوع حذف:",
        "log-action-filter-import": "نوع واردات",
        "log-action-filter-managetags": "نوع مدیریت",
        "log-action-filter-block-reblock": "تصحیح بلاک",
        "log-action-filter-block-unblock": "باز شدن",
        "log-action-filter-contentmodel-change": "تغییر مدل محتوا",
-       "log-action-filter-contentmodel-new": "ایجاد صفحه با contentmodel غیر استاندارد",
+       "log-action-filter-contentmodel-new": "ایجاد صفحه با مدل محتوای غیر استاندارد",
        "log-action-filter-delete-delete": "حذف صفحه",
        "log-action-filter-delete-delete_redir": "رونویسی تغییرمسیر",
        "log-action-filter-delete-restore": "احیای صفحه",
        "usercssispublic": "لطفاً توجه کنید: زیرصفحه‌های سی‌اس‌اس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
        "restrictionsfield-badip": "نشانی یا بازهٔ آی‌پی نامعتبر: $1",
        "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
-       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "revid": "نسخهٔ $1",
+       "pageid": "شناسهٔ صفحهٔ $1"
 }
index 730bcc3..aa1e090 100644 (file)
        "blockedtitle": "Käyttäjä on estetty",
        "blockedtext": "'''Käyttäjätunnuksesi tai IP-osoitteesi on estetty.'''\n\nEston on asettanut $1.\nSyy: '''$2'''\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "autoblockedtext": "IP-osoitteesi on estetty automaattisesti, koska sitä on käyttänyt toinen käyttäjä, jonka on estänyt ylläpitäjä $1.\nEston syy on:\n\n:''$2''\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\n\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\n\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
+       "systemblockedtext": "Käyttäjätunnuksesi tai IP-osoitteesi on automaattisesti estetty MediaWikin toimesta.\nAnnettu syy on:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nTämänhetkinen IP-osoitteesi on $3.\nOle hyvä ja liitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "blockednoreason": "(syytä ei annettu)",
        "whitelistedittext": "Sinun täytyy $1, jotta voisit muokata sivuja.",
        "confirmedittext": "Et voi muokata sivuja, ennen kuin olet varmentanut sähköpostiosoitteesi. Voit tehdä varmennuksen [[Special:Preferences|asetussivulla]].",
        "search-file-match": "(vastaa tiedoston sisältöä)",
        "search-suggest": "Tarkoititko: $1",
        "search-rewritten": "Näytetään tulokset haulla $1. Haluatko hakea haulla $2?",
-       "search-interwiki-caption": "Sisarprojektit",
+       "search-interwiki-caption": "Sisarhankkeet",
        "search-interwiki-default": "Tulokset osoitteesta $1:",
        "search-interwiki-more": "(lisää)",
+       "search-interwiki-more-results": "lisää tuloksia",
        "search-relatedarticle": "Hae samankaltaisia sivuja",
        "searchrelated": "samankaltainen",
        "searchall": "kaikki",
        "youremail": "Sähköpostiosoite",
        "username": "{{GENDER:$1|Käyttäjätunnus}}",
        "prefs-memberingroups": "{{GENDER:$2|Jäsenenä}} {{PLURAL:$1|ryhmässä|ryhmissä}}",
+       "group-membership-link-with-expiry": "$1 ($2 asti)",
        "prefs-registration": "Rekisteröintiaika",
        "yourrealname": "Oikea nimi",
        "yourlanguage": "Käyttöliittymän kieli",
        "editusergroup": "Lataa käyttäjäryhmät",
        "editinguser": "Muutetaan {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 oikeuksia",
        "viewinguserrights": "Näytetään {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 käyttäjäryhmät",
-       "userrights-editusergroup": "Muuta käyttäjän ryhmiä",
-       "userrights-viewusergroup": "Näytä käyttäjäryhmät",
+       "userrights-editusergroup": "Muuta {{GENDER:$1|käyttäjän}} ryhmiä",
+       "userrights-viewusergroup": "Tarkastele {{GENDER:$1|käyttäjän}} ryhmiä",
        "saveusergroups": "Tallenna {{GENDER:$1|käyttäjän}} ryhmät",
        "userrights-groupsmember": "Jäsenenä ryhmissä:",
        "userrights-groupsmember-auto": "Automaattisesti jäsenenä ryhmissä:",
-       "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä, kun olet hänet siihen lisännyt tai päinvastoin",
+       "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan ryhmää, kun olet sen lisännyt tai päinvastoin.\n* # tarkoittaa että voit vain asettaa tämän ryhmän päättymisajan takaisin; et voi tuoda sitä eteenpäin.",
        "userrights-reason": "Syy:",
        "userrights-no-interwiki": "Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.",
        "userrights-nodatabase": "Tietokantaa $1 ei ole tai se ei ole paikallinen.",
        "userrights-changeable-col": "Ryhmät, joita voit muuttaa",
        "userrights-unchangeable-col": "Ryhmät, joita et voi muuttaa",
+       "userrights-expiry-current": "Vanhentuu $1",
+       "userrights-expiry-none": "Ei vanhene",
+       "userrights-expiry": "Vanhentuu:",
+       "userrights-expiry-existing": "Nykyinen vanhentumisaika: $3, $2",
+       "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.",
        "group": "Ryhmä",
        "group-user": "käyttäjät",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Näytä",
        "rcfilters-activefilters": "Aktiiviset suodattimet",
+       "rcfilters-restore-default-filters": "Palauta oletussuodattimet",
+       "rcfilters-clear-all-filters": "Tyhjennä kaikki suodattimet",
+       "rcfilters-search-placeholder": "Suodattimen viimeaikaiset muutokset (selaa tai aloita kirjoittaa)",
        "rcfilters-invalid-filter": "Suodatin on epäkelpo",
+       "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
        "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-highlightmenu-title": "Valitse väri",
        "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
+       "rcfilters-filtergroup-registration": "Käyttäjän rekisteröinti",
+       "rcfilters-filter-registered-label": "Rekisteröitynyt",
+       "rcfilters-filter-registered-description": "Kirjautuneet muokkaukset.",
+       "rcfilters-filter-unregistered-label": "Rekisteröimätön",
+       "rcfilters-filter-unregistered-description": "Muokkaajat, jotka eivät ole kirjautuneet sisään.",
+       "rcfilters-filter-editsbyself-label": "Omat muokkauksesi",
+       "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-filter-userExpLevel-newcomer-label": "Tulokkaat",
+       "rcfilters-filter-userExpLevel-learner-label": "Oppijat",
+       "rcfilters-filter-userExpLevel-experienced-label": "Kokeneet käyttäjät",
+       "rcfilters-filter-userExpLevel-experienced-description": "Enemmän kuin 30 päivää aktiivisena ja 500 muokkausta.",
+       "rcfilters-filtergroup-automated": "Automatisoidut muutokset",
+       "rcfilters-filter-bots-label": "Botti",
+       "rcfilters-filter-bots-description": "Muokkaukset jotka tehty automaattisilla työkaluilla.",
+       "rcfilters-filter-humans-label": "Ihminen (ei botti)",
+       "rcfilters-filtergroup-significance": "Merkitys",
+       "rcfilters-filter-minor-label": "Pienet muutokset",
+       "rcfilters-filter-major-label": "Ei-pienet muutokset",
+       "rcfilters-filter-major-description": "Muokkauksia ei ole merkitty kuin pieniksi.",
+       "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-description": "Muokkaukset jotka luovat uusia sivuja.",
+       "rcfilters-filter-categorization-label": "Luokkamuutokset",
+       "rcfilters-filter-logactions-label": "Kirjatut toimet",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "rclistfrom": "Näytä uudet muutokset $3 kello $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
-       "uploadscriptednamespace": "Tämä SVG-tiedosto sisältää nimiavaruuden ”$1”, joka ei ole sallittu.",
+       "uploadscriptednamespace": "Tämä SVG-tiedosto sisältää nimiavaruuden ”<nowiki>$1</nowiki>”, joka ei ole sallittu.",
        "uploadinvalidxml": "Ladatun tiedoston XML-koodia ei voitu jäsentää kunnolla.",
        "uploadvirus": "Tiedosto sisältää viruksen. Tarkemmat tiedot: $1",
        "uploadjava": "Tämä tiedosto on ZIP-tiedosto, joka sisältää Java .class-tiedoston.\nJava-tiedostojen tallentaminen ei ole sallittua, sillä ne saattavat aiheuttaa tietoturvariskejä.",
        "apisandbox-sending-request": "API-pyyntöä lähetetään...",
        "apisandbox-loading-results": "API-tuloksia vastaanotetaan...",
        "apisandbox-results-error": "Tapahtui virhe ladattaessa API-kyselyn vastausta: $1",
+       "apisandbox-request-format-url-label": "URL-kyselymerkkijono",
        "apisandbox-request-url-label": "Pyynnön URL",
        "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Korjaa \"token\" ja lähetä uudelleen",
        "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
        "apisandbox-continue": "Jatka",
        "apisandbox-continue-clear": "Tyhjennä",
+       "apisandbox-param-limit": "Kirjoita <kbd>max</kbd> käyttääksesi ylärajaa.",
        "apisandbox-multivalue-all-namespaces": "$1 (Kaikki nimiavaruudet)",
        "apisandbox-multivalue-all-values": "$1 (Kaikki arvot)",
        "booksources": "Kirjalähteet",
        "booksources-search": "Hae",
        "booksources-text": "Alla linkkejä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Sivuilla voi myös olla lisätietoa kirjoista.",
        "booksources-invalid-isbn": "Annettu ISBN-numero ei ole kelvollinen. Tarkista alkuperäisestä lähteestä kirjoitusvirheiden varalta.",
+       "magiclink-tracking-rfc": "Sivut, jotka käyttävät RFC-taikalinkkejä",
+       "magiclink-tracking-pmid": "Sivut, jotka käyttävät PMID-taikalinkkejä",
+       "magiclink-tracking-isbn": "Sivut, jotka käyttävät ISBN-taikalinkkejä",
        "specialloguserlabel": "Suorittaja:",
        "speciallogtitlelabel": "Kohde (sivu tai {{ns:user}}:käyttäjänimi):",
        "log": "Lokit",
        "cant-move-to-user-page": "Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).",
        "cant-move-category-page": "Sinulla ei ole oikeutta siirtää luokkien sivuja.",
        "cant-move-to-category-page": "Sinulla ei ole oikeutta siirtää sivua luokkasivuksi.",
+       "cant-move-subpages": "Sivulla ei ole oikeutta siirtää alasivuja.",
+       "namespace-nosubpages": "Nimiavaruus \"$1\" ei hyväksy alasivuja.",
        "newtitle": "Uusi nimi sivulle:",
        "move-watch": "Tarkkaile tätä sivua",
        "movepagebtn": "Siirrä sivu",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|päivitti}} merkkauksia lokimerkinnässä $5 sivulla $3 ({{PLURAL:$7|lisätty}} $6; {{PLURAL:$9|poistettu}} $8)",
        "rightsnone": "(ei oikeuksia)",
        "revdelete-summary": "yhteenvedon",
+       "rightslogentry-temporary-group": "$1 (tilapäinen, $2 asti)",
        "feedback-adding": "Lisätään palautetta sivulle...",
        "feedback-back": "Takaisin",
        "feedback-bugcheck": "Hyvä! Varmista vielä, että ohjelmointivirhettä ei löydy [$1 tunnettujen virheiden luettelosta].",
        "api-error-emptypage": "Ei ole sallittua luoda uutta, tyhjää sivua.",
        "api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
        "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
-       "api-error-unknown-warning": "Tuntematon varoitus: $1.",
+       "api-error-unknown-warning": "Tuntematon varoitus: \"$1\".",
        "api-error-unknownerror": "Tuntematon virhe: $1.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunti|sekuntia}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuutti|minuuttia}}",
        "pagelang-select-lang": "Valitse kieli",
        "pagelang-reason": "Syy",
        "pagelang-submit": "Lähetä",
+       "pagelang-nonexistent-page": "Sivua $1 ei ole olemassa.",
+       "pagelang-unchanged-language": "Sivu $1 on jo asetettu kielelle $2.",
+       "pagelang-db-failed": "Tietokanta epäonnistui vaihtamaan sivun kielen.",
        "right-pagelang": "Vaihtaa sivun kieli",
        "action-pagelang": "muuttaa sivun kieliasetuksia",
        "log-name-pagelang": "Kielenvaihtoloki",
        "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
        "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lisää luokka...",
+       "mw-widgets-usersmultiselect-placeholder": "Lisää enemmän...",
        "sessionmanager-tie": "!!FYZZ!!Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 istuntoa",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "istuntoja, joissa on evästeet käytössä",
        "log-action-filter-block-reblock": "Estoasetusten muuttaminen",
        "log-action-filter-block-unblock": "Eston poistaminen",
        "log-action-filter-contentmodel-change": "Sisältömallin muuttaminen",
-       "log-action-filter-contentmodel-new": "Luotu sivu, jossa on poikkeava Sisältömalli",
+       "log-action-filter-contentmodel-new": "Luotu sivu, jossa on poikkeava sisältömalli",
        "log-action-filter-delete-delete": "Sivun poistaminen",
        "log-action-filter-delete-delete_redir": "Ohjauksen päällekirjoitus",
        "log-action-filter-delete-restore": "Sivun palauttaminen",
        "authmanager-realname-label": "Oikea nimi",
        "authmanager-realname-help": "Käyttäjän oikea nimi",
        "authmanager-provider-password": "Salasanapohjainen varmennus",
+       "authmanager-provider-password-domain": "Salasana- ja toimialue-pohjainen todennus",
        "authmanager-provider-temporarypassword": "Väliaikainen salasana",
        "authprovider-confirmlink-message": "Viimeisimpien kirjautumisyritystesi perusteella seuraavat tunnukset voidaan linkittää wikitunnuksellesi. Tunnusten linkittäminen mahdollistaa sisäänkirjautumisen niitä käyttämällä. Valitse tunnukset, jotka tulisi linkittää.",
        "authprovider-confirmlink-request-label": "Tunnukset, jotka tulisi yhdistää",
index 03447f7..4b0fa74 100644 (file)
                        "Pymouss",
                        "Derugon",
                        "Benoit Rochon",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Archaeodontosaurus",
+                       "Trizek (WMF)"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera tout de même créée.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "missingcommentheader": "<strong>Rappel :</strong> vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
-       "summary-preview": "Aperçu du résumé :",
+       "summary-preview": "Aperçu du résumé de modification :",
        "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
        "last": "diff",
        "page_first": "première",
        "page_last": "dernière",
-       "histlegend": "Diff de sélection : cochez les boîtes 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 précédente version, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
+       "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-show-deleted": "Supprimés seulement",
        "histfirst": "les plus anciennes",
        "search-interwiki-caption": "Projets frères",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
+       "search-interwiki-more-results": "résultats supplémentaires",
        "search-relatedarticle": "Reliés",
        "searchrelated": "reliés",
        "searchall": "tout",
        "editusergroup": "Charger des groupes d’utilisateurs",
        "editinguser": "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Affichage des droits utilisateur de {{GENDER:$1|l’utilisateur|l’utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modifier les groupes de l'utilisateur",
-       "userrights-viewusergroup": "Afficher les groupes d'utilisateurs",
+       "userrights-editusergroup": "Modifier les groupes de l'utilisat{{GENDER:$1|eur|rice}}",
+       "userrights-viewusergroup": "Afficher les groupes d'utilisat{{GENDER:$1|eur|rice}}",
        "saveusergroups": "Enregistrer les groupes de l’{{GENDER:$1|utilisateur|utilisatrice}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicite de :",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que l’utilisat{{GENDER:$1|eur|rice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.",
+       "userrights-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-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-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-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-filterlist-noresults": "Aucun filtre trouvé",
        "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
-       "rcfilters-filter-registered-label": "Enregistré",
+       "rcfilters-filter-registered-label": "Connectés",
        "rcfilters-filter-registered-description": "Éditeurs connectés.",
-       "rcfilters-filter-unregistered-label": "Désinscrit",
+       "rcfilters-filter-unregistered-label": "Non connectés",
        "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
        "rcfilters-filtergroup-authorship": "Modifier la paternité",
        "rcfilters-filter-editsbyself-label": "Vos propres modifications",
        "uploaded-setting-handler-svg": "Les SVG qui positionnent l’attribut « handler » avec distant/données/script sont bloqués. <code>$1=\"$2\"</code> a été trouvé dans le fichier SVG téléchargé.",
        "uploaded-remote-url-svg": "Les SVG qui positionnent un attribut de style avec une URL distante sont bloqués. <code>$1=\"$2\"</code> trouvé dans le fichier SVG téléchargé.",
        "uploaded-image-filter-svg": "Filtre d’image avec URL trouvé : <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléchargé.",
-       "uploadscriptednamespace": "Ce fichier SVG contient un espace de noms '$1' non autorisé.",
+       "uploadscriptednamespace": "Ce fichier SVG contient un espace de noms '<nowiki>$1</nowiki>' non autorisé.",
        "uploadinvalidxml": "Le XML dans le fichier importé n’a pas pu être analysé.",
        "uploadvirus": "Ce fichier contient un virus ! Pour plus de détails, consultez : $1",
        "uploadjava": "C’est un fichier ZIP qui contient un fichier Java .class.\nLe téléchargement de fichiers Java n’est pas autorisé, car ils peuvent contourner certaines restrictions de sécurité.",
        "editcomment": "Le résumé de la modification était : <em>$1</em>.",
        "revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]",
        "revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Révocation des modifications effectuées par $1 ;\nrétablissement de la dernière version par $2.",
+       "rollback-success": "Révocation des modifications effectuées par {{GENDER:$3|$1}} ;\nrétablissement de la dernière version par {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]",
        "sessionfailure-title": "Erreur de session",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
        "htmlform-user-not-exists": "<strong>$1</strong> n’existe pas.",
        "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
-       "logentry-delete-delete_redir": "$1 {{GENDER:$2|supprimé}} redirigé vers $3 par écrasement.",
+       "logentry-delete-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-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",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ajouter une catégorie...",
+       "mw-widgets-usersmultiselect-placeholder": "Ajouter plus ...",
        "sessionmanager-tie": "Impossible de combiner des types multiples de demandes d’authentification : $1.",
        "sessionprovider-generic": "sessions $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les témoins (''cookies'')",
index f2eaec5..23b5493 100644 (file)
        "uploaded-setting-handler-svg": "Los SVG que dèfenéssont l’atribut « handler » avouéc distant / balyês / scripte sont dèfendus. <code>$1=\"$2\"</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
        "uploaded-remote-url-svg": "Los SVG que dèfenéssont un atribut de stilo quint que seye avouéc un’URL distanta sont dèfendus. <code>$1=\"$2\"</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
        "uploaded-image-filter-svg": "Un filtro d’émâge avouéc URL est étâ trovâ : <code>&lt;$1 $2=\"$3\"&gt;</code> dedens lo fichiér SVG tèlèchargiê.",
-       "uploadscriptednamespace": "Cél fichiér SVG contint un èspâço de noms « $1 » pas ôtorisâ.",
+       "uploadscriptednamespace": "Cél fichiér SVG contint un èspâço de noms « <nowiki>$1</nowiki> » pas ôtorisâ.",
        "uploadinvalidxml": "Lo XML dedens lo fichiér tèlèchargiê at pas possu étre analisâ.",
        "uploadvirus": "Cél fichiér contint un virus !\nDètalys : $1",
        "uploadjava": "O est un fichiér ZIP que contint un fichiér Java « .class ».\nLo tèlèchargement de fichiérs Java est pas ôtorisâ, pôvont èvitar de rèstriccions de sècuritât.",
index 063cdae..a022551 100644 (file)
        "saveprefs": "Iinstelangen seekre",
        "restoreprefs": "Normool iinstelangen weder haale (uun arke kirew)",
        "prefs-editing": "Bewerke",
-       "rows": "Räen:",
-       "columns": "Spleder:",
        "searchresultshead": "Schük",
        "stub-threshold": "Formatiarang faan links <a href=\"#\" class=\"stub\">för letj sidjen</a> (uun Byte):",
        "stub-threshold-disabled": "Ufsteld",
        "uploaded-script-svg": "Skriptelement „$1“ uun det huuchschüürd SVG-datei fünjen.",
        "uploaded-hostile-svg": "Ünseeker CSS uun't style-element faan det huuchschüürd SVG-datei fünjen.",
        "uploaded-event-handler-on-svg": "Event-handler atributen <code>$1=\"$2\"</code> san uun SVG-datein ei tuläät.",
-       "uploadscriptednamespace": "Detdiar SVG-datei wiset üüb en ferkiarden nöömrüm \"$1\".",
+       "uploadscriptednamespace": "Detdiar SVG-datei wiset üüb en ferkiarden nöömrüm \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Det XML uun det huuchschüürd datei küd ei ''parset'' wurd.",
        "uploadvirus": "Uun detdiar datei as en wiirus! Details: $1",
        "uploadjava": "Detdiar as en ZIP-datei mä en CLASS-datei faan Java.\nJava-datein kön ei tuläät wurd, auer jo det seekerhaid uun fraag stel küd.",
        "feedback-useragent": "Brüker-agent:",
        "searchsuggest-search": "Schük uun {{SITENAME}}",
        "searchsuggest-containing": "diar banen as ...",
-       "api-error-badaccess-groups": "Dü mutst nian datein tu detdiar Wiki huuchschüür.",
        "api-error-badtoken": "Intern feeler: Token as ferkiard.",
-       "api-error-copyuploaddisabled": "Det huuchschüüren auer URL as üüb didiar server ei aktiif.",
-       "api-error-duplicate": "Uun det Wiki {{PLURAL:$1|as al en ööder datei|san al muar datein}} mä detsalew banen.",
-       "api-error-duplicate-archive": "Diar wiar al {{PLURAL:$1|ööder datei|ööder datein}} mä detsalew banen. {{PLURAL:$1|Hat as |Jo san}} oober stregen wurden.",
-       "api-error-empty-file": "Det datei, wat dü huuchschüürd heest, as leesag.",
        "api-error-emptypage": "Dü mutst nian leesag sidjen nei iinstel.",
-       "api-error-fetchfileerror": "Intern feeler: Bi't ufrepen faan det datei as wat skiaf gingen.",
-       "api-error-fileexists-forbidden": "En datei mä di nööm „$1“ as al diar. Hat koon ei auerskrewen wurd.",
-       "api-error-fileexists-shared-forbidden": "En date mä di nööm „$1“ as al uun't gemiansoom archiif an koon ei auerskrewen wurd.",
-       "api-error-file-too-large": "Det datei, wat dü huuchschüürd heest, as tu grat.",
-       "api-error-filename-tooshort": "Di dateinööm as tu kurt.",
-       "api-error-filetype-banned": "Son slach faan datei as ei tuläät.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|as nään tuläät slach faan datein|san nian tuläät slacher faan datein}}.\n{{PLURAL:$3|En tuläät slach as|Tuläät slacher san}} $2.",
-       "api-error-filetype-missing": "Det datei, wat dü huuchschüür wel, hää nian dateiaanj.",
-       "api-error-hookaborted": "Det feranrang, wat dü maage wulst, as faan en ütjwidjet software-funktjuun ufbreegen wurden.",
-       "api-error-http": "Intern feeler: Ferbinjang tu a server as skiaf gingen.",
-       "api-error-illegal-filename": "Didiar dateinööm as ei tuläät.",
-       "api-error-internal-error": "Intern feeler: diar as wat skiaf gingen bi't huuchschüüren faan det datei tu det Wiki.",
-       "api-error-invalid-file-key": "Intern feeler: Det datei as uun det tidjwiis archiif ei fünjen wurden.",
-       "api-error-missingparam": "Intern feeler: Det uunfraag as ei hial uunkimen.",
-       "api-error-missingresult": "Intern feeler: Küd ei luke, of det kopiarin loket hää.",
-       "api-error-mustbeloggedin": "Dü skel di uunmelde, am datein huuchtuschüüren.",
-       "api-error-mustbeposted": "Intern feeler: Ferkiard HTTP-muude.",
-       "api-error-noimageinfo": "Det huuchschüüren hää loket, oober di server hää nian datei-dooten.",
-       "api-error-nomodule": "Intern feeler: Diar as nian modul tu huuchschüüren fäästlaanj wurden.",
-       "api-error-ok-but-empty": "Intern feeler: Di server sait niks.",
-       "api-error-overwrite": "Dü könst nian datei auerskriiw, wat al diar as.",
-       "api-error-stashfailed": "Intern feeler: Di server küd nian tidjwiis datei seekre.",
        "api-error-publishfailed": "Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.",
-       "api-error-stasherror": "Bi't huuchschüüren faan detdiar datei as wat skiaf gingen.",
-       "api-error-stashedfilenotfound": "Det datei, wat al ans seekert wurden as, küd bi't huuchloosin ei fünjen wurd.",
-       "api-error-stashpathinvalid": "Det steed, huar det seekert datei fünjen wurd skul, jaft at ei.",
-       "api-error-stashfilestorage": "Bi't seekrin faan detdiar datei uun a spiiker as wat skiaf gingen.",
-       "api-error-stashzerolength": "Di server küd det datei ei seekre, auer hat man bluas nul bytes grat as.",
-       "api-error-stashnotloggedin": "Dü skel uunmeldet wees, wan dü datein uun a spiiker seekre wel.",
-       "api-error-stashwrongowner": "Det datei, huar dü uun a spiiker üüb tugrip wulst, hiart di ei.",
-       "api-error-stashnosuchfilekey": "Di datei-kai, huar dü uun a spiiker üüb tugrip wulst, as ei diar.",
-       "api-error-timeout": "Di server hää ei rochttidjag swaaret (time-out).",
-       "api-error-unclassified": "Diar as irgentwat skiaf gingen.",
-       "api-error-unknown-code": "Ünbekäänd feeler: „$1“",
-       "api-error-unknown-error": "Intern feeler: Bi't huuchschüüren faan det datei as wat skiaf gingen.",
+       "api-error-stashfailed": "Intern feeler: Di server küd nian tidjwiis datei seekre.",
        "api-error-unknown-warning": "Ünbekäänd wäärnang: $1",
        "api-error-unknownerror": "Ünbekäänd feeler: „$1“",
-       "api-error-uploaddisabled": "Uun detdiar Wiki könst dü niks huuchschüür.",
-       "api-error-verification-error": "Det datei, wat dü huuchschüür wel, as uunstaken of hää en ferkiard dateiaanj.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minüüt|minüüten}}",
        "duration-hours": "$1 {{PLURAL:$1|stünj|stünjen}}",
index 65859a8..5bd8f3b 100644 (file)
@@ -17,6 +17,7 @@
        "tog-hideminor": "Falaich mùthaidhean beaga ann an liosta nam mùthaidhean ùra",
        "tog-hidepatrolled": "Falaich mùthaidhean fo fhreiceadan ann an liosta nam mùthaidhean ùra",
        "tog-newpageshidepatrolled": "Falaich duilleagan fo fhreiceadan ann an liosta nan duilleagan ùra",
+       "tog-hidecategorization": "Falaich roinnean nan duilleagan",
        "tog-extendwatchlist": "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
        "tog-usenewrc": "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire",
        "tog-numberheadings": "Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin",
@@ -27,6 +28,7 @@
        "tog-watchdefault": "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
        "tog-watchmoves": "Cuir duilleagan a ghluaiseas mi air a' chlàr-fhaire agam",
        "tog-watchdeletion": "Cuir duilleagan a sguabas mi às air a' chlàr-fhaire agam",
+       "tog-watchuploads": "Cuir faidhlichean ùra ris a luchdaicheas mi suas dhan liosta-fhaire agam",
        "tog-watchrollback": "Cuir duilleagan air an do rinn mi roladh air ais air a' chlàr-fhaire agam",
        "tog-minordefault": "Comharraich gach mùthadh mar mhùthadh beag a ghnàth",
        "tog-previewontop": "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
@@ -36,7 +38,7 @@
        "tog-enotifminoredits": "Cuir post-dealain thugam nuair a nithear mùthadh beag air duilleagan cuideachd",
        "tog-enotifrevealaddr": "Nochd an seòladh puist-d agam ann am brathan-naidheachd puist-d",
        "tog-shownumberswatching": "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
-       "tog-oldsig": "An t-earr-sgrìobhadh làithreach:",
+       "tog-oldsig": "An t-earr-sgrìobhadh làithreach agad:",
        "tog-fancysig": "Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)",
        "tog-uselivepreview": "Cleachd an ro-shealladh beò",
        "tog-forceeditsummary": "Cuir ceist nuair a dh'fhàgas mi gearr-chunntas an deasachaidh bàn",
        "tog-watchlisthidebots": "Falaich mùthaidhean nam bot air mo chlàr-faire",
        "tog-watchlisthideminor": "Falaich mùthaidhean beaga air mo chlàr-faire",
        "tog-watchlisthideliu": "Falaich mùthaidhean le cleachdaichean a tha air logadh a-steach air mo chlàr-faire",
+       "tog-watchlistreloadautomatically": "Ath-luchdaich an liosta-fhaire gu fèin-obrachail uair sam bith a thèid criathrag atharrachadh (feum air JavaScript)",
        "tog-watchlisthideanons": "Falaich mùthaidhean le cleachdaichean gun ainm air mo chlàr-faire",
        "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air a' chlàr-fhaire agam",
+       "tog-watchlisthidecategorization": "Falaich roinnean nan duilleagan",
        "tog-ccmeonemails": "Cuir lethbhric de phuist-dhealain a chuireas mi do chleachdaichean eile thugam",
        "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaran",
        "tog-showhiddencats": "Seall na roinnean-seòrsa falaichte",
        "category-file-count-limited": "Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
        "listingcontinuesabbrev": "(an corr)",
        "index-category": "Duilleagan air a' chlàr-innse",
-       "noindex-category": "Duilleagan nach eil air a' chlàr-innse",
+       "noindex-category": "Duilleagan nach deach inneacsadh",
        "broken-file-category": "Duilleagan sa bheil ceanglaichean faidhle a tha briste",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Mu",
        "newwindow": "(a' fosgladh ann an uinneag ùr)",
        "cancel": "Sguir dheth",
        "moredotdotdot": "Barrachd...",
-       "morenotlisted": "Chan eil an liosta seo iomlan.",
+       "morenotlisted": "Dh’fhaoidte nach eil an liosta seo iomlan.",
        "mypage": "Duilleag",
        "mytalk": "Deasbaireachd",
        "anontalk": "Deasbaireachd",
        "tagline": "O {{SITENAME}}",
        "help": "Cobhair",
        "search": "Lorg",
+       "search-ignored-headings": " #<!-- fàg an loidhne seo dìreach mar a tha e --> <pre>\n# Ceann-sgrìobhaidhean nach doir lorg for dhaibh.\n# Bidh buaidh aig na h-atharraichean seo cho luath ’s a thèid an ceann-sgrìobhadh inneacsadh.\n# ’S urrainn dhut ath-inneacsadh a sparradh air an t-siostam le bhith a’ sàbhalachadh deasachadh neoinitheach.\n# Seo an co-chàradh:\n#   * Tha rud sam bith eadar caractar “#” agus deireadh loidhne ’na bheachd.\n#   * Ma tha loidhne sam bith ann nach eil bàn, sin an tiotal a thèid a leigeil seachad.\nIomraidhean\nCeanglaichean ris an taobh a-muigh\nFaic na leanas cuideachd\n #</pre> <!-- fàg an loidhne seo dìreach mar a tha e -->",
        "searchbutton": "Lorg",
        "go": "Siuthad",
        "searcharticle": "Siuthad",
        "history": "Eachdraidh na duilleige",
        "history_short": "Eachdraidh",
+       "history_small": "eachdraidh",
        "updatedmarker": "air ùrachadh on turas mu dheireadh a thadhail mi air",
        "printableversion": "Tionndadh a ghabhas a chlò-bhualadh",
        "permalink": "Ceangal buan",
        "talk": "Deasbaireachd",
        "views": "Tadhalan",
        "toolbox": "Innealan",
+       "tool-link-userrights": "Atharraich buidhnean nan {{GENDER:$1|cleachdaichean}}",
+       "tool-link-userrights-readonly": "Seall buidhnean nan {{GENDER:$1|cleachdaichean}}",
+       "tool-link-emailuser": "Cuir post gun {{GENDER:$1|chleachdaiche}} seo",
        "userpage": "Seall duilleag a' chleachdaiche",
        "projectpage": "Seall duilleag a' phròiseict",
        "imagepage": "Seall duilleag an fhaidhle",
        "eauthentsent": "Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.\nMus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an stiùireadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.",
        "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde.",
        "mailerror": "Mearachd a' cur post: $1",
-       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad anns na $2 seo chaidh agus sin an àireamh as motha a tha ceadaichte.\nChan urrainn do dh’aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin aig an àm seo.",
        "emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
        "emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
        "noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
        "minoredit": "Seo mùthadh beag",
        "watchthis": "Cum sùil air an duilleag seo",
        "savearticle": "Sàbhail an duilleag",
+       "savechanges": "Sàbhail na dh’atharraich thu",
        "publishpage": "Foillsich an duilleag",
        "publishchanges": "Foillsich na mùthaidhean",
        "preview": "Ro-shealladh",
        "searchprofile-advanced-tooltip": "Lorg am broinn ainm-spàsan gnàthaichte",
        "search-result-size": "$1 ({{PLURAL:$2|$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
        "search-result-category-size": "{{PLURAL:$1|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|$2 fho-roinn-seòrsa|$2 fho-roinn-seòrsa|$2 fo-roinnean-seòrsa|$2 fo-roinn-seòrsa}}, {{PLURAL:$3|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
-       "search-redirect": "(ag ath-sheòladh $1)",
+       "search-redirect": "(ag ath-sheòladh $1)",
        "search-section": "(earrann $1)",
        "search-category": "(roinn-seòrsa $1)",
        "search-file-match": "(a' freagairt ri susbaint an fhaidhle)",
        "prefswarning-warning": "Rinn thu atharrachadh air na roghainnean agad nach deach a shàbhaladh fhathast.\nCha tèid na roghainnean agad ùrachadh ma dh'fhàgas tu an duilleag seo gun bhriogadh air \"$1\".",
        "prefs-tabs-navigation-hint": "Gliocas: 'S urrainn dhut na h-iuchraichean saighde chlì 's dheas a chleachdadh gus leum a ghearradh o thaba gu taba air liosta nan taba.",
        "userrights": "Stiùireadh ceadan a' chleachdaiche",
-       "userrights-lookup-user": "Stiùirich na buidhnean chleachdaichean",
+       "userrights-lookup-user": "Tagh cleachdaiche",
        "userrights-user-editname": "Cuir a-steach ainm-cleachdaiche:",
-       "editusergroup": "Deasaich na buidhnean {{GENDER:$1|chleachdaichean}}",
+       "editusergroup": "Luchdaich buidhnean nan cleachdaichean",
        "editinguser": "Ag atharrachadh ceadan a’ {{GENDER:$1|chleachdaiche}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Deasaich na buidhnean chleachdaichean",
+       "userrights-editusergroup": "Deasaich buidhnean {{GENDER:$1|a’ chleachdaiche}}",
        "saveusergroups": "Sàbhail na buidhnean {{GENDER:$1|chleachdaichean}}",
        "userrights-groupsmember": "Ball de:",
        "userrights-groupsmember-auto": "Ball fèin-obrachail de:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "'S urrainn dhut na buidhnean sa bheil an cleachdaiche seo 'na bhall atharrachadh:\n* Is ciall dha chromag sa bhogsa gu bheil an cleachdaiche seo 'na bhall sa buidheann.\n* Is ciall dha bhogsa gun chromag ris nach eil an cleachdaiche seo 'na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no an caochladh.",
+       "userrights-groups-help": "’S urrainn dhut na buidhnean sa bheil an cleachdaiche seo ’na b(h)all atharrachadh:\n* Is ciall do chromag sa bhogsa gu bheil an cleachdaiche seo ’na bhall sa buidheann.\n* Is ciall do bhogsa gun chromag nach eil an cleachdaiche seo ’na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no a chaochladh.\n* Innsidh # dhut nach urrainn dhut latha nas tràithe a thaghadh air am falbh an ùine air a’ bhuidheann seo, dìreach latha nas anmoiche.",
        "userrights-reason": "Adhbhar:",
        "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicidhean eile.",
        "userrights-nodatabase": "Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.",
        "rightslogtext": "Seo loga nan atharraichean air ceadan nan cleachdaichean.",
        "action-read": "leugh an duilleag seo",
        "action-edit": "deasaich an duilleag seo",
-       "action-createpage": "cruthaich duilleagan",
-       "action-createtalk": "cruthaich duilleagan deasbaireachd",
+       "action-createpage": "an duilleag seo a chruthachadh",
+       "action-createtalk": "an duilleag deasbaireachd seo a chruthachadh",
        "action-createaccount": "cruthaich an cunntas cleachdaiche seo",
        "action-history": "seall eachdraidh na duilleige seo",
        "action-minoredit": "cuir comharra nach e ach deasachadh beag a th' ann",
        "action-upload_by_url": "luchdaich suas am faidhle seo o URL",
        "action-writeapi": "cleachd API sgrìobhaidh",
        "action-delete": "sguab às an duilleag seo",
-       "action-deleterevision": "sguab às am mùthadh seo",
-       "action-deletedhistory": "seall eachdraidh an sguabaidh às aig an duilleag seo",
+       "action-deleterevision": "mùthaidhean a sguabadh às",
+       "action-deletedhistory": "eachdraidh de dhuilleag a chaidh a sguabadh às fhaicinn",
        "action-browsearchive": "lorg sna duilleagan air an sguabadh às",
-       "action-undelete": "neo-dhèan sguabadh às na duilleige seo",
-       "action-suppressrevision": "thoir sùil air a' mhùthadh fhalaichte seo 's aisig e",
+       "action-undelete": "sguabadh às de dhuilleagan a neo-dhèanamh",
+       "action-suppressrevision": "sùil a thoirt air mùthaidhean falaichte ’s an aiseag",
        "action-suppressionlog": "seall an loga prìobhaideach seo",
        "action-block": "bac an cleachdaiche seo o dheasachadh",
        "action-protect": "atharraich leibheil dìon na duilleige seo",
        "uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas.",
        "php-uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas ann am PHP.\nThoir sùil air an roghainn file_uploads.",
        "uploadscripted": "Tha còd HTML no sgriobt san fhaidhle seo a b' urrainn do bhrabhsair-lìn a ruith le mearachd.",
-       "uploadscriptednamespace": "Tha ainm-spàs \"$1\" mì-dhligheach san fhaidhle SVG seo.",
+       "uploadscriptednamespace": "Tha ainm-spàs \"<nowiki>$1</nowiki>\" mì-dhligheach san fhaidhle SVG seo.",
        "uploadinvalidxml": "Cha b' urrainn dhuinn an XML san fhaidhle air a luchdadh suas a pharsadh.",
        "uploadvirus": "Tha bhìoras san fhaidhle!\nFiosrachadh: $1",
        "uploadjava": "Tha am faidhle seo 'na fhaidhle ZIP sa bheil faidhle .class Java.\nChan fhaod thu faidhlichean Java a luchdadh suas on a b' urrainn dhaibh cuingeachaidhean na tèarainteachd a leigeil seachad.",
        "emailccsubject": "Lethbhreac dhen teachdaireachd agad gu $1: $2",
        "emailsent": "Post-d air a chur",
        "emailsenttext": "Chaidh an teachdaireachd puist-d agad a chur.",
-       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"{{int:emailuser}}\" air {{SITENAME}}.",
+       "emailuserfooter": "Chaidh am post-d seo a {{GENDER:$1|chuir}} gu {{GENDER:$2|$2}} le $1 leis a’ ghleus “{{int:emailuser}}” aig {{SITENAME}}. Ma fhreagras {{GENDER:$2|tu}} am post-d seo, thèid am post-d{{GENDER:$2|agad}} a chur gun {{GENDER:$1|neach a chuir e an toiseach}} agus leigidg seo an seòladh puist-d {{GENDER:$2|agad}} {{GENDER:$1|riutha}}.",
        "usermessage-summary": "A' fàgail teachdaireachd an t-siostaim.",
        "usermessage-editor": "Teachdaire an t-siostaim",
        "usermessage-template": "MediaWiki:UserMessage",
        "modifiedarticleprotection": "a dh'atharraich an ìre dìon de \"[[$1]]\"",
        "unprotectedarticle": "a neo-dhìon \"[[$1]]\"",
        "movedarticleprotection": "chaidh roghainn an dìona a ghluasad o \"[[$2]]\" gu \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "Dh’atharraich {{GENDER:$2|ìre an dìon}} aig “[[$1]]”",
        "protect-title": "Atharraich an dìon airson \"$1\"",
        "protect-title-notallowed": "Seall an dìon airson \"$1\"",
        "prot_1movedto2": "chaidh [[$1]] a ghluasad gu [[$2]]",
        "undeletedrevisions": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} aiseag",
        "undeletedrevisions-files": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} agus $2 {{PLURAL:$2|fhaidhle|fhaidhle|faidhlichean|faidhle}} aiseag",
        "undeletedfiles": "Chaidh $1 {{PLURAL:$1|fhaidhle|fhaidhle|faidhlichean|faidhle}} aiseag",
-       "cannotundelete": "Cha deach leinn an sguabadh às a neo-dhèanamh:\n$1",
+       "cannotundelete": "Dh’fhàillig neo-dhèanamh an sguabaidh às no co-dhiù cuid dheth:\n$1",
        "undeletedpage": "<strong>Chaidh $1 aiseag</strong>\n\nThoir sùil air [[Special:Log/delete|loga an sguabaidh às]] airson clàr air na chaidh a sguabadh às no aiseag o chionn goirid.",
        "undelete-header": "Faic [[Special:Log/delete|loga an sguabaidh às]] airson duilleagan a chaidh a sguabadh às o chionn goirid.",
        "undelete-search-title": "Lorg sna duilleagan air an sguabadh às",
        "sp-contributions-newbies-sub": "Airson cunntasan ùra",
        "sp-contributions-newbies-title": "Obair le cunntasan ùra",
        "sp-contributions-blocklog": "an loga bacaidh",
-       "sp-contributions-suppresslog": "obair a chaidh a mhùchadh",
-       "sp-contributions-deleted": "obair air a sguabadh às",
+       "sp-contributions-suppresslog": "obair {{GENDER:$1|a’ chleachdaiche}} a chaidh a mhùchadh",
+       "sp-contributions-deleted": "obair {{GENDER:$1|a’ chleachdaiche}} a chaidh a sguabadh às",
        "sp-contributions-uploads": "a' luchdadh suas",
        "sp-contributions-logs": "logaichean",
        "sp-contributions-talk": "deasbaireachd",
        "feedback-submit": "Cuir a-null",
        "feedback-thanks": "Mòran taing! Chaidh do bheachd a phostadh air an duilleag \"[$2 $1]\".",
        "feedback-thanks-title": "Ceud taing!",
-       "searchsuggest-search": "Lorg",
+       "searchsuggest-search": "Lorg air {{SITENAME}}",
        "searchsuggest-containing": "anns a bheil...",
        "api-error-badtoken": "Mearachd taobh a-staigh: Droch thòcan.",
        "api-error-emptypage": "Chan fhaodar duilleagan falamh ùra a chruthachadh.",
        "api-error-publishfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach fhoillseachadh.",
        "api-error-stashfailed": "Mearachd taobh a-staigh: Cha deach leis an fhrithealaiche faidhle sealach a stòradh.",
-       "api-error-unknown-warning": "Rabhadh neo-aithnichte: \"$1\".",
+       "api-error-unknown-warning": "Rabhadh neo-aithnichte: “$1”.",
        "api-error-unknownerror": "Mearachd neo-aithnichte: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|diog|dhiog|diogan|diog}}",
        "duration-minutes": "$1 {{PLURAL:$1|mhionaid|mhionaid|mionaidean|mionaid}}",
index 5f765d5..ee93166 100644 (file)
@@ -23,7 +23,8 @@
                        "Macofe",
                        "Banjo",
                        "Josep Maria Roca Peña",
-                       "Luan"
+                       "Luan",
+                       "Hamilton Abreu"
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "selfredirect": "<strong>Atención:</strong> Está redirixindo esta páxina a si mesma.\nQuizais especificou incorrectamente a páxina de destino ou poida que estea a editar unha páxina errónea.\nSe preme en \"{{int:savearticle}}\" de novo, crearase a redireción de calquera xeito.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
        "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme en \"{{int:savearticle}}\" de novo, a súa edición gardarase sen el.",
-       "summary-preview": "Vista previa do resumo:",
+       "summary-preview": "Vista previa do resumo de edición:",
        "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
        "search-interwiki-caption": "Proxectos irmáns",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(máis)",
+       "search-interwiki-more-results": "máis resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionado",
        "searchall": "todo",
        "editusergroup": "Cargar os grupos de usuario",
        "editinguser": "Mudando os dereitos {{GENDER:$1|do usuario|da usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Consultando os dereitos {{GENDER:$1|de usuario|de usuaria}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Editar os grupos do usuario",
-       "userrights-viewusergroup": "Consultar os grupos do usuario",
+       "userrights-editusergroup": "Editar os grupos {{GENDER:$1|do usuario|da usuaria}}",
+       "userrights-viewusergroup": "Consultar os grupos {{GENDER:$1|do usuario|da usuaria}}",
        "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.",
+       "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-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-changeable-col": "Os grupos que pode cambiar",
        "userrights-unchangeable-col": "Os grupos que non pode cambiar",
-       "userrights-expiry-current": "Caduca 1$",
+       "userrights-expiry-current": "Caduca o $1",
        "userrights-expiry-none": "Non caduca",
        "userrights-expiry": "Caduca:",
+       "userrights-expiry-existing": "Período de caducidade actual: $2 ás $3",
+       "userrights-expiry-othertime": "Outro tempoː",
        "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-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",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostrar",
        "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-restore-default-filters": "Restaurar os filtros por defecto",
+       "rcfilters-clear-all-filters": "Borrar todos os filtros",
        "rcfilters-search-placeholder": "Filtrar os cambios recentes (ollar ou comezar a escribir)",
        "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-feedbacklink": "Deixar comentarios sobre os novos filtros (en fase beta)",
+       "rcfilters-highlightbutton-title": "Resaltar resultados",
+       "rcfilters-highlightmenu-title": "Seleccione unha cor",
        "rcfilters-filterlist-noresults": "Non se atoparon filtros",
        "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-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.",
+       "rcfilters-filter-editsbyother-description": "Edicións creadas por outros usuarios (non por vostede).",
        "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia (só para usuarios rexistrados)",
        "rcfilters-filter-userExpLevel-newcomer-label": "Chegados recentemente",
        "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 edicións e 4 días de actividade.",
        "rcfilters-filter-userExpLevel-learner-label": "Aprendices",
-       "rcfilters-filter-userExpLevel-learner-description": "Máis días de actividade e edicións que 'novatos' pero menos que 'usuarios experimentados'.",
+       "rcfilters-filter-userExpLevel-learner-description": "Máis días de actividade e edicións que \"novatos\" pero menos que \"usuarios experimentados\".",
        "rcfilters-filter-userExpLevel-experienced-label": "Usuarios experimentados",
        "rcfilters-filter-userExpLevel-experienced-description": "Máis de 30 días de actividade e 500 edicións.",
+       "rcfilters-filtergroup-automated": "Contribucións automatizadas",
        "rcfilters-filter-bots-label": "Bot",
+       "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-significance": "Importancia",
        "rcfilters-filter-minor-label": "Edicións menores",
        "rcfilters-filter-minor-description": "Edicións que o autor etiquetou como menores.",
+       "rcfilters-filter-major-label": "Edicións non menores",
+       "rcfilters-filter-major-description": "Edicións non marcadas como menores.",
        "rcfilters-filtergroup-changetype": "Tipo de cambio",
        "rcfilters-filter-pageedits-label": "Edicións de páxinas",
+       "rcfilters-filter-pageedits-description": "Edicións do contido da wiki, de conversas, de descricións de categorías...",
+       "rcfilters-filter-newpages-label": "Creacións de páxinas",
+       "rcfilters-filter-newpages-description": "Edicións que crean páxinas novas.",
+       "rcfilters-filter-categorization-label": "Cambios de categoría",
+       "rcfilters-filter-categorization-description": "Rexistros de páxinas engadidas ou borradas de categorías.",
+       "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).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "uploaded-setting-handler-svg": "Non están permitidos os ficheiros SVG que fixen o atributo \"handler\" cun obxectivo remoto/datos/secuencia de comandos. Atopouse <code>$1=\"$2\"</code> no ficheiro SVG subido.",
        "uploaded-remote-url-svg": "Non están permitidos os ficheiros SVG que fixen calquera atributo de estilo con enderezos URL remotos. Atopouse <code>$1=\"$2\"</code> no ficheiro SVG subido.",
        "uploaded-image-filter-svg": "Atopouse un filtro de imaxe con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG subido.",
-       "uploadscriptednamespace": "Este ficheiro SVG contén o espazo de nomes non permitido \"$1\"",
+       "uploadscriptednamespace": "Este ficheiro SVG contén o espazo de nomes non permitido \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Non se puido analizar o XML do ficheiro cargado.",
        "uploadvirus": "O ficheiro contén un virus!\nDetalles: $1",
        "uploadjava": "O ficheiro é un ZIP que contén un ficheiro .class de Java.\nNon están permitidas as cargas de ficheiros Java, dado que poden causar restricións de seguridade.",
        "apisandbox-sending-request": "Enviando a petición á API...",
        "apisandbox-loading-results": "Recibindo os resultados da API...",
        "apisandbox-results-error": "Produciuse un erro mentres se cargaba a resposta da petición á API: $1.",
+       "apisandbox-request-selectformat-label": "Mostrar os datos da petición como:",
+       "apisandbox-request-format-url-label": "Cadea de consulta da URL",
        "apisandbox-request-url-label": "URL da solicitude:",
+       "apisandbox-request-json-label": "Solicitude do JSONː",
        "apisandbox-request-time": "Duración da solicitude: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrixir o identificador e reenviar",
        "apisandbox-results-fixtoken-fail": "Erro ao recuperar o identificador \"$1\".",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "$1 {{GENDER:$1|enviou}} este correo electrónico a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" de {{SITENAME}}. {{GENDER:$2|A súa}} dirección de correo electrónico será enviada directamente {{GENDER:$1|ó|á}} remitente orixinal, {{GENDER:$1|revelándolle}} a {{GENDER:$2|súa}} dirección de correo.",
+       "emailuserfooter": "Este correo electrónico foi {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través da función «{{int:emailuser}}» en {{SITENAME}}. Se {{GENDER:$2|responde}}, o seu correo electrónico enviarase directamente {{GENDER:$1|ó emisor|á emisora}} orixinal, e así {{GENDER:$1|coñecerá}} {{GENDER:$2|o seu}} enderezo de correo electrónico.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "editcomment": "O resumo de edición foi: <em>$1</em>.",
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
+       "rollback-success": "Desfixéronse as edicións de {{GENDER:$3|$1}};\nvolveuse á última edición, feita por {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertéronse as edicións de $1;\nrestaurouse a última revisión de $2. [$3 Mostrar os cambios]",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
        "changecontentmodel-emptymodels-title": "Non hai modelos de contido dispoñibles",
        "changecontentmodel-emptymodels-text": "O contido de \"[[:$1]]\" non se pode converter a ningún tipo.",
        "log-name-contentmodel": "Rexistro de cambios no modelo de contido",
-       "log-description-contentmodel": "Eventos relacinados cos modelos de contido dunha páxina",
+       "log-description-contentmodel": "Esta páxina mostra cambios no modelo de contido das páxinas, así como as páxinas creadas cun modelo de contido distinto do estándar.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creou}} a páxina \"$3\" usando o modelo de contido non predeterminado \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiou}} o modelo de contido da páxina \"$3\" de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "pagelang-submit": "Enviar",
        "pagelang-nonexistent-page": "A páxina $1 non existe.",
        "pagelang-unchanged-language": "A páxina $1 xa foi definida coa lingua $2.",
+       "pagelang-unchanged-language-default": "A páxina $1 xa está configurada na lingua de contido por defecto do wiki.",
        "pagelang-db-failed": "A base de datos fallou ó tentar mudar a lingua da páxina.",
        "right-pagelang": "Cambiar a lingua da páxina",
        "action-pagelang": "cambiar a lingua da páxina",
        "mw-widgets-titleinput-description-new-page": "a páxina aínda non existe",
        "mw-widgets-titleinput-description-redirect": "redirección cara a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Engadir unha categoría...",
+       "mw-widgets-usersmultiselect-placeholder": "Engadir máis...",
        "sessionmanager-tie": "Non pode combinar peticións múltiples de tipos de autenticación: $1.",
        "sessionprovider-generic": "sesións $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesións baseadas nas cookies",
        "usercssispublic": "Lembre: As subpáxinas CSS non deberían conter datos confidenciais porque outros usuarios poden velos.",
        "restrictionsfield-badip": "Enderezo IP ou rango de IP non válido: $1",
        "restrictionsfield-label": "Rangos de IP permitidos:",
-       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utilice<br><code>0.0.0.0/0</code><br><code>::/0</code>",
+       "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"
 }
index 46af76a..bb6c4bc 100644 (file)
        "recentchanges-label-unpatrolled": "اي دچينواچين هلئه گشتزني نۊبؤ",
        "recentchanges-label-plusminus": "ولگˇ حجم اي مقدار بايتˇ واويراز تغيير بؤده",
        "recentchanges-legend-heading": "<strong>اختصارؤن:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}( [[Special:NewPages|تازه ولگؤنˇ ليسته]] بينين)",
        "rclistfrom": "تازه تغييرؤنˇ نۊشؤن دأنˇ سرأگيري $3 $2ˇ جي",
        "rcshowhideminor": "$1 نيميزگره دچينواچينؤن",
        "rcshowhideminor-show": "نۊشؤن دأن",
index e52e9d4..9283234 100644 (file)
        "editfont-default": "Browsera pormonnem",
        "sunday": "Aitar",
        "monday": "Somar",
-       "tuesday": "Munglar",
-       "wednesday": "Budhwar",
-       "thursday": "Birestar",
+       "tuesday": "Mongllar",
+       "wednesday": "Budvar",
+       "thursday": "Brestar",
        "friday": "Sukrar",
-       "saturday": "Sonvar",
+       "saturday": "Son'var",
        "sun": "Ait",
        "mon": "Som",
-       "tue": "Mung",
-       "wed": "Budh",
-       "thu": "Bres",
-       "fri": "Sukr",
+       "tue": "Mon",
+       "wed": "Bud",
+       "thu": "Bre",
+       "fri": "Suk",
        "sat": "Son",
        "january": "Janer",
        "february": "Febrer",
        "minoredit": "Hem ek dhaktem bodol",
        "watchthis": "Hea panar nodor dovor",
        "savearticle": "Pan samball",
+       "savechanges": "Bodlopam samball",
        "preview": "Zholok",
        "showpreview": "Zholok dakhoi",
        "showdiff": "Bodolpam dakhoi",
index 2f79206..7983c95 100644 (file)
        "searcharticle": "Ntali",
        "history": "Riwayati lo halaman",
        "history_short": "Riwayati",
+       "history_small": "riwayati",
        "updatedmarker": "iluba to'u nila'o'u pulitiyo",
        "printableversion": "Persi cetak",
        "permalink": "Wumbuta kakali",
        "talk": "Biisalawa",
        "views": "Bibilohu",
        "toolbox": "Pilaakasi",
+       "tool-link-userrights": "Boli'a lembo'a {{GENDER:$1|pengguna}}",
        "tool-link-userrights-readonly": "Bilohi lembo'a {{GENDER:$1|pengguna}}",
        "tool-link-emailuser": "Lawola email ode {{GENDER:$1|user}}",
        "userpage": "Bilohi halaman pengguna",
        "databaseerror-query": "Kueri $1",
        "databaseerror-function": "Huna: $1",
        "databaseerror-error": "Lotaalawa: $1",
+       "transaction-duration-limit-exceeded": "Untuk mencegah penundaan replikasi yang tinggi, pengiriman ini dibatalkan karena durasi tulis ($1) melebihi batas $2 {{PLURAL:$2|detik|detik}}.\nJika Anda ingin mengganti banyak butir sekaligus, cobalah melakukan dalam operasi yang lebih kecil.",
        "laggedslavemode": "<strong>Warning:</strong> Halaman kira ja o tuwanga lo'ubawa bohu",
        "readonly": "Basis data unti-unti",
        "enterlockreason": "Masowa alasani longunti wawu omoluwa u'unti hu'oolo",
        "protectedpagetext": "Halaman botiye ma iluntiya alihu diya'a ta momoli'o meyalo huhutu uweewo.",
        "viewsourcetext": "Yi'o mowali momilohu wawu mohemi monto bungoliyo lo halaman botiye.",
        "viewyourtext": "Yi'o mowali momilohu wawu mohemi bungo monto  <strong>biloli'umu</strong> to halaman botiye.",
+       "protectedinterface": "Halaman ini memuat teks antarmuka untuk perangkat lunak pada wiki ini, dan dilindungi terhadap penyalahgunaan. Untuk menambah atau mengubah terjemahan pada semua wiki, harap gunakan [https://translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
        "namespaceprotected": "Yi'o ja o haku momoli'a halaman botiye to <strong>$1</strong> huwali tanggulo.",
        "mycustomcssprotected": "Yi'o ja o iijini monguba halaman CSS boti.",
        "mycustomjsprotected": "Yi'o ja o iijini monguba halaman JavaScript boti.",
index c6f36fa..93c5007 100644 (file)
        "saveprefs": "Änderige spychere",
        "restoreprefs": "Alli Standardyystellige widerhärstelle (in allne Abschnitt)",
        "prefs-editing": "Tekscht-Ygab",
-       "rows": "Zylene",
-       "columns": "Spaltene",
        "searchresultshead": "Suech-Ergäbnis",
        "stub-threshold": "Spezielli Darstellig ($1) für Links uf chlyni Syte bis zu’re bestimmte Gröössi (i Bytes):",
        "stub-threshold-sample-link": "Byspil",
        "uploaded-setting-handler-svg": "Ir ufegladnigen SVG-Datei het’s es «handler»-Attribut mit Externem/Date/Script: <code>$1=\"$2\"</code>. Das isch nid erloubt.",
        "uploaded-remote-url-svg": "Ir ufegladnigen SVG-Datei het’s es Style-Attribut mit emnen externen URL: <code>$1=\"$2\"</code>. Das isch nid erloubt.",
        "uploaded-image-filter-svg": "Ir ufegladnigen SVG-Datei het’s e Bildfilter mit emnen URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "I deren SVG-Datei het’s der illegal Namensruum «$1».",
+       "uploadscriptednamespace": "I deren SVG-Datei het’s der illegal Namensruum «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "S XML in dr uffegladene Datei het nit chenne parst wäre.",
        "uploadvirus": "In däre Datei het s e Virus! Detail: $1",
        "uploadjava": "Des isch e ZIP-Datei, wu s e CLASS-Datei vu Java din het.\nS Uffelade vu Java-Dateien isch nit gstattet, wel si s Umgoh vu Sicherheitsyyschränkige chennte megli mache.",
        "specialpages-group-changes": "D letschte Änderige un Logbüecher",
        "specialpages-group-media": "Medie",
        "specialpages-group-users": "Benutzer un Rächt",
-       "specialpages-group-highuse": "Syte wo oft bruucht werde",
+       "specialpages-group-highuse": "Syte wo hüüfig bruucht werde",
        "specialpages-group-pages": "Lischte vo Syte",
        "specialpages-group-pagetools": "Sytewerchzüüg",
        "specialpages-group-wiki": "Date un Wärchzyyg",
        "feedback-useragent": "User Agent:",
        "searchsuggest-search": "{{SITENAME}} dursueche",
        "searchsuggest-containing": "din het s …",
-       "api-error-badaccess-groups": "Du derfsch keini Dateie in des Wiki uffelade.",
        "api-error-badtoken": "Intärne Fähler: Dr Token isch fählerhaft.",
-       "api-error-copyuploaddisabled": "S Uffelade iber e URL isch uf däm Server deaktiviert.",
-       "api-error-duplicate": "S git im Wiki scho {{PLURAL:$1|ei anderi Datei|anderi Dateie}} mit em glyche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|isch scho e andri Datei|sin scho anderi Dateie}} mit em glyche Inhalt vorhande gsi. {{PLURAL:$1|Si isch|Si sin}} allerdings glöscht worde.",
-       "api-error-empty-file": "D Datei, wu Du uffeglade hesch, isch läär.",
        "api-error-emptypage": "S isch nit erlaubt, neji lääri Syte aazlege.",
-       "api-error-fetchfileerror": "Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.",
-       "api-error-fileexists-forbidden": "S git scho ne Datei mit Name „$1“, si cha nit iberschryybe wäre.",
-       "api-error-fileexists-shared-forbidden": "S git scho ne Datei mit Name „$1“ im gmeinsame Dateirepositorium, si cha wäge däm nit iberschrybe wäre.",
-       "api-error-file-too-large": "D Datei, wu Du ibertrait hesch, isch z groß.",
-       "api-error-filename-tooshort": "Dr Dateiname isch z churz.",
-       "api-error-filetype-banned": "Dää Dateityp isch gsperrt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|isch e Dateiformat, wu nit erlaubt isch|sin Dateitype, wu nit erlaubt sin}}. Erlaubt {{PLURAL:$3|isch s Dateiformat|sin d Dateiformat}} $2.",
-       "api-error-filetype-missing": "D Datei het kei Dateinameerwyterig.",
-       "api-error-hookaborted": "D Änderig, wu Du versuecht hesch, isch wäg eme Erwyterigs-Hooks abbroche wore.",
-       "api-error-http": "Intärne Fähler: S het kei Verbindig zum Server chenne härgstellt wäre.",
-       "api-error-illegal-filename": "Dr Dateiname isch nit erlaubt.",
-       "api-error-internal-error": "Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei ins Wiki.",
-       "api-error-invalid-file-key": "Intärne Fähler: D Datei isch nit im temporäre Spycher gfunde wore.",
-       "api-error-missingparam": "Intärne Fähler: Zue dr Aafrog fähle Parameter.",
-       "api-error-missingresult": "Intärne Fähler: S het nit chenne feschtgstellt wäre, eb s Kopiere erfolgryych gsi isch.",
-       "api-error-mustbeloggedin": "Zum Dateie uffelade muesch aagmäldet syy.",
-       "api-error-mustbeposted": "S git e Programmierfähler (s wird di falsch HTTP-Method brucht).",
-       "api-error-noimageinfo": "S Uffelade isch erfolgryych gsi, aber de Server het kei Informatione über d Datei zur Verfiegig gstellt.",
-       "api-error-nomodule": "Intärne Fähler: S isch kei Modul zum Uffelade feschtgleit wore.",
-       "api-error-ok-but-empty": "Intärne Fähler: Dr Server reagiert nit.",
-       "api-error-overwrite": "S Iberschryybe vun ere Datei, wu s scho git, isch nit erlaubt.",
-       "api-error-stashfailed": "Intärne Fähler: Dr Server het kei temporäri Datei chenne spychere.",
        "api-error-publishfailed": "Interne Fähler: Der Server het di temporäri Datei nid chönne veröffentleche.",
-       "api-error-stasherror": "Bim Ufelade vor Datei het’s e Fähler ’gä.",
-       "api-error-stashedfilenotfound": "Di gspychereti Datei het sech nümm la finde bim Versuech, se vom Spycher ufezlade.",
-       "api-error-stashpathinvalid": "Der Pfad isch ungültig, wo di gspychereti Datei hätt sölle sy.",
-       "api-error-stashfilestorage": "Bim Spychere vor Datei het’s e Fähler ’gä.",
-       "api-error-stashzerolength": "Der Server het d Datei nid chönne spychere, wil si e Lengi vo Null het.",
-       "api-error-stashnotloggedin": "Du muesch di ylogge, für Dateie zum Ufelade chönne z spychere.",
-       "api-error-stashwrongowner": "D Datei ghört nid dir, wo du probiert hesch im Spycher druf zuezgryffe.",
-       "api-error-stashnosuchfilekey": "Der Dateischlüssel git’s nid, wo du probiert hesch im Spycher druf zuezgryffe.",
-       "api-error-timeout": "Dr Server het kei antwort gee in dr erwartete Zyt.",
-       "api-error-unclassified": "S het e nit bekannte Fähler gee.",
-       "api-error-unknown-code": "Nit bekannte Fähler: „$1“",
-       "api-error-unknown-error": "Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei.",
+       "api-error-stashfailed": "Intärne Fähler: Dr Server het kei temporäri Datei chenne spychere.",
        "api-error-unknown-warning": "Unbekannti Warnig: $1",
        "api-error-unknownerror": "Nit bekannte Fähler: „$1“",
-       "api-error-uploaddisabled": "S Uffelade isch in däm Wiki deaktiviert.",
-       "api-error-verification-error": "Die Datei isch entwäder fählerhaft oder si het di falsch Dateinameerwyterig.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekund|Sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minut|Minute}}",
        "duration-hours": "$1 {{PLURAL:$1|Stund|Stunde}}",
index 2e3a445..27db784 100644 (file)
        "selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום להפניה להיווצר בכל זאת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
        "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא.",
-       "summary-preview": "תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94 ×©×\9c ×\94תקצ×\99ר:",
+       "summary-preview": "תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94 ×©×\9c ×ª×§×¦×\99ר ×\94ער×\99×\9b×\94:",
        "subject-preview": "תצוגה מקדימה של הנושא:",
        "previewerrortext": "אירעה שגיאה בעת הניסיון להציג תצוגה מקדימה של השינויים שלך.",
        "blockedtitle": "המשתמש חסום",
        "search-interwiki-caption": "מיזמי אחות",
        "search-interwiki-default": "תוצאות מתוך $1:",
        "search-interwiki-more": "(עוד)",
+       "search-interwiki-more-results": "תוצאות נוספות",
        "search-relatedarticle": "קשור",
        "searchrelated": "קשור",
        "searchall": "הכול",
        "editusergroup": "טעינת קבוצות המשתמש",
        "editinguser": "שינוי ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "צפייה בהרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "עריכת קבוצות משתמש",
-       "userrights-viewusergroup": "צפייה בקבוצות משתמש",
+       "userrights-editusergroup": "עריכת קבוצות {{GENDER:$1|המשתמש|המשתמשת}}",
+       "userrights-viewusergroup": "צפייה בקבוצות {{GENDER:$1|המשתמש|המשתמשת}}",
        "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|אותו|אותה}} אליה, או להפך.",
+       "userrights-groups-help": "באפשרותך לשנות את הקבוצות ש{{GENDER:$1|משתמש זה חבר|משתמשת זו חברה}} בהן:\n* תיבה מסומנת פירושה שה{{GENDER:$1|משתמש כבר חבר|משתמשת כבר חברה}} בקבוצה.\n* תיבה בלתי מסומנת פירושה שה{{GENDER:$1|משתמש אינו חבר|משתמשת אינה חברה}} בקבוצה.\n* סימון * פירושו שלא יהיה באפשרותך להסיר את ה{{GENDER:$1|משתמש|משתמשת}} מהקבוצה לאחר שהוספת {{GENDER:$1|אותו|אותה}} אליה, או להפך.\n* סימון # פירושו שבאפשרותך רק לאחר את זמן הפקיעה של קבוצה זו; אין באפשרותך להקדימו.",
        "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": "משתמשים",
        "rcfilters-invalid-filter": "מסנן בלתי־תקין",
        "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
        "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
+       "rcfilters-highlightbutton-title": "הבלטת התוצאות",
+       "rcfilters-highlightmenu-title": "בחירת צבע",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
        "rcfilters-filtergroup-registration": "רישום העורכים",
        "rcfilters-filter-registered-label": "רשומים",
        "uploaded-setting-handler-svg": "SVG שמגדיר את המאפיין \"handler\" עם remote/data/script חסום. נמצא <code dir=\"ltr\">$1=\"$2\"</code> בקובץ ה־SVG שהועלה.",
        "uploaded-remote-url-svg": "SVG שמגדיר כל מאפיין style עם URL מרוחק חסום. נמצא <code dir=\"ltr\">$1=\"$2\"</code> בקובץ ה־SVG שהועלה.",
        "uploaded-image-filter-svg": "נמצא מסנן תמונה עם URL‏: <code dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> בקובץ ה־SVG שהועלה.",
-       "uploadscriptednamespace": "קובץ ה‏‏֫־SVG הזה כולל מרחב שם בלתי חוקי: '$1'",
+       "uploadscriptednamespace": "קובץ ה‏‏֫־SVG הזה כולל מרחב שם בלתי חוקי \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "לא ניתן לפרש את ה־XML בקובץ שהועלה.",
        "uploadvirus": "הקובץ מכיל וירוס!\nפרטים:\n<div dir=\"ltr\">$1</div>",
        "uploadjava": "קובץ זה הוא קובץ ZIP שמכיל קובץ &lrm;.class של Java.\nהעלאת קובצי Java אסורה, כיוון שהם יכולים לגרום לעקיפת מגבלות האבטחה.",
        "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 לעריכה האחרונה של $2.",
+       "rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}} לעריכה האחרונה של {{GENDER:$4|$2}}.",
        "rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לחזור לדף הקודם, לטעון אותו מחדש ולנסות שוב.",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
        "mw-widgets-categoryselector-add-category-placeholder": "הוספת קטגוריה...",
+       "mw-widgets-usersmultiselect-placeholder": "הוספת עוד...",
        "sessionmanager-tie": "לא ניתן לצרף מספר סוגי אימות זהות: $1.",
        "sessionprovider-generic": "התחברויות של $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות",
        "log-action-filter-upload-upload": "העלאות של קבצים חדשים",
        "log-action-filter-upload-overwrite": "דריסות של קבצים קיימים",
        "authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
-       "authmanager-authn-no-primary": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\90×\9eת ×\90ת ×\94×\90×\99ש×\95ר×\99×\9d שסופקו.",
-       "authmanager-authn-no-local-user": "×\94×\90×\99ש×\95ר×\99×\9d שסופקו אינם שייכים לשום משתמש באתר זה.",
+       "authmanager-authn-no-primary": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\90×\9eת ×\90ת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו.",
+       "authmanager-authn-no-local-user": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו אינם שייכים לשום משתמש באתר זה.",
        "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": "×\94×\90×\99ש×\95ר×\99×\9d שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
-       "authmanager-link-no-primary": "×\94×\90×\99ש×\95ר×\99×\9d ×©×¡×\95פק×\95 ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\91ש×\99×\9e×\95ש ×\91קישור חשבונות.",
+       "authmanager-create-no-primary": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
+       "authmanager-link-no-primary": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת ×©×¡×\95פק×\95 ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\91ש×\99×\9e×\95ש ×\9cש×\9d קישור חשבונות.",
        "authmanager-link-not-in-progress": "קישור החשבונות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
        "authmanager-authplugin-setpass-failed-title": "שינוי הסיסמה נכשל",
        "authmanager-authplugin-setpass-failed-message": "תוסף האימות דחה את שינוי הסיסמה.",
        "authpage-cannot-link-continue": "לא ניתן להמשיך בתהליך קישור החשבונות. כנראה שזמן ההמתנה של הפעולה חלף.",
        "cannotauth-not-allowed-title": "הגישה נדחתה",
        "cannotauth-not-allowed": "אינך מורשה להשתמש בדף זה",
-       "changecredentials": "ש×\99× ×\95×\99 ×\94×\90×\99ש×\95ר×\99×\9d",
-       "changecredentials-submit": "ש×\99× ×\95×\99 ×\94×\90×\99ש×\95ר×\99×\9d",
+       "changecredentials": "ש×\99× ×\95×\99 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
+       "changecredentials-submit": "ש×\99× ×\95×\99 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
        "changecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
-       "changecredentials-success": "×\94×\90×\99ש×\95ר×\99×\9d שלך שונו.",
-       "removecredentials": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
-       "removecredentials-submit": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
+       "changecredentials-success": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שלך שונו.",
+       "removecredentials": "×\94סרת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
+       "removecredentials-submit": "×\94סרת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
        "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
-       "removecredentials-success": "×\94×\90×\99ש×\95ר×\99×\9d שלך הוסרו.",
-       "credentialsform-provider": "ס×\95×\92 ×\94×\90×\99ש×\95ר×\99×\9d:",
+       "removecredentials-success": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שלך הוסרו.",
+       "credentialsform-provider": "ס×\95×\92 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת:",
        "credentialsform-account": "שם החשבון:",
        "cannotlink-no-provider-title": "אין חשבונות שניתן לקשר",
        "cannotlink-no-provider": "אין חשבונות שניתן לקשר.",
index f26e1b1..33cf429 100644 (file)
                        "Wassan.anmol",
                        "Ziyaurr",
                        "NehalDaveND",
-                       "Susant purohit"
+                       "Susant purohit",
+                       "Jayprakash12345",
+                       "Dr. Shikha Jaggi",
+                       "Shyamal"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "fri": "शुक्र",
        "sat": "शनि",
        "january": "जनवरी",
-       "february": "फरवरी",
+       "february": "फ़रवरà¥\80",
        "march": "मार्च",
        "april": "अप्रैल",
        "may_long": "मई",
        "november": "नवम्बर",
        "december": "दिसम्बर",
        "january-gen": "जनवरी",
-       "february-gen": "फरवरी",
+       "february-gen": "फ़रवरà¥\80",
        "march-gen": "मार्च",
        "april-gen": "अप्रैल",
        "may-gen": "मई",
        "nov": "नव॰",
        "dec": "दिस॰",
        "january-date": "$1 जनवरी",
-       "february-date": "$1 फरवरी",
+       "february-date": "$1 à¤«à¤¼à¤°à¤µà¤°à¥\80",
        "march-date": "$1 मार्च",
        "april-date": "$1 अप्रैल",
        "may-date": "$1 मई",
        "searcharticle": "जाएँ",
        "history": "पृष्ठ इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "मेरे अन्तिम बार पधारने के बाद के अद्यतन",
        "printableversion": "छापने योग्य संस्करण",
        "permalink": "स्थायी कड़ी",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "यदि आपका यह ईमेल आपके खाते के साथ जोड़ा गया है तो पासवर्ड बदलने का ईमेल इसमें भेज दिया गया है।",
        "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
+       "passwordreset-nocaller": "कॉलर प्रदान किया जाना चाहिए",
+       "passwordreset-nosuchcaller": "कॉलर मौजूद नहीं है: $1",
+       "passwordreset-ignored": "पासवर्ड रीसेट नहीं संभाला गया। हो सकता है कि कोई प्रदाता कॉन्फ़िगर नही किया गया हो?",
        "passwordreset-invalidemail": "अवैध ईमेल पता",
+       "passwordreset-nodata": "न तो यूजर नाम और न ही ईमेल पता आपूर्ति की गई",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
        "changeemail-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "blockedtitle": "सदस्य अवरुद्ध है",
        "blockedtext": "'''आपका सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिया गया हैं ।'''\n\nअवरोध $1 द्वारा किया गया था।\nअवरोध का कारण है ''$2''\n\n* अवरोध का आरंभ: $8\n* अवरोध की समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइस अवरोध के बारे में चर्चा करने के लिए आप $1 या किसी अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकते हैं।\nअगर आपने [[Special:Preferences|अपनी वरीयताओं]] में वैध ई-मेल पता प्रविष्ट किया है तो ही आप 'इस प्रयोक्ता को ई-मेल भेजें' वाली सुविधा का इस्तेमाल कर सकते हैं और आपको इसका इस्तेमाल करने से नहीं रोका गया है।\nआपका मौजूदा आइ॰पी पता $3 है और अवरोध क्रमांक #$5 है।\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अपने किसी भी प्रश्न में कृपया यह सभी जानकारी भी शामिल करें।",
+       "systemblockedtext": "आपका यूज़र नेम या आईपी का पता स्वचालित रूप से MediaWiki द्वारा अवरुद्ध कर दिया गया है।\nकारण दिया है:\n:<em>$2</em>\n\n* ब्लॉक का प्रारंभ: $8\n* ब्लॉक की समय सीमा समाप्त: $6\n* इरादा : $7\n\nआपका वर्तमान आईपी पता $3 है।\nआप किसी भी प्रश्न में सभी जानकारी भी शामिल करें।",
        "blockednoreason": "कोई कारण नहीं दिया है",
        "whitelistedittext": "पृष्ठ संपादित करने के लिये आपको $1 करना होगा।",
        "confirmedittext": "संपादन करने से पहले अपना ई-मेल पता प्रमाणित करना आवश्यक है।\nकृपया अपनी [[Special:Preferences|सदस्य वरीयताओं]] में जाकर अपना ई-मेल पता दें और उसे प्रमाणित करें।",
        "invalid-content-data": "अवैध डाटा सामग्री",
        "content-not-allowed-here": "[[$2]] पृष्ठ पर \"$1\" सामग्री मना है।",
        "editwarning-warning": "इस पृष्ठ को छोड़ने पर आपके द्वारा किये गए कोई भी बदलाव गायब हो जाएँगे।\nयदि आपने लॉग इन किया हुआ है तो आप इस सूचना का दिखना अपनी वरीयताओं के \"{{int:prefs-editing}}\" भाग में बंद कर सकते हैं।",
+       "editpage-invalidcontentmodel-title": "सामग्री मॉडल समर्थित नहीं",
+       "editpage-invalidcontentmodel-text": "सामग्री मॉडल \"$1\" समर्थित नहीं है।",
        "editpage-notsupportedcontentformat-title": "सामग्री स्वरूप समर्थित नहीं है",
        "editpage-notsupportedcontentformat-text": "$1 सामग्री स्वरूप $2 सामग्री मॉडल द्वारा समर्थित नहीं है।",
        "content-model-wikitext": "विकिपाठ्य",
        "content-model-json": "जेसन",
        "content-json-empty-object": "रिक्त ऑब्जेक्ट",
        "content-json-empty-array": "रिक्त ऐरे",
+       "deprecated-self-close-category": "अवैध एचटीएमएल टैग का उपयोग कर रहे पृष्ठ",
        "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>.",
        "search-interwiki-caption": "अन्य प्रकल्प",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(और)",
+       "search-interwiki-more-results": "अधिक परिणाम",
        "search-relatedarticle": "सम्बंधित",
        "searchrelated": "सम्बंधित",
        "searchall": "सभी",
        "search-external": "बाहरी खोज",
        "searchdisabled": "{{SITENAME}} पर खोज अक्षम है।\nआप गूगल से खोज कर सकते हैं।\nध्यान रखें कि उनकी {{SITENAME}} सामग्री की सूची पुरानी हो सकती है।",
        "search-error": "खोजते समय निम्न त्रुटि उत्पन्न हुई है: $1",
+       "search-warning": "खोजते समय निम्न त्रुटि उत्पन्न हुई है: $1",
        "preferences": "मेरी वरीयताएँ",
        "mypreferences": "पसंद",
        "prefs-edits": "संपादन संख्या:",
        "youremail": "आपका ई-मेल पता:",
        "username": "{{GENDER:$1|सदस्यनाम}}:",
        "prefs-memberingroups": "निम्नलिखित {{PLURAL:$1|समूह|समूहों}} के {{GENDER:$2|सदस्य}}:",
+       "group-membership-link-with-expiry": "$1 ($2 तक)",
        "prefs-registration": "पंजीकरण समय:",
        "yourrealname": "वास्तविक नाम:",
        "yourlanguage": "भाषा:",
        "prefswarning-warning": "आपने अपनी वरीयताओं में एैसे परिवर्तन किए हैं जिन्हे अभी तक संचित नहीं किया गया है। अगर अाप \"$1\" पर बिना क्लिक किये इस पृष्ठ को छोड़ देते हैं तो अापकी वरीयताओं का अद्यतन नहीं किया जाएगा।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स के बीच आवागमन करने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग कर सकते हैं।",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
-       "userrights-lookup-user": "सदसà¥\8dय à¤¸à¤®à¥\82हà¥\8bà¤\82 à¤\95ा à¤µà¥\8dयवसà¥\8dथापन à¤\95रें",
+       "userrights-lookup-user": "सदसà¥\8dय à¤\9aà¥\81नें",
        "userrights-user-editname": "सदस्यनाम दें:",
        "editusergroup": "{{GENDER:$1|सदस्य}} समूहों का संपादन करें",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 के अधिकार बदलें\n{{GENDER:$1|सदस्य}} के सदस्य अधिकार बदले जा रहे हैं <strong>[[User:$1|$1]]</strong> $2",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नहीं है या फिर स्थानीय नहीं है।",
        "userrights-changeable-col": "समूह जिन्हें आप बदल सकते हैं",
        "userrights-unchangeable-col": "समूह जिन्हें आप नहीं बदल सकते हैं",
+       "userrights-expiry-current": "समाप्ती $1",
+       "userrights-expiry-none": "समाप्त नहीं होता",
+       "userrights-expiry": "समाप्ति:",
+       "userrights-expiry-othertime": "अन्य समय:",
+       "userrights-expiry-options": "एक दिन:1 day,एक सप्ताह:1 week,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक वर्ष:1 year",
+       "userrights-invalid-expiry": "\"$1\" समूह के लिए समाप्ती तिथि अमान्य है।",
+       "userrights-expiry-in-past": "\"$1\" समूह हेतु समाप्ती का समय पहले ही बीत चुका है।",
        "userrights-conflict": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।",
        "group": "समूह:",
        "group-user": "सदस्य",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "right-applychangetags": "प्रयोग में लाइये [[Special:Tags|tags]] किसी के बदलाव के साथ।",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
+       "right-deletechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] हटाएँ",
        "grant-generic": "\"$1\" अधिकार संग्रह",
        "grant-group-page-interaction": "पृष्ठों से जुड़ें",
        "grant-group-file-interaction": "मीडिया से जुड़ें",
        "grant-basic": "सामान्य अधिकार",
        "grant-viewdeleted": "हटाये गए फ़ाइल व पृष्ठ देखें",
        "grant-viewmywatchlist": "अपनी ध्यानसूची देखें",
+       "grant-viewrestrictedlogs": "प्रतिबंधित प्रविष्टि लॉग देखें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "newuserlogpagetext": "यह सदस्य खातों के निर्माण का लॉग है।",
        "rightslog": "सदस्य अधिकार लॉग",
        "action-writeapi": "लेखन ए॰पी॰आई का प्रयोग करने",
        "action-delete": "इस पृष्ठ को हटाने",
        "action-deleterevision": "इस अवतरण को हटाने",
+       "action-deletelogentry": "लॉग प्रविष्टियाँ को हटाए",
        "action-deletedhistory": "इस पृष्ठ के मिटे इतिहास को देखने",
        "action-browsearchive": "हटाएँ गए पृष्ठों में खोजने",
        "action-undelete": "इस पृष्ठ को पुनर्स्थापित करने",
        "action-userrights-interwiki": "अन्य विकियों पर सदस्य अधिकार बदलने",
        "action-siteadmin": "डाटाबेस को ताला लगाने या खोलने",
        "action-sendemail": "ई-मेल भेजने",
-       "action-editmyoptions": "अपनी पसंदें संपादित करें",
+       "action-editmyoptions": "अपनी पसंद संपादित करें",
        "action-editmywatchlist": "ध्यानसूची सम्पादित करने",
        "action-viewmywatchlist": "अपनी ध्यानसूची देखें",
        "action-viewmyprivateinfo": "अपनी व्यक्तिगत जानकारी देखने",
        "action-editmyprivateinfo": "अपनी व्यक्तिगत जानकारी बदलने",
        "action-editcontentmodel": "एक पेज की सामग्री मॉडल को संपादित।",
-       "action-managechangetags": "डà¥\87à¤\9fाबà¥\87स à¤¸à¥\87 à¤\9aिपà¥\8dपि à¤¬à¤¨à¤¾à¤¯à¥\87à¤\82 à¤\94र à¤¹à¤\9fायà¥\87à¤\82",
+       "action-managechangetags": "चिप्पि बनायें और हटायें",
        "action-applychangetags": "अपमे बदलाव के साथ टैग जोड़ें।",
        "action-changetags": "जमा करें और हटाएँ स्वतंत्र टैग व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
+       "action-deletechangetags": "डेटाबेस से चिप्पि हटा दें",
        "action-purge": "पृष्ठ ताजा करें",
        "nchanges": "$1 {{PLURAL:$1|बदलाव}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बार देखने के बाद से}}",
        "recentchanges-legend-heading": "<strong>कुंजी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
        "recentchanges-submit": "दिखाएँ",
+       "rcfilters-activefilters": "सक्रिय फिल्टर",
+       "rcfilters-restore-default-filters": "मूलभूत फिल्टर पुनर्स्थापित करे",
+       "rcfilters-clear-all-filters": "सभी फिल्टर हटाएँ",
+       "rcfilters-search-placeholder": "हाल में हुए बदलाव फ़िल्टर (ब्राउज़ या टाइप करना आरंभ करें)",
+       "rcfilters-invalid-filter": "अमान्य फ़िल्टर",
+       "rcfilters-empty-filter": "कोई सक्रिय फिल्टर नहीं। सभी योगदान दिखाए गए है।",
+       "rcfilters-filterlist-title": "फिल्टर",
+       "rcfilters-highlightbutton-title": "परिणाम रेखांकन करें",
+       "rcfilters-highlightmenu-title": "रंग चुनें",
+       "rcfilters-filterlist-noresults": "कोई फिल्टर नहीं पाया",
+       "rcfilters-filtergroup-registration": "उपयोगकर्ता पंजीकरण",
+       "rcfilters-filter-registered-label": "पंजीकृत:",
+       "rcfilters-filter-registered-description": "लॉग-इन संपादक।",
+       "rcfilters-filter-unregistered-label": "अपंजीकृत",
+       "rcfilters-filter-unregistered-description": "संपादक जो लॉग इन नहीं हैं।",
+       "rcfilters-filter-editsbyself-label": "आपके अपने संपादन",
+       "rcfilters-filter-editsbyself-description": "आपके द्वारा संपादित",
+       "rcfilters-filter-editsbyother-label": "दूसरों के द्वारा संपादित",
+       "rcfilters-filter-userExpLevel-newcomer-label": "अपरिचित",
+       "rcfilters-filter-userExpLevel-learner-label": "शिक्षार्थियों",
+       "rcfilters-filter-bots-label": "बॉट",
+       "rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
+       "rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
+       "rcfilters-filtergroup-significance": "महत्व",
+       "rcfilters-filter-minor-label": "छोटा संपादन",
+       "rcfilters-filter-major-label": "गैर-मामूली संपादन",
+       "rcfilters-filtergroup-changetype": "बदलाव के प्रकार:",
+       "rcfilters-filter-pageedits-label": "पृष्ठ संपादन",
+       "rcfilters-filter-newpages-label": "पृष्ठ कृतियों",
+       "rcfilters-filter-newpages-description": "संपादन जिससे नया पृष्ट बना",
+       "rcfilters-filter-categorization-label": "श्रेणी परिवर्तन",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "uploaded-setting-handler-svg": "एसवीजी जो \"handler\" जोड़ता है, अवरोधित है। उससे मिला <code>$1=\"$2\"</code> है।",
        "uploaded-remote-url-svg": "एसवीजी जो रिमोट पते द्वारा शैली तय करता है, अवरोधित है। उससे <code>$1=\"$2\"</code> मिला है।",
        "uploaded-image-filter-svg": "पते के साथ छवि छन्नी मिला: <code>&lt;$1 $2=\"$3\"&gt;</code> एसवीजी फ़ाइल में।",
-       "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"$1\" है।",
+       "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"<nowiki>$1</nowiki>\" है।",
        "uploadinvalidxml": "अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।",
        "uploadvirus": "इस फ़ाइल में व्हाईरस हैं! अधिक जानकारी: $1",
        "uploadjava": "यह फ़ाइल एक ज़िप फ़ाइल है जिसमें एक जावा .class फ़ाइल है।\nजावा फ़ाइलों को अपलोड करना वर्जित है, क्योंकि इनके कारण सुरक्षा बाधाएँ पार की जा सकती हैं।",
        "pageinfo-length": "पृष्ठ आकार (बाइट्स में)",
        "pageinfo-article-id": "पृष्ठ आइ॰डी",
        "pageinfo-language": "पृष्ठ सामग्री भाषा",
+       "pageinfo-language-change": "परिवर्तन",
        "pageinfo-content-model": "पृष्ठ सामग्री का नमूना",
        "pageinfo-content-model-change": "बदलें",
        "pageinfo-robot-policy": "सर्च इंजन बॉट द्वारा अनुक्रमण",
        "log-show-hide-patrol": "परीक्षण लॉग $1",
        "log-show-hide-tag": "$1 टैग लॉग",
        "confirm-markpatrolled-button": "ठीक है",
+       "confirm-markpatrolled-top": "$2 के $3 संशोधन को परीक्षित चिन्ह्नत करे?",
        "deletedrevision": "पुराना अवतरण $1 हटा दिया",
        "filedeleteerror-short": "फ़ाईल हटानेमें समस्या: $1",
        "filedeleteerror-long": "फ़ाईल हटानेमें आईं समस्यायें:\n\n$1",
        "tag-filter": "[[Special:Tags|चिप्पी]] छननी:",
        "tag-filter-submit": "छननी",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)",
+       "tag-mw-contentmodelchange": "सामग्री मॉडल परिवर्तन",
        "tags-title": "चिप्पियाँ",
        "tags-intro": "यह पृष्ठ अर्थ सहित वह चिप्पियाँ दर्शाता है जिनका कोई तंत्रांश किसी संपादन पर निशान लगाने के लिए इस्तेमाल कर सकता है।",
        "tags-tag": "चिप्पी का नाम",
        "authprovider-confirmlink-success-line": "$1 : सफलतापूर्वक जुड़ा।",
        "authprovider-confirmlink-failed": "खाता जोड़ने का काम पूरी तरह से नहीं हो पाया : $1",
        "authprovider-resetpass-skip-label": "छोड़ें",
+       "authprovider-resetpass-skip-help": "पासवर्ड को रीसेट करना छोड़ें।",
        "authform-newtoken": "टोकन लापता है $1",
        "authform-notoken": "टोकन लापता है",
        "authform-wrongtoken": "गलत टोकन",
        "linkaccounts-success-text": "खाता जुड़ गया।",
        "linkaccounts-submit": "खाता जोड़ें",
        "unlinkaccounts": "खाता अलग करें",
-       "unlinkaccounts-success": "खाता अलग हो गया।"
+       "unlinkaccounts-success": "खाता अलग हो गया।",
+       "restrictionsfield-badip": "अमान्य आईपी पते या सीमा: $1",
+       "restrictionsfield-label": "अनुमत आईपी सीमा:",
+       "revid": "अवतरण $1",
+       "pageid": "पेज आईडी"
 }
index 90543af..12ea679 100644 (file)
        "uploaded-setting-handler-svg": "SVG that sets the \"handler\" attribute with remote/data/script is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-remote-url-svg": "SVG that sets any style attribute with remote URL is blocked. Found <code>$1=\"$2\"</code> in the uploaded SVG file.",
        "uploaded-image-filter-svg": "Found image filter with URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in the uploaded SVG file.",
-       "uploadscriptednamespace": "Ii SVG file me illegal namespace \"$1\" hae.",
+       "uploadscriptednamespace": "Ii SVG file me illegal namespace \"<nowiki>$1</nowiki>\" hae.",
        "uploadinvalidxml": "Upload karaa gais file ke XML ke parse nai karaa jaae sake hae.",
        "uploadvirus": "Ii file me virus hai! Details: $1",
        "uploadjava": "Ii file ek ZIP file hae jisme Java .class ke file hae.\nJava ke uplaod kare ke anumati nai hae, kaaheki isse kuchh security restrictions ke bypass karaa jaae sake hae.",
index a66ea05..bd4f303 100644 (file)
@@ -34,7 +34,8 @@
                        "Teoo3",
                        "Matma Rex",
                        "Vrhnje",
-                       "Ivi104"
+                       "Ivi104",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podcrtavanje poveznica",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
-       "category_header": "Stranice u kategoriji \"$1\"",
+       "category_header": "Stranice u kategoriji »$1«",
        "subcategories": "Potkategorije",
-       "category-media-header": "Mediji u kategoriji \"$1\":",
+       "category-media-header": "Mediji u kategoriji »$1«",
        "category-empty": "''U ovoj kategoriji trenutačno nema članaka ni medija.''",
        "hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije|Skrivenih kategorija}}",
        "hidden-category-category": "Skrivene kategorije",
        "searchbutton": "Traži",
        "go": "Kreni",
        "searcharticle": "Kreni",
-       "history": "Stare izmjene",
+       "history": "Povijest stranice",
        "history_short": "Stare izmjene",
        "history_small": "stare izmjene",
        "updatedmarker": "obnovljeno od posljednjeg posjeta",
        "toolbox": "Pomagala",
        "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikove|suradničine}} grupe",
        "tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
-       "tool-link-emailuser": "Pošalji e-poštu {{GENDER:$1|suradniku|suradnici}}",
+       "tool-link-emailuser": "Pošalji {{GENDER:$1|suradniku|suradnici}} e-poruku",
        "userpage": "Vidi suradnikovu stranicu",
        "projectpage": "Vidi stranicu o projektu",
        "imagepage": "Vidi stranicu datoteke",
        "redirectedfrom": "(Preusmjereno s $1)",
        "redirectpagesub": "Preusmjeravanje",
        "redirectto": "Preusmjerava na:",
-       "lastmodifiedat": "Ova stranica posljednji put je izmjenjena $1 u $2.",
+       "lastmodifiedat": "Ova stranica posljednji je put izmijenjena $1 u $2.",
        "viewcount": "Ova stranica je pogledana {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Skoči na:",
        "portal-url": "Project:Portal zajednice",
        "privacy": "Zaštita privatnosti",
        "privacypage": "Project:Zaštita privatnosti",
-       "badaccess": "Pogreška u ovlaštenjima",
+       "badaccess": "Pogrješka u ovlastima",
        "badaccess-group0": "Nije Vam dopušteno izvršiti ovaj zahvat.",
        "badaccess-groups": "Ovaj zahvat mogu izvršiti samo suradnici iz {{PLURAL:$2|skupine|jedne od skupina}}: $1.",
        "versionrequired": "Potrebna inačica $1 MediaWikija",
        "youhavenewmessages": "Imate $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od više suradnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|999=novih poruka}}",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|posljednja $1 uređivanja|posljednjih $1 uređivanja}} na stranici za razgovor",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "virus-scanfailed": "skeniranje neuspješno (kod $1)",
        "virus-unknownscanner": "nepoznati antivirus:",
        "logouttext": "'''Odjavili ste se.'''\n\nNeke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne očistite međuspremnik svog preglednika.",
-       "cannotlogoutnow-title": "Odjava trenutno nije moguća.",
+       "cannotlogoutnow-title": "Odjava trenutno nije moguća",
        "cannotlogoutnow-text": "Odjava nije moguća tijekom uporabe $1.",
        "welcomeuser": "Dobrodošli, $1!",
        "welcomecreation-msg": "Vaš je suradnički račun otvoren.\nNe zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].",
        "passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
        "passwordreset-invalidemail": "Nevaljala adresa e-pošte",
        "changeemail": "Promijeni ili izbriši e-mail adresu",
-       "changeemail-header": "Promijeni adresu e-pošte računa",
+       "changeemail-header": "Ispunite ovaj obrazac da biste promijenili svoju adresu e-pošte. Ukoliko želite ukloniti povezanost svoje adrese e-pošte i suradničkoga računa, prilikom popunjavanja obrasca ostavite prazno polje umjesto upisivanja nove adrese e-pošte.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutačna adresa e-pošte:",
        "changeemail-newemail": "Nova adresa e-pošte:",
        "changeemail-newemail-help": "Ako želite izbrisati adresu Vaše e-pošte, ostavite ovo polje praznim. U tom slučaju, nećete biti u mogućnosti ponovno postaviti zaboravljenu zaporku i nećete moći primati e-poštu s ovog wikija.",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Zaporka za projekt {{SITENAME}}:",
-       "changeemail-submit": "Promijeni E-mail",
+       "changeemail-submit": "Promijeni e-mail",
        "changeemail-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
+       "changeemail-nochange": "Molimo vas, upišite neku novu adresu e-pošte.",
        "bold_sample": "Podebljani tekst",
        "bold_tip": "Podebljani tekst",
        "italic_sample": "Kurzivni tekst",
        "minoredit": "Ovo je manja promjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
-       "savechanges": "Spremi promjene",
+       "savechanges": "Sačuvaj stranicu",
        "publishpage": "Objavi stranicu",
        "publishchanges": "Objavi izmjene",
        "preview": "Pregled kako će stranica izgledati",
        "missingsummary": "'''Podsjetnik:''' Niste unijeli sažetak promjena. Ako ponovno kliknete na \"Sačuvaj stranicu\", Vaše će promjene biti snimljene bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Stvarate preusmjeravanje na isti članak.\nMožda ste izabrali pogrješnu odredišnu stranicu za preusmjeravanje ili uređujete pogrješnu stranicu.\nAko pritisnete na \"{{int:savearticle}}\" još jednom, preusmjeravanje će svejedno biti stvoreno.",
        "missingcommenttext": "Molim unesite sažetak.",
-       "missingcommentheader": "'''Podsjetnik:''' Niste napisali sažetak ovog komentara. Ako ponovno kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
-       "summary-preview": "Pregled sažetka:",
-       "subject-preview": "Pregled predmeta:",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali sažetak ovoga komentara. Ukoliko ponovo kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
+       "summary-preview": "Pregled polja Sažetak:",
+       "subject-preview": "Pregled teme:",
+       "previewerrortext": "Pri pokušaju prikazivanja pretpregleda vaših promjena došlo je do pogrješke.",
        "blockedtitle": "Suradnik je blokiran",
        "blockedtext": "'''Vaše suradničko ime ili IP adresa je blokirana'''\n\nBlokirao Vas je $1.\nRazlog blokiranja je sljedeći: ''$2''.\n\n* Početak blokade: $8\n* Istek blokade: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete koristiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
        "autoblockedtext": "Vaša IP adresa automatski je blokirana zbog toga što ju je koristio drugi suradnik, kojeg je blokirao $1.\nRazlog blokiranja je sljedeći:\n\n:''$2''\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete rabiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
        "yourdiff": "Razlike",
        "copyrightwarning": "Molimo uočite da se svi doprinosi {{SITENAME}} smatraju objavljenima pod uvjetima $2 (vidi $1 za detalje). Ako ne želite da se Vaše pisanje nemilosrdno uređuje i slobodno raspačava, nemojte ga ovamo slati.<br />\nTakođer nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom.\n'''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
        "copyrightwarning2": "Molimo uočite da svi suradnici mogu mijenjati sve doprinose na {{SITENAME}}. Ako ne želite da se Vaše pisanje nemilosrdno uređuje, nemojte ga slati ovdje.<br /> Također nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom (vidi $1 za detalje). '''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice ne može se mijenjati.",
        "longpageerror": "'''Pogrješka: Tekst koji ste unijeli dug je {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je više od maksimalno {{PLURAL:$2|jednog kilobajta|$2 kilobajta}}.'''\nNije ga moguće snimiti.",
        "readonlywarning": "'''UPOZORENJE: Baza podataka je zaključana zbog održavanja, pa trenutačno ne možete sačuvati svoje\npromjene. Najbolje je da kopirate i zaljepite tekst u tekstualnu datoteku te je snimite za kasnije.'''\n\nAdministrator je zaključao bazu iz razloga: $1",
        "protectedpagewarning": "'''UPOZORENJE: Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "nocreate-loggedin": "Nemate ovlasti za stvaranje novih stranica.",
        "sectioneditnotsupported-title": "Uređivanje odjeljka nije podržano",
        "sectioneditnotsupported-text": "Uređivanje odjeljka nije podržano na ovoj stranici",
-       "permissionserrors": "Pogreška u pravima",
+       "permissionserrors": "Pogrješka u pravima",
        "permissionserrorstext": "Nemate ovlasti za tu radnju iz sljedećih {{PLURAL:$1|razlog|razloga}}:",
        "permissionserrorstext-withaction": "Nemate dopuštenje za $2, iz {{PLURAL:$1|razloga|razloga}}:",
        "recreate-moveddeleted-warn": "'''Upozorenje: Ponovno stvarate stranicu koja je prethodno bila izbrisana.'''\n\nRazmotrite je li prikladno nastaviti s uređivanje ove stranice.\nZa Vašu informaciju slijedi evidencija brisanja i premještanja ove stranice:",
        "content-json-empty-object": "Prazan objekt",
        "content-json-empty-array": "Prazno polje",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] s više od jedne vrijednosti za parametar \"$3\". Rabit će se samo posljednja navedena vrijednost.",
+       "duplicate-args-category": "Stranice u kojima se ponavljaju argumenti u predlošcima",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše opterećujućih poziva parserskih funkcija\n\nTrebala bi imati manje od $2 {{PLURAL:$2|poziva|poziva}}, sada ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "expensive-parserfunction-category": "Stranice s previše poziva opterećujućih parserskih funkcija",
        "post-expand-template-inclusion-warning": "Upozorenje: Veličina uključenih predložaka je prevelika.\nNeki predlošci neće biti uključeni.",
        "last": "pret",
        "page_first": "prva",
        "page_last": "zadnja",
-       "histlegend": "Uputa: (sad) = razlika od trenutačne inačice,\n(pret) = razlika od prethodne inačice, m = manja promjena",
+       "histlegend": "Izbor za usporedbu: označi kružiće pokraj dvije inačice koje želiš usporediti i pritisni \"Enter\" ili tipku na dnu.<br />\nUputa: <strong>({{int:cur}})</strong> = razlika od trenutačne inačice, <strong>({{int:last}})</strong> = razlika od prethodne inačice, <strong>{{int:minoreditletter}}</strong> = manja promjena.",
        "history-fieldset-title": "Pretraži povijest",
        "history-show-deleted": "Samo izbrisane",
        "histfirst": "najstarije",
        "history-feed-description": "Povijest promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u (test) $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nStranica je vjerojatno prethodno izbrisana s wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti]] važnije nove stranice na wikiju.",
+       "history-edit-tags": "Uredi oznake označenih izmjena",
        "rev-deleted-comment": "(komentar uklonjen)",
        "rev-deleted-user": "(suradničko ime uklonjeno)",
        "rev-deleted-event": "(zapis uklonjen)",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Jeste li sigurni da želite pregledati izbrisanu inačicu datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
-       "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene}} stranice [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene|Označenih izmjena}} stranice [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice|Označenih inačica}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
        "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti javno vidljivi.",
        "revdelete-text-file": "Izbrisane inačice datoteke će i dalje biti vidljive u povijesti datoteke, ali neki dijelovi sadržaja neće biti javno vidljivi.",
        "mergehistory-empty": "Nema spojivih promjena (spajanje nije moguće).",
        "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene}} stranice $1 uspješno {{PLURAL:$3|spojena|spojene}} u povijest stranice [[:$2]].",
        "mergehistory-fail": "Nemoguće spojiti povijest stranica, molimo provjerite stranice i vremenske parametre.",
+       "mergehistory-fail-bad-timestamp": "Oznaka vremena nije valjana.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Ciljna stranica $1 ne postoji.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati valjani naziv.",
        "mergelog": "Evidencija spajanja povijesti stranica",
        "revertmerge": "Razdvoji",
        "mergelogpagetext": "Slijedi popis posljednjih spajanja povijesti stranica.",
-       "history-title": "Povijest izmjena stranice \"$1\"",
-       "difference-title": "Razlika između inačica stranice $1",
+       "history-title": "Povijest izmjena stranice »$1«",
+       "difference-title": "Razlika između inačica stranice »$1«",
        "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Redak $1:",
        "prefs-labs": "Labs mogućnosti",
        "prefs-user-pages": "Suradničke stranice",
        "prefs-personal": "Podaci o suradniku",
-       "prefs-rc": "Nedavne promjene i kratki članci",
+       "prefs-rc": "Nedavne promjene",
        "prefs-watchlist": "Praćene stranice",
        "prefs-editwatchlist": "Uredi popis praćenja",
        "prefs-editwatchlist-label": "Uredi stavke na popisu praćenja:",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
        "restoreprefs": "Vrati sve postavke na prvotno zadane",
-       "prefs-editing": "Širina okvira za uređivanje",
+       "prefs-editing": "Uređivanje",
        "searchresultshead": "Prikaz rezultata pretrage",
        "stub-threshold": "Prag za formatiranje poveznice na mrve ($1):",
        "stub-threshold-disabled": "Onemogućeno",
        "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 suradničke skupine",
-       "userrights-viewusergroup": "Vidi suradničke skupine",
+       "userrights-editusergroup": "Uredi {{GENDER:$1|suradničke}} skupine",
+       "userrights-viewusergroup": "Vidi {{GENDER:$1|suradničke}} skupine",
        "saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
-       "userrights-groupsmember": "Član:",
-       "userrights-groupsmember-auto": "Uključeni član:",
-       "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.",
+       "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-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalno dostupna.",
        "userrights-changeable-col": "Skupine koje možete promijeniti",
        "userrights-unchangeable-col": "Skupine koje ne možete promijeniti",
+       "userrights-expiry-none": "Neograničeno trajanje statusa",
        "userrights-conflict": "Sukob promjene suradničkih prava! Molimo provjerite i potvrdite svoje promjene.",
        "group": "Skupina:",
        "group-user": "Suradnici",
        "right-move": "Premještanje stranica",
        "right-move-subpages": "Premještanje stranica s njihovim podstranicama",
        "right-move-rootuserpages": "Premještanje osnovne stranice suradnika",
+       "right-move-categorypages": "premještanja kategorizacijskih stranica",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne raditi preusmjeravanje od starog imena prilikom premještanja stranice",
        "right-upload": "Postavljanje datoteka",
        "right-ipblock-exempt": "Iznimka od blokiranja IP adresa, auto-bloka i blokiranja opsega",
        "right-unblockself": "Odblokirati se",
        "right-protect": "Mijenjanje razina zaštićivanja i uređivanje zaštićenih stranica",
-       "right-editprotected": "Uređivanje zaštićenih stranica (bez prenosive zaštite)",
-       "right-editsemiprotected": "Uređivanje zaštićenih stranica kao \"{{int: zaštititi-nivo-autoconfirmed}}\"",
+       "right-editprotected": "Uređivanje stranica zaštićenih kao \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Uređivanje stranica zaštićenih kao \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Uređivanje suradničkog sučelja",
        "right-editusercssjs": "Uređivanje CSS i JS stranica drugih suradnika",
        "right-editusercss": "Uređivanje CSS stranica drugih suradnika",
        "right-import": "Uvoženje stranica s drugih wikija",
        "right-importupload": "Uvoženje stranica kao datoteke",
        "right-patrol": "Označavanje izmjena pregledanim",
-       "right-autopatrol": "Izmjene su automatski označene kao pregledane",
+       "right-autopatrol": "Izmjene su automatski označene kao ophođene",
        "right-patrolmarks": "Vidljive oznake pregledavanja u nedavnim promjenama",
        "right-unwatchedpages": "Vidljiv popis nepraćenih stranica",
        "right-mergehistory": "Spajanje povijesti stranica",
        "action-import": "uvoženje ove stranice s drugog wikija",
        "action-importupload": "uvoženje ove stranice postavljanjem datoteke",
        "action-patrol": "označavanje tuđih izmjena pregledanim",
-       "action-autopatrol": "automatsko označavanje pregledanim za svoje izmjene",
+       "action-autopatrol": "automatsko označavanje vlastitih izmjena ophođenim",
        "action-unwatchedpages": "gledanje popisa stranica koje nisu praćene",
        "action-mergehistory": "spajanje povijesti ove stranice",
        "action-userrights": "uređivanje svih suradničkih prava",
        "recentchanges-label-minor": "Manja izmjena",
        "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Nepregledana izmjena",
-       "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
+       "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "Nova stranica",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "filehist-dimensions": "Dimenzije",
        "filehist-filesize": "Veličina datoteke",
        "filehist-comment": "Komentar",
-       "imagelinks": "Upotreba datoteke",
+       "imagelinks": "Uporaba datoteke",
        "linkstoimage": "{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedeće stranice povezuju|$1 sljedećih stranica povezuje}} na ovu datoteku:",
        "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
        "nolinkstoimage": "Nijedna stranica ne povezuje na ovu sliku.",
        "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}",
        "ninterwikis": "$1 međuwiki {{PLURAL:$1|poveznica|poveznice|poveznica}}",
        "nlinks": "$1 {{PLURAL:$1|poveznica|poveznice|poveznica}}",
-       "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nmembers": "$1 {{PLURAL:$1|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|inačica|inačice|inačica}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "ntransclusions": "koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "deadendpagestext": "Sljedeće stranice nemaju poveznice na druge stranice na ovom wikiju ({{SITENAME}}).",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničene zaštite",
+       "protectedpages-summary": "Ova posebna stranica automatski je popis trenutačno zaštićenih stranica. Za popis naslova koji su zaštićeni za stvaranje vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosiva zaštita",
+       "protectedpages-noredirect": "Skrij preusmjeravanja",
        "protectedpagesempty": "Nema zaštićenih stranica koje ispunjavaju uvjete koje ste postavili.",
        "protectedpages-page": "Stranica",
        "protectedpages-expiry": "Istječe",
        "showhideselectedlogentries": "Otkrij/sakrij odabrane evidencije",
        "checkbox-select": "Odaberite: $1",
        "checkbox-all": "Sve",
-       "checkbox-none": "Nijedan",
+       "checkbox-none": "Ništa",
        "checkbox-invert": "Obrnuto",
        "allpages": "Sve stranice",
        "nextpage": "Sljedeća stranica ($1)",
        "listusersfrom": "Prikaži suradnike počevši od:",
        "listusers-submit": "Prikaži",
        "listusers-noresult": "Nema takvih suradnika.",
-       "listusers-blocked": "(blokiran)",
+       "listusers-blocked": "({{GENDER:$1|blokirani|blokirana}})",
        "activeusers": "Popis aktivnih suradnika",
        "activeusers-intro": "Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
        "activeusers-count": "{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "emailccsubject": "Kopija Vaše poruke suradniku $1: $2",
        "emailsent": "E-mail poslan",
        "emailsenttext": "Vaša poruka je poslana.",
-       "emailuserfooter": "Ovu je e-poruku {{GENDER:$1|poslao suradnik|poslala suradnica}} $1 {{GENDER:$2|suradniku $2|suradnici $2}} uporabom mogućnosti \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
+       "emailuserfooter": "Ovu je e-poruku {{GENDER:$1|poslao suradnik|poslala suradnica}} $1 {{GENDER:$2|suradniku $2|suradnici $2}} uporabom mogućnosti \"{{int:emailuser}}\" s projekta {{SITENAME}}. Ukoliko {{GENDER:$2|odgovorite}} na tu e-poruku, {{GENDER:$2|Vaša}} će poruka biti izravno poslana {{GENDER:$1|izvornom pošiljatelju}}, otkrivajući pritom {{GENDER:$2|Vašu}} adresu e-pošte {{GENDER:$1|pošiljatelju|pošiljateljici}}.",
        "usermessage-summary": "Ostavljanje poruke sustava.",
        "usermessage-editor": "Uređivač sistemskih poruka",
        "watchlist": "Popis praćenja",
        "changecontentmodel-reason-label": "Razlog:",
        "changecontentmodel-submit": "Promijeni",
        "changecontentmodel-success-title": "Sadržaj modela je promijenjen",
+       "log-name-contentmodel": "Evidencija promjena modela sadržaja",
        "protectlogpage": "Evidencija zaštićivanja",
        "protectlogtext": "Ispod je evidencija zaštićivanja i uklanjanja zaštite pojedinih stranica.\nPogledajte [[Special:ProtectedPages|zaštićene stranice]] za popis trenutačno zaštićenih stranica.",
        "protectedarticle": "članak \"[[$1]]\" je zaštićen",
        "restriction-edit": "Uređivanje",
        "restriction-move": "Premještanje",
        "restriction-create": "Stvori",
-       "restriction-upload": "Postavi",
+       "restriction-upload": "Postavljanje",
        "restriction-level-sysop": "samo administratori",
        "restriction-level-autoconfirmed": "samo prijavljeni suradnici",
        "restriction-level-all": "sve razine",
        "lastmodifiedatby": "Ovu je stranicu posljednji put {{GENDER:$4|mijenjao suradnik|mijenjala suradnica}} $3 dana $1 u $2.",
        "othercontribs": "Temelji se na doprinosu suradnika $1.",
        "others": "drugih",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|suradnik|suradnici}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|suradnik|suradnica}}|suradnici}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni suradnik|anonimni suradnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Za ovu stranicu nema podataka o autorima.",
        "spamprotectionmatch": "Naš filtar spama reagirao je na sljedeći tekst: $1",
        "spambot_username": "MediaWiki zaštita od spama",
        "spam_reverting": "Vraćam na posljednju inačicu koja ne sadrži poveznice na $1",
-       "spam_blanking": "Sve inačice sadrže poveznice na $1, brišem cjelokupni sadržaj",
+       "spam_blanking": "Sve inačice koje sadržavaju poveznice na $1, brišem cjelokupni sadržaj",
        "spam_deleting": "Sve inačice sadržale su poveznice na $1, brišem cjelokupni sadržaj",
        "simpleantispam-label": "Anti-spam provjera.\n<strong>NE</strong> ispunjavajte ovo!",
        "pageinfo-title": "Podatci o stranici \"$1\"",
        "markedaspatrollederror-noautopatrol": "Ne možete vlastite promjene označiti patroliranima.",
        "markedaspatrollednotify": "Uređivanje stranice $1 označeno je pregledanim.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
-       "patrol-log-page": "Evidencija pregledavanja promjena",
+       "patrol-log-page": "Evidencija ophodnji i samoophodnji",
        "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
-       "log-show-hide-patrol": "$1 evidenciju patroliranja",
+       "log-show-hide-patrol": "$1 evidenciju ophodnji",
+       "log-show-hide-tag": "$1 evidenciju oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 pregledanom?",
        "deletedrevision": "izbrisana stara inačica $1",
        "bad_image_list": "Rabi se sljedeći format:\n\nSamo retci koji počinju sa zvjezdicom su prikazani. Prva poveznica u retku mora biti poveznica na nevaljanu sliku.\nSvaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se slike pojavljuju ''inline''.",
        "variantname-sr-ec": "ćirilica",
        "variantname-sr-el": "latinica",
-       "metadata": "Metapodaci",
+       "metadata": "Metapodatci",
        "metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerojatno dodala digitalna kamera ili skener u procesu snimanja odnosno digitalizacije. Ako je datoteka mijenjana, podatci možda nisu u skladu sa stvarnim stanjem.",
        "metadata-expand": "Pokaži sve podatke",
        "metadata-collapse": "Sakrij dodatne podatke",
        "tags": "Valjane oznake izmjena",
        "tag-filter": "Filtar [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filtar",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake|Oznaka}}]]: $2)",
        "tag-mw-contentmodelchange": "promjena modela sadržaja",
        "tag-mw-contentmodelchange-description": "Uređivanja koja [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenjanju model sadržaja] stranice",
        "tags-title": "Oznake",
-       "tags-intro": "Ova je stranica popis oznaka s kojima softver može označiti promjenu te njihovo značenje.",
+       "tags-intro": "Ova stranica sadržava popis oznaka s kojima programska oprema može označivati promjene te njihova značenja.",
        "tags-tag": "Naziv oznake",
        "tags-display-header": "Izgled na popisima izmjena",
        "tags-description-header": "Puni opis značenja",
        "tags-active-header": "Aktivno?",
        "tags-hitcount-header": "Označene izmjene",
        "tags-actions-header": "Radnje",
-       "tags-active-yes": "Da",
-       "tags-active-no": "Ne",
+       "tags-active-yes": "da",
+       "tags-active-no": "ne",
        "tags-source-extension": "Definirano proširenjem",
        "tags-source-none": "Nije više u uporabi",
        "tags-edit": "uredi",
        "tags-delete": "izbriši",
        "tags-activate": "pokreni",
        "tags-deactivate": "isključi",
-       "tags-hitcount": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "tags-manage-no-permission": "Nemate pravo upravljati promjenama oznaka.",
        "tags-create-heading": "Stvori novu oznaku",
        "tags-create-tag-name": "Naziv oznake:",
        "tags-deactivate-submit": "Isključi",
        "tags-edit-title": "Uredi oznake",
        "tags-edit-manage-link": "Upravljaj oznakama",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Označena izmjena|Označene izmjene|Označenih izmjena}} stranice [[:$2]]:",
        "tags-edit-existing-tags": "Postojeće oznake:",
        "tags-edit-existing-tags-none": "\"Nema\"",
        "tags-edit-new-tags": "Nove oznake:",
        "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 {{GENDER:$2|obrisao|obrisala}} preusmjeravanje $3 prepisivanjem",
+       "logentry-delete-delete_redir": "$1 je premještanjem {{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",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez preusmjeravanja",
        "logentry-move-move_redir": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja",
        "logentry-move-move_redir-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
-       "logentry-patrol-patrol": "$1 je {{GENDER:$2|označio|označila}} uređivanje $4 stranice $3 pregledanim",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|označio|označila}} je uređivanje $4 stranice $3 ophođenim",
        "logentry-patrol-patrol-auto": "$1 je automatski {{GENDER:$2|označio|označila}} uređivanje $4 stranice $3 pregledanim",
        "logentry-newusers-newusers": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun",
        "logentry-newusers-create": "$1 je {{GENDER:$2|stvorio|stvorila}} suradnički račun.",
        "logentry-upload-upload": "$1 је {{GENDER:$2|postavio|postavila}} $3",
        "logentry-upload-overwrite": "$1 је {{GENDER:$2|postavio|postavila}} novu inačicu $3",
        "logentry-upload-revert": "$1 је {{GENDER:$2|postavio|postavila}} $3",
+       "log-name-managetags": "Evidencija upravljanja oznakama",
+       "log-name-tag": "Evidencija oznaka",
        "rightsnone": "(suradnik)",
        "revdelete-summary": "sažetak",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "right-pagelang": "Promijeni jezik stranice",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Slijede statistike postavljenih datoteka koje pokazuju zadnju inačicu datoteke. Starije ili izbrisane inačice nisu prikazane.",
+       "mediastatistics-bytespertype": "Ukupna veličina datoteka za ovaj odlomak: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ukupna veličina svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).",
        "mediastatistics-header-drawing": "Crteži (vektorske slike)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videozapisi",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "simboli",
        "special-characters-group-greek": "grčki",
+       "special-characters-group-greekextended": "grčki (prošireno)",
        "special-characters-group-cyrillic": "ćirilica",
        "special-characters-group-arabic": "arapski",
+       "special-characters-group-arabicextended": "arapski (prošireno)",
        "special-characters-group-persian": "perzijski",
        "special-characters-group-hebrew": "hebrejski",
-       "special-characters-group-bangla": "Bangla znakovi",
+       "special-characters-group-bangla": "bengalski",
+       "special-characters-group-tamil": "tamilski",
        "special-characters-group-telugu": "telugu",
-       "special-characters-group-sinhala": "Sinhaleški znakovi",
-       "special-characters-group-gujarati": "Gudžaratski znakovi",
-       "special-characters-group-thai": "Tajlandski (tajski) znakovi",
-       "special-characters-group-lao": "laoski znakovi",
+       "special-characters-group-sinhala": "sinhaleški",
+       "special-characters-group-gujarati": "gudžaratski",
+       "special-characters-group-devanagari": "devanagari",
+       "special-characters-group-thai": "tajlandski (tajski)",
+       "special-characters-group-lao": "laoski",
        "special-characters-group-khmer": "kmerski",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjeravanje na $1",
+       "randomrootpage": "Slučajna korijenska stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
        "log-action-filter-delete": "Vrsta brisanja:",
        "log-action-filter-import": "Vrsta uvoza:",
        "log-action-filter-rights-autopromote": "automatska promjena",
        "log-action-filter-upload-upload": "novo postavljanje",
        "log-action-filter-upload-overwrite": "ponovno postavljanje",
+       "authmanager-authn-autocreate-failed": "Automatsko stvaranje lokalnoga računa nije uspjelo: $1",
+       "authmanager-autocreate-noperm": "Automatsko stvaranje računa nije dopušteno.",
+       "authmanager-provider-password": "Autorizacija zaporkom",
        "authmanager-provider-temporarypassword": "Privremena zaporka",
        "changecredentials": "Promjena vjerodajnica",
        "changecredentials-submit": "Promijeni vjerodajnice",
index 6bc52f5..85192b1 100644 (file)
        "passwordreset-emaildisabled": "Die E-Mail-Funktione worre uff dem Wiki deaktiviert.",
        "passwordreset-username": "Benutzernoome:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Die E-Mail-Nachricht oonsiehn?",
-       "passwordreset-capture-help": "Wenn du das Kästche oonkreizt, weard die E-Mail-Nachricht mit dem temporäre Passwort sowohl dir oongezeicht als ooch dem Benutzer zugesandt.",
        "passwordreset-email": "E-Mail-Adress",
        "passwordreset-emailtitle": "Benutzerkontoinformatione uff {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adress $1, wahrscheinlich du sellebst, hot en Zurücksetzung von dein Passworts bei {{SITENAME}} oongefordert ($4). {{PLURAL:$3|Das follichend Benutzerkonto ist|Die follichende Benutzerkonte sind}}\nmit der E-Mail-Adress verknüpft:\n\n$2\n\n{{PLURAL:$3|Das temporär Passwort looft|Die temporäre Passwörter loofe}} innerhalb von {{PLURAL:$5|em Tooch|$5 Tooche}} ab.\nDu sollst dich oonmelde und en neies Passwort vergewe. Falls jemand annres die Oonfroch getätigt hot orrer du dich wieder an dein ursprüngliches Passwort erinnre kannst und das netmeh\nännre möchst, kannst du die Nachricht ignoriere und weiterhin dein altes\nPasswort benutze.",
        "saveprefs": "Instellunge speichre",
        "restoreprefs": "Alle Standardinstellunge wiederhearstelle (in alle Abschnitte)",
        "prefs-editing": "Beoorbeite",
-       "rows": "Zeile:",
-       "columns": "Spalte:",
        "searchresultshead": "Such",
        "stub-threshold": "Linkformatierung <a href=\"#\" class=\"stub\">klen Seite</a> (in Bytes):",
        "stub-threshold-disabled": "Deaktiviert",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du host net die nötiche Berechtichung, um Benutzerrechte in annre Wikis ännre  könne.",
        "userrights-nodatabase": "Die Datebank $1 ist net voarhand orrer net lokal.",
-       "userrights-nologin": "Du musst dich mit en Administratoar-Benutzerkonto [[Special:UserLogin|oonmeld]], um Benutzerrechte ännre.",
-       "userrights-notallowed": "Du verfüchst net üwer die erforderliche Berechtichunge, um Benutzerrechte vergebe orrer entziehe könne.",
        "userrights-changeable-col": "Gruppezugehörigkeit, die du ännre kannst",
        "userrights-unchangeable-col": "Gruppezugehörigkeit, die du net ännre kannst",
        "userrights-conflict": "Benutzerrechteännerungskonflikt! Bittschön üwerprüf und bestätich deine Ännrunge.",
-       "userrights-removed-self": "Du host dein eichne Rechte erfollichreich entfernt. Du kannst net länger uff die Seit zugreife.",
        "group": "Grupp:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Automatisch bestätichte Benutzer",
        "right-siteadmin": "Datebank sperre und entsperre",
        "right-override-export-depth": "Exportier Seite einschliesslich verlinkter Seite bis zu en Tief von 5",
        "right-sendemail": "E-Mails an annre Benutzer sende",
-       "right-passwordreset": "Passwort von en Benutzer zurücksetze und die dazu verschickte E-Mail einsiehn",
        "newuserlogpage": "Neioonmeldungs-Logbuch",
        "newuserlogpagetext": "Dies ist en Logbuch von der nei erstellte Benutzerkonte.",
        "rightslog": "Rechte-Logbuch",
        "uploaddisabledtext": "Das Hochloode von Dateie ist deaktiviert.",
        "php-uploaddisabledtext": "Das Hochloode von Dateie woard in PHP deaktiviert.\nBittschön üwerprüf die <code>file_uploads</code>-Einstellung.",
        "uploadscripted": "Die Datei enthält HTML- orrer Scriptcode, wo irrtümlich von enem Webbrowser ausgeführt werre könnt.",
-       "uploadscriptednamespace": "Die SVG-Datei enthält den ungültiche Noomeraum „$1“.",
+       "uploadscriptednamespace": "Die SVG-Datei enthält den ungültiche Noomeraum „<nowiki>$1</nowiki>“.",
        "uploadinvalidxml": "Das XML in der hochgeladne Datei konnt net geparst werre.",
        "uploadvirus": "Die Datei enthält en Virus! Details: $1",
        "uploadjava": "Dies ist ein ZIP-Datei, wo en CLASS-Datei von Java enthält.\nDas Hochloode von Java-Dateie ist net gestattet, weil sie die Umgehung von Sicherheitseinschränkunge ermöchliche könnte.",
        "feedback-thanks": "Dankschön. Dein Rückmeldung woard uff der Seit \"[$2 $1]\" gespeichert.",
        "searchsuggest-search": "Such",
        "searchsuggest-containing": "wo enthält …",
-       "api-error-badaccess-groups": "Du host net die Berechtichung Dateie in des Wiki hochzuloode.",
        "api-error-badtoken": "Interner Fehler: Der Token ist fehlerhaft.",
-       "api-error-copyuploaddisabled": "Das Hochloode doorrich URL woard uff dem Server deaktiviert.",
-       "api-error-duplicate": "Do gebts im Wiki schon {{PLURAL:$1|en anner Datei|mehrre andere Dateie}} mit dem gleiche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war schon annre Datei|woore schon annre Dateie}} mit dem gleiche Inhalt voarhand. {{PLURAL:$1|Sie woard|Sie woorre}} awer abgewischt.",
-       "api-error-empty-file": "Die hochgeloodne Datei woor leer.",
        "api-error-emptypage": "Es ist net erlaubt, neie leere Seite erstelle.",
-       "api-error-fetchfileerror": "Interner Fehler: Bei dem Datei abrufe ist en Fehler uffgetret.",
-       "api-error-fileexists-forbidden": "En Datei mit dem Noome \"$1\" ist schon voarhand und kann net üwerschrieb sin.",
-       "api-error-fileexists-shared-forbidden": "En Datei mit dem noomen \"$1\" ist schon im gemeinsam  Dateirepositorium voarhand und kann doher net üwerschrieb sin.",
-       "api-error-file-too-large": "Die hochgeloodne Datei woor zu gross.",
-       "api-error-filename-tooshort": "Der Dateinoome ist zu koorz.",
-       "api-error-filetype-banned": "Die Dateiendung ist gesperrt.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ist en net zulässicher Dateityp|sind net zulässiche Dateitype}}. {{PLURAL:$3|En zulässicher Dateityp ist|Zulässiche Dateitype sind}} $2.",
-       "api-error-filetype-missing": "Die hochzuladende Datei hat keine Dateiendung.",
-       "api-error-hookaborted": "Der Versuch, die Ännrung doorrichzuführe, woard von en Parsererweitrung (API) abgebroch.",
-       "api-error-http": "Interner Fehler: Es konnt keh Verbinnung zum Server heargestellt sin.",
-       "api-error-illegal-filename": "Der Dateinoome ist net zulässich.",
-       "api-error-internal-error": "Interner Fehler: En unbekannter Fehler ist beim Hochloode von der Datei ins Wiki uffgetret.",
-       "api-error-invalid-file-key": "Interner Fehler: Die Datei woard net im temporäre Speicher gefunn.",
-       "api-error-missingparam": "Interner Fehler: Der Oonfroch fehle ehre Parameter.",
-       "api-error-missingresult": "Interner Fehler: Es konnt net festgestellt sin, ob das Kopiere erfollichreich woor.",
-       "api-error-mustbeloggedin": "Um Dateie hochloode könne, musst du oongemeldt sin.",
-       "api-error-mustbeposted": "Interner Fehler: Do gebts en Programmfehler, weil die falsche HTTP-Methode weard verwendt (HTTP POST ist nötich).",
-       "api-error-noimageinfo": "Das Hochloode woor erfollichreich, awer der Server kann ken Informatione zur Datei oonzeiche.",
-       "api-error-nomodule": "Interner Fehler: Es woarde ken Modul zum Hochloode festgeleht.",
-       "api-error-ok-but-empty": "Interner Fehler: Der Server reagiert net.",
-       "api-error-overwrite": "Das Üwerschreibe von en voarhand Datei ist net erlaubt.",
-       "api-error-stashfailed": "Interner Fehler: Der Server konnt keh temporär Datei speichre.",
        "api-error-publishfailed": "Interner Fehler: Der Server konnt die temporär Datei net veröffentliche.",
-       "api-error-stasherror": "Beim Hochloode von der Datei hot es en Fehler geb.",
-       "api-error-timeout": "Der Server hot net innerhalb von der erwoortete Zeit reagiert.",
-       "api-error-unclassified": "En unbekannter Fehler ist uffgetret.",
-       "api-error-unknown-code": "Unbekannter Fehler: \"$1\"",
-       "api-error-unknown-error": "Interner Fehler: En unbekannter Fehler ist beim Hochloode von der Datei uffgetret.",
+       "api-error-stashfailed": "Interner Fehler: Der Server konnt keh temporär Datei speichre.",
        "api-error-unknown-warning": "Unbekannte Woornung: $1",
        "api-error-unknownerror": "Unbekannter Fehler: \"$1\"",
-       "api-error-uploaddisabled": "Das Hochloode ist in diesem Wiki deaktiviert.",
-       "api-error-verification-error": "Die hochzuloodend Datei ist entweder fehlerhaft orrer hot keh Dateinoomeerweitrung.",
        "duration-seconds": "$1 {{PLURAL:$1|Sekund|Sekunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minut|Minute}}",
        "duration-hours": "$1 {{PLURAL:$1|Stund|Stunne}}",
index 2c78830..9012602 100644 (file)
        "uploaddisabledtext": "Nahraće datajow je znjemóžnjene.",
        "php-uploaddisabledtext": "Nahraća PHP-datajow su znjemóžnjene. Prošu skontroluj nastajenje file_uploads.",
        "uploadscripted": "Dataja wobsahuje HTML- abo skriptowy kod, kotryž móhł so mylnje přez wobhladowak wuwjesć.",
-       "uploadscriptednamespace": "Tuta SVG-dataja wobsahuje njedowoleny mjenowy rum '$1'",
+       "uploadscriptednamespace": "Tuta SVG-dataja wobsahuje njedowoleny mjenowy rum '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML w nahratej dataji njeda so parsować.",
        "uploadvirus": "Dataja wirus wobsahuje! Podrobnosće: $1",
        "uploadjava": "Tuta dataja je ZIP-dataja, kotraž .class-dataju z Javy wobsahuje.\nNahraće datajow Javy njeje dowolene, dokelž móhli wobeńdźenje wěstotnych wobmjezowanjow zmóžnić.",
index fae4caf..2586a71 100644 (file)
        "uploaded-setting-handler-svg": "Az SVG kódok, amelyek a \"handler\" attribútumot távolra/adatra/szkriptre állítják, le vannak tiltva. A feltöltött SVG fájlban a következőt találtam: <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "Az SVG kódok, amelyek bármely stílus-attribútumot távoli URL-ra állítják, le vannak tiltva. A feltöltött SVG fájlban a következőt találtam: <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "A feltöltött SVG fájl URL-t tartalmazó képfiltert tartalmaz: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Ez az SVG fájl érvénytelen névteret (\"$1\") tartalmaz.",
+       "uploadscriptednamespace": "Ez az SVG fájl érvénytelen névteret (\"<nowiki>$1</nowiki>\") tartalmaz.",
        "uploadinvalidxml": "A feltöltött XML fájlt nem lehet feldolgozni.",
        "uploadvirus": "Ez a fájl vírust tartalmaz! A részletek: $1",
        "uploadjava": "A fájl egy ZIP-fájl, ami egy Java .class fájlt tartalmaz.\nJava fájlok feltöltése nem engedélyezett, mert segítségükkel kijátszhatóak a biztonsági korlátozások.",
index e5cbf84..1bceb36 100644 (file)
        "searcharticle": "Անցնել",
        "history": "Էջի պատմություն",
        "history_short": "Պատմություն",
-       "updatedmarker": "թարմացվել է իմ վերջին այցից հետո",
+       "updatedmarker": "փոփոխվել է ձեր վերջին այցից հետո",
        "printableversion": "Տպելու տարբերակ",
        "permalink": "Մշտական հղում",
        "print": "Տպել",
        "retypenew": "Հաստատեք նոր գաղտնաբառը.",
        "resetpass_submit": "Հաստատել գաղտնաբառը և մտնել համակարգ",
        "changepassword-success": "Ձեր գաղտնաբառը փոփոխվեց։",
-       "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80եր",
-       "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¶ անջատված են:",
-       "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¨",
-       "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80",
-       "botpasswords-editexisting": "Խմբագրել առկա բոտային ծածկագիրը",
+       "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼եր",
+       "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80Õ¨ անջատված են:",
+       "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80",
+       "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼",
+       "botpasswords-editexisting": "Փոխել եղած բոտի գաղտնաբառը",
        "botpasswords-label-appid": "Բոտի անուն՝",
        "botpasswords-label-create": "Ստեղծել",
        "botpasswords-label-update": "Թարմացնել",
        "botpasswords-label-cancel": "Չեղարկել",
        "botpasswords-label-delete": "Ջնջել",
-       "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը",
+       "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը",
        "botpasswords-label-grants-column": "Թույլատրված է",
        "botpasswords-bad-appid": "\"$1\" բոտի անունն անթույլատրելի է:",
        "botpasswords-created-title": "Բոտի ծածկագիրը ստեղծվել է",
        "botpasswords-created-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ստեղծվել է:",
-       "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը թարմացվել է",
-       "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö\80 Õ¢Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§:",
-       "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§",
+       "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը թարմացվել է",
+       "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Ö\83Õ¸Ö\83Õ¸Õ­Õ¾Õ¥Ö\81:",
+       "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Ö\81",
        "botpasswords-deleted-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ջնջվել է:",
        "resetpass_forbidden": "Գաղտնաբառը չի կարող փոխվել",
        "resetpass-no-info": "Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։",
index 96bb80c..f8dfc24 100644 (file)
        "selfredirect": "<strong>Attention:</strong> Tu redirige iste pagina verso se mesme.\nTu pote haber specificate le mal destination pro le redirection, o tu modifica forsan le mal pagina.\nSi tu clicca sur \"{{int:savearticle}}\" de novo, le redirection essera create in despecto de isto.",
        "missingcommenttext": "Per favor entra un commento infra.",
        "missingcommentheader": "<strong>Rememoration:</strong> Tu non ha fornite un subjecto pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin subjecto.",
-       "summary-preview": "Previsualisation del summario:",
+       "summary-preview": "Previsualisation del summario de modification:",
        "subject-preview": "Previsualisation del subjecto:",
        "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "blockedtitle": "Le usator es blocate",
        "search-interwiki-caption": "Projectos fratres",
        "search-interwiki-default": "Resultatos de $1:",
        "search-interwiki-more": "(plus)",
+       "search-interwiki-more-results": "plus resultatos",
        "search-relatedarticle": "Connexe",
        "searchrelated": "connexe",
        "searchall": "totes",
        "editusergroup": "Cargar gruppos de usator",
        "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Ecce le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar gruppos de usatores",
-       "userrights-viewusergroup": "Vider gruppos del usator",
+       "userrights-editusergroup": "Modificar le gruppos del {{GENDER:$1|usator}}",
+       "userrights-viewusergroup": "Vider le gruppos del {{GENDER:$1|user}}",
        "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 del quales iste usator es membro:\n* Un quadrato marcate significa que le usator es membro del gruppo in question.\n* Un non marcate significa que ille non es membro de illo.\n* Un * indica que tu non potera eliminar le gruppo quando tu lo ha addite, o vice versa.",
+       "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-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-changeable-col": "Gruppos que tu pote modificar",
        "userrights-unchangeable-col": "Gruppos que tu non pote modificar",
-       "userrights-expiry-current": "Expiration: $2",
+       "userrights-expiry-current": "Expiration: $1",
        "userrights-expiry-none": "Non expira",
        "userrights-expiry": "Expiration:",
        "userrights-expiry-existing": "Expiration existente: le $2 a $3",
        "uploaded-setting-handler-svg": "Le SVG que fixa le attributo \"handler\" con un objectivo remote, de datos o de script es blocate, ma le codice <code>$1=\"$2\"</code> se trova in le file SVG incargate.",
        "uploaded-remote-url-svg": "Le SVG que contine un URL remote in un attributo de stilo es blocate, ma le codice <code>$1=\"$2\"</code> se trova in le file SVG incargate.",
        "uploaded-image-filter-svg": "Se trova un filtro de imagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> in le file SVG incargate.",
-       "uploadscriptednamespace": "Iste file SVG contine un spatio de nomines invalide: \"$1\"",
+       "uploadscriptednamespace": "Iste file SVG contine un spatio de nomines invalide: \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Le codice XML in le file incargate non pote esser interpretate.",
        "uploadvirus": "Le file contine un virus! Detalios: $1",
        "uploadjava": "Iste file es un archivo ZIP que contine un file .class de Java.\nNon es permittite incargar files Java, proque istes pote contornar le restrictiones de securitate.",
        "mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
        "mw-widgets-titleinput-description-redirect": "redirection a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adder un categoria…",
+       "mw-widgets-usersmultiselect-placeholder": "Adder plus...",
        "sessionmanager-tie": "Impossibile combinar plure typos de authentication de requesta: $1.",
        "sessionprovider-generic": "sessiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessiones basate sur cookies",
index 45be55c..c8c6fa0 100644 (file)
@@ -50,7 +50,8 @@
                        "Beeyan",
                        "Bonaditya",
                        "Irus",
-                       "Presidenvolksraad"
+                       "Presidenvolksraad",
+                       "Hidayatsrf"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "searcharticle": "Lanjut",
        "history": "Riwayat halaman",
        "history_short": "Versi terdahulu",
+       "history_small": "riwayat",
        "updatedmarker": "diubah sejak kunjungan terakhir saya",
        "printableversion": "Versi cetak",
        "permalink": "Pranala permanen",
        "selfredirect": "<strong>Peringatan:</strong> Anda mengalihkan halaman ini kembali ke halaman semula.\nAnda bisa jadi telah memberikan tujuan pengalihan yang salah, atau telah menyunting halaman yang salah.\nJika Anda mengeklik \"{{int:savearticle}}\" sekali lagi, halaman pengalihan akan dibuat.",
        "missingcommenttext": "Harap masukkan komentar di bawah ini.",
        "missingcommentheader": "'''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"{{int:savearticle}}\", suntingan Anda akan disimpan tanpa komentar tersebut.",
-       "summary-preview": "Pratayang ringkasan:",
+       "summary-preview": "Pratayang ringkasan suntingan:",
        "subject-preview": "Pratayang subjek:",
        "previewerrortext": "Kesalahan terjadi saat mencoba memperlihatkan pratayang perubahan Anda.",
        "blockedtitle": "Pengguna diblokir",
        "search-interwiki-caption": "Proyek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(selanjutnya)",
+       "search-interwiki-more-results": "Hasil lainnya",
        "search-relatedarticle": "Berkaitan",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "saveprefs": "Simpan",
        "restoreprefs": "Kembalikan semua setelan bawaan",
        "prefs-editing": "Penyuntingan",
-       "rows": "Baris:",
-       "columns": "Kolom:",
        "searchresultshead": "Cari",
        "stub-threshold": "Ambang batas untuk format pranala rintisan ($1):",
        "stub-threshold-sample-link": "contoh",
        "username": "{{GENDER:$1|Nama pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (sampai $2)",
        "prefs-registration": "Waktu pendaftaran:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Nama asli:",
        "editusergroup": "Muat kelompok pengguna",
        "editinguser": "Mengubah hak pengguna untuk {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Melihat hak pengguna dari {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Sunting kelompok pengguna",
-       "userrights-viewusergroup": "Lihat kelompok pengguna",
+       "userrights-editusergroup": "Sunting kelompok {{GENDER:$1|pengguna}}",
+       "userrights-viewusergroup": "Lihat kelompok {{GENDER:$1|pengguna}}",
        "saveusergroups": "Simpan kelompok {{GENDER:$1|pengguna}}",
        "userrights-groupsmember": "Anggota dari:",
        "userrights-groupsmember-auto": "Anggota implisit dari:",
        "userrights-changeable-col": "Kelompok yang dapat Anda ubah",
        "userrights-unchangeable-col": "Kelompok yang tidak dapat Anda ubah",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Udang $1",
+       "userrights-expiry-none": "Tidak usang",
+       "userrights-expiry": "Usang:",
+       "userrights-expiry-othertime": "Waktu lain:",
        "userrights-conflict": "Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan Anda.",
        "group": "Kelompok:",
        "group-user": "Pengguna",
        "recentchanges-legend-heading": "<strong>Keterangan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
        "recentchanges-submit": "Tampilkan",
+       "rcfilters-activefilters": "Filter aktif",
+       "rcfilters-restore-default-filters": "Kembalikan filter bawaan",
+       "rcfilters-clear-all-filters": "Hapus semua penyaringan",
+       "rcfilters-search-placeholder": "Filter perubahan terbaru (jelajahi atau masukan input)",
+       "rcfilters-invalid-filter": "Penyqringan tidak sah",
+       "rcfilters-empty-filter": "Tidak ada filter aktif. Semua kontribusi ditampilkan.",
+       "rcfilters-filterlist-title": "Penyaringan",
+       "rcfilters-filterlist-feedbacklink": "Berikan umpan balik untuk filter uji coba baru",
+       "rcfilters-highlightmenu-title": "Pilih warna",
+       "rcfilters-filterlist-noresults": "Tidak ada penyaring ditemukan",
+       "rcfilters-filtergroup-registration": "Pendaftaran pengguna",
+       "rcfilters-filter-registered-label": "Terdaftar",
+       "rcfilters-filter-registered-description": "Penyunting masuk log",
+       "rcfilters-filter-unregistered-label": "Tidak terdaftar",
+       "rcfilters-filter-unregistered-description": "Penyunting yang tidak masuk log",
+       "rcfilters-filter-editsbyself-label": "Suntingan Anda",
+       "rcfilters-filter-editsbyself-description": "Suntingan oleh Anda",
+       "rcfilters-filter-editsbyother-label": "Suntingan orang lain",
+       "rcfilters-filter-editsbyother-description": "Suntingan dibuat oleh orang lain (bukan Anda)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Pendatang baru",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Kurang dari 10 suntingan dan aktivitas selama 4 hari.",
+       "rcfilters-filter-userExpLevel-learner-label": "Pelajar",
+       "rcfilters-filter-userExpLevel-experienced-label": "Pengguna berpengalaman",
+       "rcfilters-filtergroup-automated": "Kontribusi otomatis",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Suntingan yang dibuat dengan perkakas terotomatisasi.",
+       "rcfilters-filter-humans-label": "Manusia (bukan bot)",
+       "rcfilters-filter-humans-description": "Suntingan yang dibuat oleh penyunting manusia.",
+       "rcfilters-filtergroup-significance": "Kepentingan",
+       "rcfilters-filter-minor-label": "Suntingan kecil",
+       "rcfilters-filter-minor-description": "Suntingan yang ditandai penyunting sebagai suntingan kecil",
+       "rcfilters-filter-major-label": "Suntingan yang bukan suntingan kecil",
+       "rcfilters-filter-major-description": "Suntingan yang ditandai sebagai suntingan kecil",
+       "rcfilters-filtergroup-changetype": "Jenis perubahan",
+       "rcfilters-filter-pageedits-label": "Suntingan halaman",
+       "rcfilters-filter-pageedits-description": "Suntingan pada konten wiki, diskusi, deskripsi kategori....",
+       "rcfilters-filter-newpages-label": "Pembuatan halaman",
+       "rcfilters-filter-newpages-description": "Suntingan yang membuat halaman baru",
+       "rcfilters-filter-categorization-label": "Perubahan kategori",
+       "rcfilters-filter-categorization-description": "Rekam jejak halaman yang telah ditambahkan atau dihapus dari kategori.",
+       "rcfilters-filter-logactions-label": "Tindakan tercatat",
+       "rcfilters-filter-logactions-description": "Tindakan administratif, pembuatan akun, penghapusan halaman, pengunggahan....",
        "rcnotefrom": "Di bawah ini adalah {{PLURAL:$5|perubahan}} sejak <strong>$3, $4</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
        "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "uploaded-setting-event-handler-svg": "Penyetelan atribut event-handler diblokir, menemukan <code>&lt;$1 $2=\"$3\"&gt;</code> dalam berkas SVG yang diunggah.",
        "uploaded-setting-href-svg": "Menggunakan tag \"set\" untuk menambahkan atribut \"href\" ke elemen utama diblokir.",
        "uploaded-remote-url-svg": "SVG yang mengatur setiap atribut style dengan URL luar diblokir. $1=\"$2\" ditemui di dalam berkas SVG yang diunggah.",
-       "uploadscriptednamespace": "Berkas SVG ini memuat ruang nama ilegal \"$1\"",
+       "uploadscriptednamespace": "Berkas SVG ini memuat ruang nama ilegal \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML dalam berkas yang diunggah tidak bisa diuraikan.",
        "uploadvirus": "Berkas tersebut mengandung virus! Rincian: $1",
        "uploadjava": "Berkas ini adalah berkas ZIP yang mengnadung berkas .class Java.\nPenggunggahan berkas Java tidak diperbolehkan karena dapat menyebabkan pengabaian batasan keamanan.",
        "apisandbox-sending-request": "Mengirim permintaan API...",
        "apisandbox-loading-results": "Menerima hasil API...",
        "apisandbox-results-error": "Sebuah galat terjadi ketika memuat permintaan respon API: $1.",
+       "apisandbox-request-selectformat-label": "Tampilkan permintaan data sebagai:",
        "apisandbox-request-url-label": "URL Permintaan:",
+       "apisandbox-request-json-label": "Meminta JSON:",
        "apisandbox-request-time": "Lama permintaan: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Perbaiki token dan kirim kembali",
        "apisandbox-results-fixtoken-fail": "Gagal mendapatkan token \"$1\".",
        "apisandbox-alert-field": "Nilai dalam kolom ini tidak valid.",
        "apisandbox-continue": "Lanjutkan",
        "apisandbox-continue-clear": "Kosongkan",
+       "apisandbox-param-limit": "Masukan <kbd>max</kbd> untuk menggunakan batas maksimum.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Semua ruang nama)",
+       "apisandbox-multivalue-all-values": "$1 (Semua nilai)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Cari",
        "booksources-text": "Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari:",
        "booksources-invalid-isbn": "ISBN yang diberikan tampaknya tidak valid; periksa kesalahan penyalinan dari sumber asli.",
+       "magiclink-tracking-rfc": "Halaman menggunakan pranala magis RFC",
+       "magiclink-tracking-pmid": "Halaman menggunakan pranala magis PMID",
+       "magiclink-tracking-isbn": "Halaman yang menggunakan pranala magis ISBN",
        "specialloguserlabel": "Pengguna:",
        "speciallogtitlelabel": "Target (judul atau{{ns:pengguna}}:nama pengguna untuk pengguna)",
        "log": "Catatan (Log)",
        "activeusers-intro": "Berikut adalah daftar pengguna yang memiliki suatu bentuk aktivitas selama paling tidak $1 {{PLURAL:$1|hari|hari}} terakhir.",
        "activeusers-count": "$1 {{PLURAL:$1|aktivitas|aktivitas}} dalam {{PLURAL:$3|1 hari|$3 hari}} terakhir",
        "activeusers-from": "Tampilkan pengguna mulai dari:",
+       "activeusers-groups": "Tampilkan pengguna yang termasuk kelompok:",
+       "activeusers-excludegroups": "Sembunyikan pengguna yang termasuk kelompok:",
        "activeusers-noresult": "Pengguna tidak ditemukan.",
        "activeusers-submit": "Tampilkan pengguna aktif",
        "listgrouprights": "Daftar hak kelompok",
        "rollbacklinkcount-morethan": "kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbackfailed": "Pengembalian gagal dilakukan",
        "rollback-missingparam": "Parameter dibutuhkan ketika diminta tidak tersedia.",
+       "rollback-missingrevision": "Tidak mampu memuat data revisi.",
        "cantrollback": "Tidak dapat membatalkan suntingan;\nkontributor terakhir adalah satu-satunya penulis halaman ini.",
        "alreadyrolled": "Tidak dapat melakukan pengembalian ke revisi terakhir [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|bicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.\n\nSuntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Komentar penyuntingan adalah: <em>$1</em>.",
        "revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]",
        "revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]",
-       "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
+       "rollback-success": "Pembatalan suntingan oleh {{GENDER:$3|$1}}; dibatalkan ke versi terakhir oleh {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
        "sorbs": "DNSBL",
        "sorbsreason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.",
        "sorbs_create_account_reason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.",
+       "softblockrangesreason": "Kontribusi anonim tidak diizinkan dari alamat IP Anda ($1). Silakan masuk log.",
        "xffblockreason": "Sebuah alamat IP terdapat di kepala X-Forwarded-For, entah milik Anda atau peladen ''proxy'' yang Anda gunakan, telah diblokir. Alasan pemblokirannya adalah: $1",
        "cant-see-hidden-user": "Pengguna yang Anda coba blokir telah diblokir dan disembunyikan. Selama Anda tidak memiliki hak sembunyikan pengguna, Anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.",
        "ipbblocked": "Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena Anda sendiri diblokir.",
        "cant-move-to-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman ke suatu halaman pengguna (kecuali ke subhalaman pengguna).",
        "cant-move-category-page": "Anda tidak memiliki izin untuk memindahkan halaman kategori.",
        "cant-move-to-category-page": "Anda tidak memiliki izin untuk memindahkan halaman ke halaman kategori.",
+       "cant-move-subpages": "Anda tidak memiliki izin untuk memindahkan subhalaman",
+       "namespace-nosubpages": "Ruang nama \"$1\" tidak mengizinkan subhalaman.",
        "newtitle": "Judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "newimages-showbots": "Tampilkan unggahan oleh bot",
        "newimages-hidepatrolled": "Sembunyikan unggahan yang telah dipatroli",
        "noimages": "Tidak ada yang dilihat.",
+       "gallery-slideshow-toggle": "Beralih  ''thumbnails''",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "sp-newimages-showfrom": "Tampilkan berkas baru dimulai dari $2, $1",
        "tag-filter": "Filter [[Special:Tags|tag]]:",
        "tag-filter-submit": "Penyaring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
+       "tag-mw-contentmodelchange": "Perubahan model konten",
+       "tag-mw-contentmodelchange-description": "Perubahan yang [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mengubah model konten] suatu halaman",
        "tags-title": "Tanda",
        "tags-intro": "Halaman ini berisi daftar tag yang dapat ditandai oleh perangkat lunak terhadap suatu suntingan berikut artinya.",
        "tags-tag": "Nama tag",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Tag|Tag}} berikut tidak diizinkan untuk diterapkan secara manual: $1",
        "tags-update-no-permission": "Anda tidak memiliki izin untuk menambah atau menghapus perubahan tag dari revisi atau entri log individu.",
        "tags-update-blocked": "Anda tidak dapat menambahkan atau menghapus perubahan tag ketika {{GENDER:$1|Anda}} sedang diblokir.",
+       "tags-update-add-not-allowed-one": "Tag \"$1\"tidak diizinkan untuk ditambahkan secara manual.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|tag is|Tag ini}} tidak diizinkan untuk ditambahkan secara manual: $1",
+       "tags-update-remove-not-allowed-one": "Tag \"$1\" tidak diizinkan untuk dihapus.",
        "tags-edit-title": "Sunting tag",
        "tags-edit-manage-link": "Kelola tag",
        "tags-edit-revision-selected": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
        "htmlform-time-placeholder": "JJ:MM:DD",
        "htmlform-datetime-placeholder": "TTTT-BB-HH JJ:MM:DD",
        "htmlform-date-invalid": "Nilai yang diberikan tidak dikenali sebagai tanggal. Coba lagi menggunakan format TTTT-BB-HH.",
+       "htmlform-time-invalid": "Nilai yang Anda tentukan bukan waktu yang dikenali. Cobalah menggunakan format HH:MM:SS",
        "htmlform-datetime-invalid": "Nilai yang Anda masukkan tidak dikenali sebagai tanggal dan waktu. Coba gunakan format YYYY-MM-DD HH:MM:SS",
        "htmlform-date-toolow": "Nilai yang Anda masukkan adalah sebelum tanggal paling dini yang dibolehkan $1",
        "htmlform-date-toohigh": "Nilai yang Anda masukkan adalah setelah tanggal paling akhir  yang dibolehkan $1",
        "htmlform-time-toolow": "Nilai yang Anda tentukan adalah sebelum waktu paling dini yang dibolehkan $1",
        "htmlform-time-toohigh": "Nilai yang Anda tentukan adalah setelah waktu paling baru yang dibolehkan $1",
+       "htmlform-datetime-toolow": "Nilai yang Anda tentukan berada sebelum tanggal dan waktu paling awal yang diperbolehkan $1",
+       "htmlform-datetime-toohigh": "Nilai yang Anda masukan telah terlewati setelah tanggal dan waktu terakhir yang diperbolehkan $1.",
        "htmlform-title-badnamespace": "[[:$1]] tidak berada dalam ruang nama \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" bukan merupakan judul halaman yang dapat dibuat",
        "htmlform-title-not-exists": "$1 tidak ada.",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|memperbarui}} tag pada entri log $5 dari halaman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menghapus}} $8)",
        "rightsnone": "(tidak ada)",
        "revdelete-summary": "ringkasan",
+       "rightslogentry-temporary-group": "$1 (sementara, hingga $2)",
        "feedback-adding": "Menambahkan umpan balik ke halaman...",
        "feedback-back": "Kembali",
        "feedback-bugcheck": "Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].",
        "feedback-useragent": "Agen pengguna:",
        "searchsuggest-search": "Cari {{SITENAME}}",
        "searchsuggest-containing": "berisi...",
-       "api-error-autoblocked": "Alamat IP Anda telah diblokir secara otomatis, karena sebelumnya digunakan oleh pengguna yang diblokir.",
-       "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
-       "api-error-blocked": "Anda telah diblokir dari penyuntingan.",
-       "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
-       "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain|berkas lain}} dengan isi yang sama di situs ini.",
-       "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas lain|berkas lain}} di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
-       "api-error-empty-file": "Berkas yang Anda kirim kosong.",
        "api-error-emptypage": "Pembuatan halaman baru yang kosong tidak diizinkan.",
-       "api-error-fetchfileerror": "Kesalahan internal: terjadi kesalahan saat memperoleh berkas ini.",
-       "api-error-fileexists-forbidden": "Berkas dengan nama \"$1\" sudah ada dan tidak bisa ditimpa.",
-       "api-error-fileexists-shared-forbidden": "Berkas dengan nama \"$1\" sudah ada di penyimpanan file berbagi dan tidak bisa ditimpa.",
-       "api-error-file-too-large": "Berkas yang Anda kirim terlalu besar.",
-       "api-error-filename-tooshort": "Nama berkas terlalu pendek.",
-       "api-error-filetype-banned": "Jenis berkas ini dilarang.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|bukan ekstensi berkas yang diizinkan|bukan ekstensi berkas yang diizinkan}}. {{PLURAL:$3|Jenis berkas yang diizinkan adalah|Jenis berkas yang diizinkan adalah}} $2.",
-       "api-error-filetype-missing": "Berkas tidak memiliki ekstensi.",
-       "api-error-hookaborted": "Modifikasi yang Anda coba lakukan dibatalkan oleh suatu kaitan ekstensi.",
-       "api-error-http": "Kesalahan internal: tidak dapat menghubungkan ke peladen.",
-       "api-error-illegal-filename": "Nama berkas tidak diperbolehkan.",
-       "api-error-internal-error": "Kesalahan internal: terjadi masalah saat memproses unggahan Anda ke wiki ini.",
-       "api-error-invalid-file-key": "Kesalahan internal: berkas tidak ditemukan di penyimpanan sementara.",
-       "api-error-missingparam": "Kesalahan internal: parameter permintaan hilang.",
-       "api-error-missingresult": "Kesalahan internal: tidak dapat menentukan apakah penyalinan berhasil.",
-       "api-error-mustbeloggedin": "Anda harus masuk log untuk mengunggah berkas.",
-       "api-error-mustbeposted": "Ada bug dalam perangkat lunak ini; tidak menggunakan metode HTTP yang tepat.",
-       "api-error-noimageinfo": "Pengunggahan berhasil, tetapi peladen tidak memberikan informasi apa pun tentang berkas.",
-       "api-error-nomodule": "Kesalahan internal: tidak ada modul unggahan yang ditetapkan.",
-       "api-error-ok-but-empty": "Kesalahan internal: tidak ada tanggapan dari peladen.",
-       "api-error-overwrite": "Tidak diizinkan untuk menimpa berkas yang sudah ada.",
-       "api-error-ratelimited": "Anda mencoba untuk mengunggah berkas dalam jeda waktu yang lebih singkat yang diperbolehkan oleh wiki ini. Silakan ulangi kembali dalam beberapa menit.",
-       "api-error-stashfailed": "Kesalahan internal: server gagal menyimpan berkas sementara.",
        "api-error-publishfailed": "Kesalahan internal: server gagal menyimpan berkas sementara.",
-       "api-error-stasherror": "Terjadi kesalahan saat mengunggah berkas ke penyimpanan.",
-       "api-error-stashedfilenotfound": "Berkas yang disimpan tidak ditemukan ketika mencoba untuk mengunggahnya dari penyimpanan.",
-       "api-error-stashpathinvalid": "Lokasi tempat berkas disimpan yang seharusnya ditemukan tidak sah.",
-       "api-error-stashfilestorage": "Terjadi galat ketika menyimpan berkas ke dalam penyimpanan.",
-       "api-error-stashzerolength": "Peladen tidak dapat menyimpan berkas ini, karena ukuran berkas itu adalah nihil.",
-       "api-error-stashnotloggedin": "Anda harus masuk log untuk menyimpan berkas ke dalam penyimpanan unggahan.",
-       "api-error-stashwrongowner": "Berkas yang Anda coba untuk akses dalam penyimpanan itu bukan milik Anda.",
-       "api-error-stashnosuchfilekey": "Berkas yang Anda coba akses dalam penyimpanan itu tidak ada.",
-       "api-error-timeout": "Peladen tidak merespons dalam waktu yang diharapkan.",
-       "api-error-unclassified": "Terjadi galat yang tidak diketahui",
-       "api-error-unknown-code": "Kesalahan tidak dikenal: \"$1\"",
-       "api-error-unknown-error": "Kesalahan internal: terjadi kesalahan saat mencoba mengunggah berkas Anda.",
+       "api-error-stashfailed": "Kesalahan internal: server gagal menyimpan berkas sementara.",
        "api-error-unknown-warning": "Peringatan tidak dikenal: $1",
        "api-error-unknownerror": "Kesalahan tidak dikenal: \"$1\"",
-       "api-error-uploaddisabled": "Pengunggahan dinonaktifkan di wiki ini.",
-       "api-error-verification-error": "Berkas ini mungkin rusak atau memiliki ekstensi yang salah.",
-       "api-error-was-deleted": "Sebuah berkas dengan nama ini sudah diunggah sebelumnya lalu dihapus.",
        "duration-seconds": "$1 {{PLURAL:$1|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam}}",
        "pagelang-language": "Bahasa",
        "pagelang-use-default": "Gunakan bahasa baku",
        "pagelang-select-lang": "Pilih bahasa",
+       "pagelang-reason": "Alasan",
        "pagelang-submit": "Kirim",
+       "pagelang-nonexistent-page": "Halaman $1 tidak tersedia",
+       "pagelang-unchanged-language": "Halaman $1 telah di atur ke bahasa $2",
+       "pagelang-unchanged-language-default": "Halaman $1 Telah diatur ke bahasa konten bawaan.",
+       "pagelang-db-failed": "Basis data gagal mengubah bahasa halaman",
        "right-pagelang": "Ubah bahasa halaman",
        "action-pagelang": "mengubah bahasa halaman",
        "log-name-pagelang": "Log perubahan bahasa",
        "mw-widgets-titleinput-description-new-page": "halaman belum ada",
        "mw-widgets-titleinput-description-redirect": "mengalihkan ke $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Tambah sebuah kategori...",
+       "mw-widgets-usersmultiselect-placeholder": "Tambahkan lebih banyak...",
        "sessionmanager-tie": "Tidak dapat menggabungkan banyak jenis otentikasi permintaan: $1.",
        "sessionprovider-generic": "sesi $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesi berdasarkan kuki",
        "sessionprovider-nocookies": "Kuki mungkin dimatikan. Pastikan Anda telah mengaktifkan kuki dan coba mulai kembali.",
        "randomrootpage": "Halaman dasar sembarang",
        "log-action-filter-block": "Jenis pemblokiran:",
-       "log-action-filter-contentmodel": "Jenis modifikasi modelkonten:",
+       "log-action-filter-contentmodel": "Jenis perubahan modelkonten:",
        "log-action-filter-delete": "Jenis penghapusan:",
        "log-action-filter-import": "Jenis impor:",
        "log-action-filter-managetags": "Jenis tindakan manajemen tag:",
        "authmanager-link-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk menautkan akun.",
        "authmanager-link-not-in-progress": "Penautan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
        "authmanager-authplugin-setpass-failed-title": "Penggantian kata sandi gagal",
+       "authmanager-authplugin-setpass-failed-message": "Plugin autentikasi mencegah pengubahan pasword.",
+       "authmanager-authplugin-create-fail": "Plugin autentikasi mencegah pembuatan akun.",
+       "authmanager-authplugin-setpass-denied": "Plugin autentikasi tidak memperbolehkan mengubah kata kunci.",
        "authmanager-authplugin-setpass-bad-domain": "Domain tidak sah.",
        "authmanager-autocreate-noperm": "Pembuatan akun otomatis tidak diizinkan.",
        "authmanager-autocreate-exception": "Pembuatan akun otomatis dimatikan sementara karena galat sebelumnya.",
index 7d61ad6..476af2b 100644 (file)
@@ -21,6 +21,7 @@
        "tog-hideminor": "Ocultar redactiones minori in nov changes",
        "tog-hidepatrolled": "Ocultar redactiones vigilat in nov changes",
        "tog-newpageshidepatrolled": "Ocultar págines vigilat de liste de nov págines",
+       "tog-hidecategorization": "Ocultar li categorisation de págines",
        "tog-extendwatchlist": "Expander li liste de vigilantie a omni changes, ne solmen li max nov",
        "tog-usenewrc": "Ordinar changes in «Recent changes» e li liste de vigila secun págines",
        "tog-numberheadings": "Auto-numerar rublicas",
@@ -41,7 +42,7 @@
        "tog-shownumberswatching": "Monstrar li númere de usatores vigilant",
        "tog-oldsig": "Existent subscrition:",
        "tog-fancysig": "Tractar signature quam textu wiki (sin un catenun auto-crate)",
-       "tog-uselivepreview": "Strax monstrar prevision (experimental)",
+       "tog-uselivepreview": "Strax monstrar prevision",
        "tog-forceeditsummary": "Suggester me quande intrar un redaction che summarium in blanc",
        "tog-watchlisthideown": "Ocultar mi redactiones del liste de págines vigilat",
        "tog-watchlisthidebots": "Ocultar redactiones de machine del liste de págines vigilat",
        "morenotlisted": "Ti liste ne es complet.",
        "mypage": "Págine",
        "mytalk": "Conversation",
-       "anontalk": "Discussion por ti ci IP",
+       "anontalk": "Discussion",
        "navigation": "Navigation",
        "and": "&#32;e",
        "qbfind": "Constatar",
        "viewsource": "Vider fonte",
        "viewsource-title": "Vider li fonte de «$1»",
        "viewsourcetext": "Vu posse vider e copiar li contenete de ti págine.",
+       "ns-specialprotected": "Li special págines on ne posse redacter.",
        "titleprotected": "Ti titul ha esset gardat de creation per [[User:$1|$1]]. \nLi motive dat es <em>$2</em>.",
        "virus-badscanner": "Configuration maliciosi: virus desconosset examinat: ''$1''",
        "virus-scanfailed": "scandesion fallit (code $1)",
        "welcomeuser": "Benevenit, $1!",
        "yourname": "Nómine de usator:",
        "userlogin-yourname": "Nómine de usator",
+       "userlogin-yourname-ph": "Vor nómine de usator",
+       "createacct-another-username-ph": "Nómine del usator",
        "yourpassword": "Parol-clave:",
        "yourpasswordagain": "Parol-clave denov:",
        "userlogin-signwithsecure": "Usar un secur conexion",
        "yourdomainname": "Tui dominia:",
        "login": "Aperter session",
+       "login-security": "Verifica vor identitá",
        "nav-login-createaccount": "Crear un conto o intrar",
        "userlogin": "Crear un conto o intrar",
        "userloginnocreate": "Intrar",
        "gotaccount": "Ja have un conto? $1.",
        "gotaccountlink": "Intrar",
        "userlogin-resetlink": "Obliviat tui detallies de registre?",
+       "createacct-reason": "Motive",
        "createacct-benefit-body1": "{{PLURAL:$1|redaction|redactiones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|págine|págines}}",
        "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributores}}",
        "userexists": "Nómine de usator ja in usu.\nPleser opta por un nómine diferent.",
        "loginerror": "Erra in initiation del session",
        "nocookieslogin": "{{SITENAME}} utilisa cookies por far intrar usatores. Vu nu ne permisse cookies. Ples permisser les e provar denov.",
-       "loginsuccesstitle": "Apertion de session successosi",
+       "loginsuccesstitle": "Session es apertet",
        "loginsuccess": "Vu ha apertet vor session in {{SITENAME}} quam \"$1\".",
+       "nosuchuser": "Li usator con nómine «$1» ne existe.\nLi nómines de usator distinte minuscules e majuscules.\nControla li ortografia o [[Special:CreateAccount|crea un nov conto]].",
+       "login-userblocked": "Li usator es blocat. Es impossibil aperter un session.",
        "wrongpassword": "Parol-clave íncorect inscrit.\nPleser prova denov.",
        "wrongpasswordempty": "Parol-clave inscrit esset nud.\nPleser prova denov.",
        "mailmypassword": "Re-initialisar li passaparol",
        "throttled-mailpassword": "Un parol-clave amemora ha ja esset inviat, intra li ultim {{PLURAL:$1|hor|$1 hores}}.\nPor preventer misusa, solmen un parol-clave amemora va esser inviat per {{PLURAL:$1|hor|$1 hores}}.",
        "acct_creation_throttle_hit": "Vu ja ha creat $1 contos. Vu ne posse crear pli mult quam to.",
+       "createaccount-title": "Creation de conto por {{SITENAME}}",
        "loginlanguagelabel": "Lingue: $1",
        "suspicious-userlogout": "Tui petition por surtir esset desaprobat pro que probabilmen esset inviat per un navigator ruptet o servitor de autorisation che caching.",
        "pt-login-button": "Aperter session",
        "botpasswords-label-update": "Actualisar",
        "botpasswords-label-cancel": "Anullar",
        "botpasswords-label-delete": "Deleter",
-       "passwordreset-username": "Vor nómine usatori",
+       "resetpass-submit-cancel": "Anullar",
+       "passwordreset-username": "Nómine de usator:",
+       "changeemail-none": "(null)",
+       "resettokens-token-label": "$1 (valor actual: $2)",
        "bold_sample": "Nigri textu",
        "bold_tip": "Nigri textu",
        "italic_sample": "Cursiv textu",
        "sig_tip": "Tui subscrit con hor e date",
        "hr_tip": "Horizontal linea (ples usar sin excess)",
        "summary": "Resummation:",
-       "subject": "Tema/Division:",
+       "subject": "Tema:",
        "minoredit": "To es un bagatellic change",
        "watchthis": "Vigilar ti págine",
        "savearticle": "Conservar págine",
        "showpreview": "Monstrar prevision",
        "showdiff": "Monstrar changes",
        "anoneditwarning": "'''Advertiment:''' Vu ne esser registrat.\nTui adresse de IP va esser registrat in historico de redactiones de ti págine.",
+       "missingcommenttext": "Ples intrar un comenta in infra.",
        "summary-preview": "Prevision de summarium:",
        "subject-preview": "Prevision de Tema/Division:",
        "whitelistedittext": "Vu have que $1 por redacter págines.",
        "creating": "Creation de «$1»",
        "editingsection": "Redactent $1 (division)",
        "editingcomment": "Redactent $1 (nov division)",
+       "editconflict": "Conflicte de redaction: $1",
        "yourtext": "Tui textu",
        "storedversion": "Version acumulat",
        "yourdiff": "Diferenties",
        "permissionserrorstext-withaction": "Vu ne have permission por $2, por li sequent {{PLURAL:$1|motive|motives}}:",
        "recreate-moveddeleted-warn": "'''Advertiment: Vu es recreant un págine que esset anteriorimen deletet.'''\n\nVu deve considerar ca it es convenent por continuar redactant ti págine.\nLi deletion e diarium de movement por li págine es sub li condition ci por convenience:",
        "moveddeleted-notice": "Ti págine ha esset deletet.\nLi deletion e diarium de movement por li págine es sub li condition in infra por referentie.",
+       "postedit-confirmation-created": "Li págine ha esset creat.",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Vacui objecte",
        "post-expand-template-inclusion-warning": "'''Advertiment:''' Li grandore del includet shablones es tro grand. Alcun shablones ne posse esser includet.",
        "post-expand-template-inclusion-category": "Págines, in queles li maximal grandore del includet shablones es excedet",
        "post-expand-template-argument-warning": "'''Advertiment:''' Ti págine contene in un minim argumente de avise quel ha un anc mensura de expansion grand.\nTis argumentes have esset omisset.",
        "currentrev": "Ultim revision",
        "currentrev-asof": "Actual version de $2, clocca $3",
        "revisionasof": "Revision de $1",
-       "revision-info": "Revision de $1, fabricat de $2:$7",
+       "revision-info": "Revision de $1, fat de $2:$7",
        "previousrevision": "← Anteyan version",
        "nextrevision": "Revision sequent →",
        "currentrevisionlink": "Ultim revision",
        "histlegend": "Diferenties de selection: marca li buxes de radio de li revisiones por comparar e batte \"intrar\" o li buton in li funde.<br />\nLegende: '''({{int:cur}})''' = diferenties che ultim revision, '''({{int:last}})''' = diferenties que antecede li revision, '''{{int:minoreditletter}}''' = redaction minori.",
        "history-fieldset-title": "Historie de navigation",
        "history-show-deleted": "Deletet solmen",
-       "histfirst": "max veľi",
+       "histfirst": "max antiqui",
        "histlast": "max nov",
        "history-feed-item-nocomment": "$1 in $2",
        "rev-delundel": "monstrar/ocultar",
+       "rev-showdeleted": "monstrar",
        "revdelete-show-file-submit": "Yes",
        "revdel-restore": "changer visibilitá",
        "revdelete-offender": "Autor del version:",
        "recentchanges-label-unpatrolled": "Ti redaction ne have ancor esset protectet",
        "recentchanges-legend-heading": "<strong>Legende:</strong>",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filtergroup-registration": "Registration de usatores",
        "rcfilters-filter-registered-label": "Registrat",
-       "rcnotefrom": "In infra es li changes desde '''$2''' (ad-supra por '''$1''' monstrat).",
+       "rcnotefrom": "In infra es li {{PLURAL:$5|modification|modificationes}} desde <strong>$4 $3</strong> (til <strong>$1</strong> es monstrat).",
        "rclistfrom": "Monstrar li nov modificationes desde $3 $2",
        "rcshowhideminor": "$1 redactiones minori",
        "rcshowhideminor-show": "Monstrar",
        "upload": "Cargar file",
        "uploadbtn": "Cargar file",
        "uploadnologin": "Vu ne ha intrat",
-       "uploadnologintext": "Vu deve esser [[Special:UserLogin|registrat]] por cargar files.",
+       "uploadnologintext": "Ples $1 por cargar files.",
        "uploaderror": "Errore de cargament",
        "uploadtext": "Usa li forme infra por cargar files.\nPor vider o serchar files cargat anteriorimen ear por li [[Special:FileList|liste de files cargat]], (re)cargamentes es anc registrat in li [[Special:Log/upload|diarium de cargament]], deletiones in li [[Special:Log/delete|diarium de deletion]].\n\nPor includer un file in un págine, usa un catenun in un de sequent formes:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' por usar li version complet de li file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' por usar un rendition larg de 200 pixel in un buxe in li márgine levul che 'alt text' quam descrition\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' por ligar inmediatmen por li file sin monstrar li file",
        "upload-permitted": "Tipes de file permisset: $1.",
        "wlheader-showupdated": "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
        "wlnote": "Infra {{PLURAL:$1|es li ultim change|es li ultim '''$1''' changes}} in li ultim {{PLURAL:$2|hor|'''$2''' hores}}.",
        "wlshowlast": "Monstra ultim $1 hores $2 dies",
+       "wlshowhidecategorization": "categorisation de págines",
        "watchlist-options": "Optiones de liste de págines vigilat",
        "watching": "Vigilant...",
        "unwatching": "Desvigilant...",
        "tooltip-ca-nstab-main": "Vider li articul",
        "tooltip-ca-nstab-user": "Vider li págine de usator",
        "tooltip-ca-nstab-media": "Vider li págine de media",
-       "tooltip-ca-nstab-special": "Ti es un págine special, on ne posse redacter it",
+       "tooltip-ca-nstab-special": "To es un págine special, on ne posse redacter it",
        "tooltip-ca-nstab-project": "Vider li págine de projecte",
        "tooltip-ca-nstab-image": "Vider li págine de figura",
        "tooltip-ca-nstab-mediawiki": "Vider li missage de sistema",
        "exif-model": "Modelle del cámera",
        "exif-exifversion": "Version de Exif",
        "exif-colorspace": "Spacie del colores",
+       "exif-iimcategory": "Categorie",
        "exif-orientation-1": "Normal",
        "namespacesall": "omni",
        "monthsall": "omni",
        "table_pager_limit_label": "Detallies por págine",
        "table_pager_limit_submit": "Ear",
        "table_pager_empty": "Nequant resultates",
+       "autosumm-new": "Creat págine contenente «$1»",
        "watchlistedit-normal-title": "Redacter liste de págines vigilat",
        "watchlistedit-normal-legend": "Remove titules del liste de págines vigilat",
        "watchlistedit-normal-explain": "Titules in tui liste de págines vigilat es monstrat infra.\nPor remover un titul, controla li buxe proxim por it, e clacca \"{{int:Watchlistedit-normal-submit}}\".\nVu posse anc [[Special:EditWatchlist/raw|redacter li liste vulnerosi]].",
        "version-hook-name": "Nómine de croc",
        "version-hook-subscribedby": "Subscrit per",
        "version-version": "($1)",
-       "version-license": "Licentie",
+       "version-license": "Licentie MediaWiki",
        "version-software": "Software installat",
        "version-software-product": "Producte",
        "version-software-version": "Version",
        "specialpages-group-highuse": "Págines de alt usu",
        "specialpages-group-pages": "Listes de págines",
        "specialpages-group-pagetools": "Utensiles de págine",
-       "specialpages-group-wiki": "Data wiki e utensiles",
+       "specialpages-group-wiki": "Data e utensiles",
        "specialpages-group-redirects": "Redirectionant págines special",
        "specialpages-group-spam": "Utensiles de spam",
        "external_image_whitelist": "#Abandonar ti linea exactmen quam it es<pre>\n#Colocar fragmentes de expression regulari (precismen li parte que ea inter li //) in infra\n#Tis va esser egalat che li URLes de figuras extern (hotlinked)\n#Tis que egala va esser monstrat quam figuras, altrimen solmen un catenun por li figura va esser monstrat\n#Lineas comensant che # es tractat quam comentaries\n#Ti es casu-ínsensitiv\n\n#Colocar omni fragmentes regulari súper ti linea. Abandonar ti linea exactmen quam it es</pre>",
        "logentry-delete-delete": "$1 ha removet li págine $3",
        "logentry-move-move": "$1 ha movet li págine $3 a $4",
        "logentry-newusers-create": "Conto de usator $1 ha esset creat",
-       "logentry-upload-upload": "$1 ha cargat $3",
+       "logentry-upload-upload": "$1 ha {{GENDER:$2|cargat}} $3",
        "rightsnone": "(null)",
        "searchsuggest-search": "Serchar {{SITENAME}}"
 }
index 904956e..e8f90af 100644 (file)
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Kitaen ti nagbanagan nga esurat?",
-       "passwordreset-capture-help": "No markaam daytoy a kahon, ti esurat (nga adda ti temporario a kontrasenias) ket maipakitanto kenka ken maipatulodto iti agar-aramat.",
        "passwordreset-email": "Esurat a pagtaengan:",
        "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-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.",
-       "passwordreset-emailsent-capture2": "Naipatulodan {{PLURAL:$1|ti esurat|dagiti esurat}} ti panangisaad manen ti kontrasenias. Ti {{PLURAL:$1|nagan ti agar-aramat ken kontrasenias|listaan dagiti nagan ti agar-aramat ken dagiti kontrasenias}} ket naipakita dita baba.",
-       "passwordreset-emailerror-capture2": "Napaay ti panangitulod ti usurat iti {{GENDER:$2|agar-aramat}}: $1 Ti {{PLURAL:$3|nagan ti agar-aramat ken kontrasenias|listaan dagiti agar-aramat ken dagiti kontrasenias}} ket naipakita dita baba.",
        "passwordreset-nocaller": "Nasken a maited ti maysa nga agtawtawag",
        "passwordreset-nosuchcaller": "Awan ti agtawtawag: $1",
        "passwordreset-ignored": "Saan a natengngel ti panangisaad manen ti kontrasenias. Mabalin a saan a nakompigura ti mangited?",
        "saveprefs": "Idulin",
        "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a seksion)",
        "prefs-editing": "Ur-urnosen",
-       "rows": "Ar-aray:",
-       "columns": "Dagiti batong:",
        "searchresultshead": "Biruken",
        "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
        "stub-threshold-sample-link": "wadan",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "Awan ti pammalubosmo nga agurnos ti karbengan ti agar-aramat kadagiti sabali a wiki.",
        "userrights-nodatabase": "Awan ti database a $1 wenno saan a lokal.",
-       "userrights-nologin": "Masapul a [[Special:UserLogin|sumrekka]] nga addaan iti pakabilangan ti administrador tapno makaited kadagiti karbengan ti agar-aramat.",
-       "userrights-notallowed": "Awan ti pammalubos nga agnayon wenno agikkat kadagiti karbengan ti agar-aramat.",
        "userrights-changeable-col": "Dagiti grupo a mabalinmo a baliwan",
        "userrights-unchangeable-col": "Dagiti grupo a dimo mabalin a baliwan",
        "userrights-conflict": "Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.",
-       "userrights-removed-self": "Inikkatmo kadagiti bukodmo a karbengan. Iti kastoyen, saankan a mabalin a mangserrek iti daytoy a panid.",
        "group": "Grupo:",
        "group-user": "Dagiti agar-aramat",
        "group-autoconfirmed": "Dagiti automatiko a napasingkedan nga agar-aramat",
        "right-siteadmin": "Mangikandado ken manglukat iti database",
        "right-override-export-depth": "Agipan kadagiti panid a mairaman dagiti naisilpo a panid agingana iti kauneg ti 5",
        "right-sendemail": "Agipatulod iti esurat kadagiti sabali nga agar-aramat",
-       "right-passwordreset": "Agkita kadagiti esurat ti panangisaad manen ti kontrasenias",
        "right-managechangetags": "Agpartuat ken (de)aktibuen [[Special:Tags|etiketa]]",
        "right-applychangetags": "Ipakat dagiti [[Special:Tags|etiketa]] a mairaman dagiti nabaliwan",
        "right-changetags": "Agnayon ken agikkat kadagiti arbitario nga [[Special:Tags|etiketa]] kadagiti agmaymaysa a rebision ken dagiti naikabkabil iti listaan",
        "uploaded-setting-handler-svg": "Naserraan ti SVG a nangisaad ti gupit ti \"handler\" nga addaan iti remote/data/script. Nabirukan ti <code>$1=\"$2\"</code> iti naikarga a papeles ti SVG.",
        "uploaded-remote-url-svg": "Naserraan ti SVG a nangisaad ti gupit iti ania man nga estilo nga addaan iti remote nga URL. Nabirukan ti <code>$1=\"$2\"</code> iti naikarga a papeles ti SVG.",
        "uploaded-image-filter-svg": "Nakabiruk ti sagat ti ladawan nga addaan iti URL: <code>&lt;$1 $2=\"$3\"&gt;</code> iti naikarga a papeles ti SVG.",
-       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon iti maysa a saan a mabalin a nagan ti espasio ti \"$1\".",
+       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon iti maysa a saan a mabalin a nagan ti espasio ti \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Ti XML iti naikarga a papeles ket saan a maiwaswas.",
        "uploadvirus": "Ti papeles ket aglaon ti birus! \nDagiti salaysay: $1",
        "uploadjava": "Daytoy a papeles ket papeles ti ZIP nga aglaon ti Java .a klase ti papeles.\nTi panangikarga ti papales ti Java ket saan a maipalubos gapu ta makapataudda a manglabas kadagiti panangigawid ti seguridad.",
        "feedback-useragent": "Ahente ti agar-aramat:",
        "searchsuggest-search": "Biruken",
        "searchsuggest-containing": "naglaon ti...",
-       "api-error-autoblocked": "Automatiko a naserraan ti IP nga adresmo, gapu ta inusar babaen ti naseraan nga agar-aramat.",
-       "api-error-badaccess-groups": "Saanka mapalubosan nga agikarga kadagiti papeles iti daytoy a wiki.",
        "api-error-badtoken": "Akin-uneg a biddut: Dakes a tandaan.",
-       "api-error-blocked": "Naserraankan manipud iti panagurnos.",
-       "api-error-copyuploaddisabled": "Ti panagikarga babaen ti URL ket nabaldado iti daytoy server.",
-       "api-error-duplicate": "Adda {{PLURAL:$1|sabali a papeles|dagiti sabali a papeles}} nga addan iti daytoy a sitio nga agraman iti agpada a linaon.",
-       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi sabali a papeles|dagidi sabali a papeles}} nga addaan ditoy a sitio nga agpada ti linaonda, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.",
-       "api-error-empty-file": "Ti papeles nga intedmo ket awan linaon.",
        "api-error-emptypage": "Agparprtuat ti baro, dagiti awan ti linaon a panid ket saan a maipalubos.",
-       "api-error-fetchfileerror": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat nga agal-ala ti papeles.",
-       "api-error-fileexists-forbidden": "Ti papeles nga agnagan ti \"$1\" ket addan, ken saan a mabalin a masuratan manen.",
-       "api-error-fileexists-shared-forbidden": "Ti papeles nga agnagan ti \"$1\" ket adda idiay pagbibingayan a repositorio ti papeles, ken saan a mabalin a masuratan manen.",
-       "api-error-file-too-large": "Ti papeles nga intedmo ket dakkel unay.",
-       "api-error-filename-tooshort": "Ti nagan daytoy a papeles ket bassit unay.",
-       "api-error-filetype-banned": "Ti kita daytoy a papeles ket maiparit.",
-       "api-error-filetype-banned-type": "Ti $1 {{PLURAL:$4|ket saan a mapalubosan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubosan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.",
-       "api-error-filetype-missing": "Ti papeles ket awan ti maysa a pagpaatiddog.",
-       "api-error-hookaborted": "Ti panagbabaro a pinadasmo ket pinasardeng babaen ti maysa a pagpaatiddog.",
-       "api-error-http": "Akin-uneg a biddut: Saan a makaikabit iti server.",
-       "api-error-illegal-filename": "Ti nagan daytoy a papeles ket saan a maipalubos.",
-       "api-error-internal-error": "Akin-uneg a biddut: Addaan ti dakes a napasamak iti panagproseso ti inkargam iti daytoy a wiki.",
-       "api-error-invalid-file-key": "Akin-uneg a biddut: Saan a nabirukan ti papeles idiay temporario a nagidulinan.",
-       "api-error-missingparam": "Akin-uneg a biddut: Awan dagiti parametro iti kiddaw.",
-       "api-error-missingresult": "Akin-uneg a biddut: Saan a naikeddeng no ti kopia ket nagballigi.",
-       "api-error-mustbeloggedin": "Masapul a nakastrekka tapno makaikarga kadagiti papeles.",
-       "api-error-mustbeposted": "Akin-uneg a biddut: Ti kiddaw ket masapul ti HTTP POST.",
-       "api-error-noimageinfo": "Balligi ti panagikarga, ngem ti server ket saan a nagited kadakami ti aniaman a pakaammo a maipanggep iti daytoy a papeles.",
-       "api-error-nomodule": "Akin-uneg a biddut: Awan ti naisad a modulo ti panagikarga.",
-       "api-error-ok-but-empty": "Akin-uneg a biddut: Awan ti sungbat manipud iti server.",
-       "api-error-overwrite": "Saan a maipalubos a suratan manen iti papeles nga addan.",
-       "api-error-stashfailed": "Akin-uneg a biddut: Napaay ti server nga agidulin ti temporario a papeles.",
        "api-error-publishfailed": "Akin-uneg a biddut: Napaay ti server nga agipablaak ti temporario a papeles.",
-       "api-error-stasherror": "Adda maysa a biddut bayat nga agikarkarga ti papeles iti stash.",
-       "api-error-timeout": "Saan a simmungbat ti server iti nanamnama nga oras.",
-       "api-error-unclassified": "Adda rimsua a di ammo a biddut.",
-       "api-error-unknown-code": "Di ammo a biddut: \"$1\".",
-       "api-error-unknown-error": "Akin-uneg a biddut: Addaan ti dakes a napasamak bayat idi nagipadaska nga agikarga iti papelesmo.",
+       "api-error-stashfailed": "Akin-uneg a biddut: Napaay ti server nga agidulin ti temporario a papeles.",
        "api-error-unknown-warning": "Di ammo a ballaag: \"$1\".",
        "api-error-unknownerror": "Di ammo a biddut: \"$1\".",
-       "api-error-uploaddisabled": "Nabaldado ti panagikarga iti daytoy a wiki.",
-       "api-error-verification-error": "Mabalin a dakes daytoy a papeles, wenno addaan iti madi a pagpaatiddog.",
        "duration-seconds": "$1 a {{PLURAL:$1|segundo|segsegundo}}",
        "duration-minutes": "$1 a {{PLURAL:$1|minuto|minminuto}}",
        "duration-hours": "$1 nga {{PLURAL:$1|oras|or-oras}}",
index 6990ca0..7c5bc69 100644 (file)
@@ -38,7 +38,7 @@
        "tog-enotifminoredits": "ОагIонашта а файлашта даь хувцамаш геттара зIамига дале а хоам бе сога",
        "tog-enotifrevealaddr": "ДIахайта хоамбараш чу бIаргадейта са почта адрес",
        "tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
-       "tog-oldsig": "ХIанзара яздаь кулг:",
+       "tog-oldsig": "Хьа карара кулг яздар:",
        "tog-fancysig": "Кулг яздара ший йола вики-разметка (автоматически тIахьожаярг йоацаш)",
        "tog-uselivepreview": "Пайда эца сиха дола хьалххе бIаргтохар",
        "tog-forceeditsummary": "ДIахьалхадаккха, нагахьа санна хувцама йоазонца сурт оттадара моттиг хьалъйизанза яле",
        "category-file-count-limited": "Укх категори чу {{PLURAL:$1|$1 файл|$1 файлаш|1=цаI мара файл яц}}.",
        "listingcontinuesabbrev": "(дIахо)",
        "index-category": "Индекс оттаеш оагIонаш",
-       "noindex-category": "Индекс ца оттаеш оагIонаш",
+       "noindex-category": "Индекс оттайинза оагIонаш",
        "broken-file-category": "Файла тIахьожаяргаш болхбеш йоаца оагIонаш",
        "about": "Сурт оттадар",
        "article": "Статья",
        "newwindow": "&nbsp;(керда кора чу)",
        "cancel": "Юхадаккха",
        "moredotdotdot": "ДIахо...",
-       "morenotlisted": "Ð\95Ñ\80 Ñ\81пиÑ\81ок Ñ\85Ñ\8cалйиза Ñ\8fÑ\86.",
+       "morenotlisted": "Ð\95Ñ\80 Ñ\85Ñ\8cаÑ\8fзÑ\8fÑ\8cÑ\80 Ñ\85Ñ\8cалйизанза Ñ\85ила Ð¼ÐµÐ³Ð°Ñ\88 Ñ\8f.",
        "mypage": "ОагIув",
        "mytalk": "Дувца оттадар",
        "anontalk": "Дувца оттадар",
        "showpreview": "Хьалххе бIаргтохар",
        "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
-       "summary-preview": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
-       "subject-preview": "Ð\94аÑ\8cкÑ\8aа Ñ\86Iи Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ð¸Ñ\88Ñ\82Ñ\82а:",
+       "summary-preview": "Ð¥Ñ\83вÑ\86ама Ñ\81Ñ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80а Ñ\85Ñ\8cалÑ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
+       "subject-preview": "Теман/коÑ\80Ñ\82баÑ\80а Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
        "blockedtitle": "Доакъашхочун чIега техаб",
        "blockednoreason": "бахьан белгалдаьккха дац",
        "loginreqlink": "довзийта",
        "notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
        "prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
-       "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
+       "prevn-title": "{{PLURAL:$1|ХьалхадоагIа $1 дIаяздар}}",
        "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": "'''Укх вики чу я иштта йола оагӀув «[[:$1]]»'''",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
        "searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
-       "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
+       "search-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалкатегори}}, $3 {{PLURAL:$3|файл}})",
        "search-redirect": "(дIа-хьахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "prefs-signature": "Кулг яздар",
        "prefs-preview": "Хьалххе бIаргтохар",
        "userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
-       "editusergroup": "Ð¥Ñ\83вÑ\86а {{GENDER:$1|доакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} тоабаш",
+       "editusergroup": "Ð\99оÑ\82Ñ\82а Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85ой тоабаш",
        "saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
        "userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
        "userrights-reason": "Бахьан:",
        "recentchanges-label-plusminus": "байташкахь боарам хувцар",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIонашка]])",
-       "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
+       "rcnotefrom": "КIалхагIа {{PLURAL:$5|хувцам белгалбаьккхаб}} <strong>$3, $4</strong> тIера (хьахьекхабац <strong>$1</strong>-л дукхагIа).",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
        "rcshowhideminor-show": "Хьахьокха",
        "newpages": "Керда оагIонаш",
        "move": "ЦIи хувца",
        "movethispage": "ЦIи хувца укх оагIон",
-       "pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
+       "pager-newer-n": "$1 дукхагIа {{PLURAL:$1|керда}}",
        "pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
        "booksources": "Джейнай хьасташ (источники)",
        "booksources-search-legend": "Джейнах лаьца хоам лахар",
        "protect_expiry_old": "Чакхадалара ха — дахáр да.",
        "protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
        "protect-locked-access": "Хьа дагара йоазонга тоъал бокъо яц оагIон лорадара лагIа хувца. '''$1''' оагIон карара оттадараш:",
-       "protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
+       "protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
        "protect-default": "Лорадар доацаш",
        "protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
        "protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
        "unblocklogentry": "чIега баьстаб $1",
        "block-log-flags-nocreate": "дагара йоазонаш кхоллар пурам деннадац",
        "move-page-legend": "ОагIон цIи хувцар",
-       "movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
-       "movepagetalktext": "ТIаÑ\82еÑ\85а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в, Ñ\88ий Ð»Ð¾IамаÑ\85Ñ\8c Ñ\86Iи Ñ\85Ñ\83влÑ\83Ñ\80гÑ\8cÑ\8f, '''еÑ\80 Ð´Ð°Ð³Ð° Ð° Ð´Ð¾Ð°Ñ\86аÑ\80, Ð´Ð¾Ð°Ñ\86а:'''\n\n*Ð\98зза Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð°Ñ\88 Ñ\8fÑ\8cÑ\81Ñ\81а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в Ñ\8f Ðµ\n*Ð\9eаÑ\88 ÐºIалÑ\85аÑ\85Ñ\8c Ð±ÐµÐ»Ð³Ð°Ð»Ð¾ Ð´Ð°Ñ\8cдаÑ\86.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, ÐºÑ\83лги Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алÑ\86а Ð¾Ð°Ð³IÑ\83внаÑ\88 Ð²IаÑ\88агIаÑ\82оÑ\85а  Ðµ Ð´IадеÑ\85Ñ\8cаÑ\8fккÑ\85а Ð´ÐµÐ·Ð° Ñ\88Ñ\83н.",
+       "movepagetext": "КIалха белгаляьча формах пайда ийца Iа оагIон цIи хувцаргья, цун хувцамий тептар кхыйола моттиге оттаярца цхьанна.\nКъаьнарча цIерах хургья кердача цIера дIа-сахьожадар.\nХьа аьттув ба къаьнарча цIера хинна дIа-сахьожадараш ше-ше кердадаккха.\nНагахьа санна Iа из ца дой, дехар ду, [[Special:DoubleRedirects|шолха]]  а [[Special:BrokenRedirects|хеттанза дIа-сахьожадараш]] долаш дий тахка.\nХьо бехктокхаме ва тIахьожаяргаш шоаш тIахьожаде дезача нийса хилар.\n\nТеркам бе, оагIон цIи <strong>хувцалургьйоацалга</strong> нагахьа санна изза мо цIи йола оагIув йолаш яле. Чу хIама доацача оагIонашта е дIа-сахьожадарашта, кхы а цар хувцамий истори йице, из новкъа дац. Из яхилга да, нагахьа Iа харца цIи хувцар даь дале, ше хинна цIи юхадIахувца йиш я, амма бакъда йолаш йола оагIув ца ховш дIаяккха аьттув бац. \n\n<strong>Белгалдоахар:</strong>\nГIоряьннача оагIонай цIи хувцаро тIехдоккхеи цIаьххеи хувцамаш доаладе мега.\nБоккъала, дIахо хье дIавахалехьа, кхета, хила мегаш дар хургдолга.",
+       "movepagetalktext": "Ð\9dагаÑ\85Ñ\8cа Ñ\81анна Iа ÐµÑ\80 Ð¿Ñ\83нкÑ\82 Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aйой, Ñ\86Ñ\83нÑ\86а Ð±Ñ\83взам Ð±Ð¾Ð»Ð° Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¸Ñ\88Ñ\82Ñ\82а Ñ\88е-Ñ\88е Ñ\86Iи Ñ\85ийÑ\86а Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ð¸Ð·Ð·Ð° Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð° Ñ\8fÑ\8cÑ\81Ñ\81а Ð¹Ð¾Ð°Ñ\86а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¹Ð¾Ð»Ð°Ñ\88 Ð¹Ð¸Ñ\86е.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ð¸Ð· Ñ\8dÑ\88аÑ\88 Ð´Ð°Ð»Ðµ, IайÑ\85а Ð¾Ð°Ð³Iон  Ñ\86Iи Ð´IаÑ\85Ñ\83вÑ\86а.",
        "newtitle": "Керда цIи:",
        "move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
        "movepagebtn": "ОагIон цIи хувца",
index 66762ee..1814b46 100644 (file)
        "missingarticle-diff": "(Difero: $1, $2)",
        "internalerror": "Interna eroro",
        "internalerror_info": "Interna eroro: $1",
+       "internalerror-fatal-exception": "Ne-reparebla ecepto \"$1\"",
        "filecopyerror": "Ne povis kopiar l'arkivo \"$1\" a \"$2\".",
        "filerenameerror": "Ne povas rinomizar l'arkivo \"$1\" ad \"$2\".",
        "filedeleteerror": "Onu ne povis efacar l'arkivo \"$1\".",
+       "directorycreateerror": "Ne sucesis krear dosieruyo \"$1\".",
+       "directoryreadonlyerror": "Dosieruyo \"$1\" esas nur-lektebla.",
+       "directorynotreadableerror": "Dosieruyo \"$1\" esas ne-lektebla.",
        "filenotfound": "Onu ne povas trovar la arkivo \"$1\".",
        "unexpected": "Nevartita valoro: \"$1\"=\"$2\".",
        "formerror": "Eroro: Onu ne povis sendar la kontenajo di la formularo",
        "title-invalid-characters": "La demandita pagino-titulo kontenas ne-valida literi: \"$1\".",
        "perfcached": "La sequanta datumi esas kashizita* e li povus ne aktualigesar nuntempe. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "viewsource": "Vidar font-kodo",
+       "actionthrottled": "Agado limitizita",
        "protectedpagetext": "Ta pagino protektesis por preventar redaktadi od altra agi.",
        "viewsourcetext": "Vu povas vidar ed kopiar la fonto-kodexo di ta pagino.",
        "viewyourtext": "Vu darfas vidar e kopiar la fonto di <strong>vua redakti</strong> ad ita pagino.",
        "protectedinterface": "Ita pagino provizas 'interface' texto por la programaro en ita wiki, ed esas protektita por preventar mis-uzo.\nPor introduktar o chanjar tradukaji di la wiki-i, voluntez vizitar [https://translatewiki.net/ translatewiki.net], la projeto qua provizas tradukaji a MediaWiki.",
        "editinginterface": "<strong>Averto:</strong> Vu redaktas pagino qua uzesas por provizar 'interface' texto di la programaro.\nChanji a ta pagino chanjos la aspekto di pagini por altra uzeri di ta wiki.",
        "translateinterface": "Por introduktar o chanjar tradukaji en omna wiki-i, voluntez uzar [https://translatewiki.net/ translatewiki.net], la komuna projeto MediaWiki.",
+       "namespaceprotected": "Vu ne es permisita redaktar pagini en la nomaro <strong>$1</strong>.",
+       "customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
+       "customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
+       "mycustomcssprotected": "Vu ne es permisita redaktar ita CSS pagino.",
+       "mycustomjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino.",
+       "myprivateinfoprotected": "Vu ne es permisita redaktar vua privata informajo.",
+       "mypreferencesprotected": "Vu ne es permisita redaktar vua preferaji.",
        "ns-specialprotected": "On ne povas redaktar speciala pagini.",
+       "titleprotected": "Ita titulo es protektita de kreado da [[User:$1|$1]].\nLa motivo es <em>$2</em>.",
+       "filereadonlyerror": "La dosiero \"$1\" ne es modifikebla nam la depozeyo di dosieri \"$2\" esas nur lektebla.\n\nLa sistem-administrero qua klozis ol ofris ita klarigo: \"$3\".",
+       "invalidtitle-knownnamespace": "Ne-valida titulo kun nomaro \"$2\" e texto \"$3\"",
        "exception-nologin": "Vu ne eniris",
        "exception-nologin-text": "Voluntez enirar konto por acesar la pagino od ago.",
        "exception-nologin-text-manual": "Voluntez $1 por acesar ta pagino od ago.",
        "editingold": "'''EGARDEZ: Vu redaktas anciena versiono di ca pagino.\nSe vu gardus ol, la chanji facita pos ita revizo perdesos.'''",
        "yourdiff": "Diferi",
        "copyrightwarning": "Voluntez memorar ke omna kontributi a {{SITENAME}} esas sub la $2 (Videz $1 por detali).\nSe vu ne deziras ke altri modifikez vua artikli od oli distributesez libere, lore voluntez ne skribar oli hike.<br />\nPublikigante vua skribajo hike, vu asertas ke olu skribesis da vu ipsa o kopiesis de libera fonto.\n'''NE SENDEZ ARTIKLI KUN ''COPYRIGHT'' SEN PERMISO!'''",
-       "protectedpagewarning": "'''AVERTO: Ica pagino esas blokusita, do nur ''sysop''-i povas redaktar olu.'''",
+       "protectedpagewarning": "<strong>Averto: Ica pagino esas protektita por ke nur uzeri kun administero-yuri povas redaktar ol.</strong>\nLa maxim recenta en-registrago provizesas:",
        "templatesused": "{{PLURAL:$1|Shablono|Shabloni}} uzata en ica pagino:",
        "templatesusedpreview": "{{PLURAL:$1|Shablono|Shabloni}} uzata en ica prevido:",
        "templatesusedsection": "{{PLURAL:$1|Shablono|Shabloni}} uzata en ica seciono:",
        "move-page-legend": "Rinomizar pagino",
        "movepagetext": "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.\nLa antea titulo konvertesos a ridirektilo a la nova titulo.\nLa ligili a la antea titulo dil pagino ne chanjesos.\nVoluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].\nVu responsas ke la ligili duros direktante a la pagino korespondanta.\n\nMemorez ke la pagino '''ne''' rinomizesos se ja existus pagino kun la nova titulo, eceptuante ke la pagino esas vakua o ridirektilo sen versionaro.\nIco signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras skribante la nova titulo, ma ne povos riskribar existanta pagino.\n\n'''EGARDEZ!'''\nIca povas esar drastika chanjo e ne-esperinda por populara pagino;\nvoluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
        "movenologintext": "Vu mustas esar registragita uzero ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
-       "newtitle": "A nova titulo:",
+       "newtitle": "Nova titulo:",
        "move-watch": "Surveyar ca pagino",
        "movepagebtn": "Movar pagino",
        "pagemovedsub": "Rinomizita sucese",
        "thumbnail_error": "Ne sucesas krear imajeto: $1",
        "import": "Importacar pagini",
        "import-comment": "Komento:",
-       "importtext": "Voluntez exportacar l' arkivo de la fonto-wiki uzante la utensilo \"Special:Export\", registragar ol a vua disko ed adkargar ol hike.",
+       "importtext": "Voluntez exportacar l' arkivo de la fonto-wikio per [[Special:Export|exportacilo]]. Registragar ol a vua komputero ed adkargar ol hike.",
        "importfailed": "La importaco faliis: $1",
        "importsuccess": "Importaco sucesoza!",
        "tooltip-pt-userpage": "{{GENDER:|Vua uzero}} pagino",
index d4666ed..fcec7be 100644 (file)
        "uploaddisabledtext": "Lokað er fyrir að hlaða inn skrám.",
        "php-uploaddisabledtext": "Innhleðsla skráa er óvirk í PHP.\nAthugaðu file_uploads stillinguna.",
        "uploadscripted": "Þetta skjal inniheldur (X)HTML eða forskriftu sem gæti valdið villum í vöfrum.",
-       "uploadscriptednamespace": "Þessi SVG-skrá inniheldur ógilt nafnrými \"$1\".",
+       "uploadscriptednamespace": "Þessi SVG-skrá inniheldur ógilt nafnrými \"<nowiki>$1</nowiki>\".",
        "uploadvirus": "Skráin inniheldur veiru! Nánari upplýsingar: $1",
        "uploadjava": "Þessi skrá er ZIP skrá sem inniheldur Java .class skráasnið.\nInnhleðsla Java skráa er óheimil, því þær geta farið framhjá öryggiskröfum.",
        "upload-source": "Upprunaleg skrá",
        "fileduplicatesearch-noresults": "Mistókst að finna skrána \"$1\"",
        "specialpages": "Kerfissíður",
        "specialpages-note-top": "Fyrirsögn",
-       "specialpages-note": "* Venjulegar kerfisíður.\n* <span class=\"mw-specialpagerestricted\">Kerfisíður með takmörkuðum aðgangi.</span>",
+       "specialpages-note": "* Venjulegar kerfissíður.\n* <span class=\"mw-specialpagerestricted\">Kerfissíður með takmörkuðum aðgangi.</span>",
        "specialpages-group-maintenance": "Viðhaldsskýrslur",
        "specialpages-group-other": "Aðrar kerfissíður",
        "specialpages-group-login": "Innskrá / Búa til aðgang",
        "specialpages-group-pages": "Listar yfir síður",
        "specialpages-group-pagetools": "Síðuverkfæri",
        "specialpages-group-wiki": "Gögn og tól",
-       "specialpages-group-redirects": "Tilvísaðar kerfisíður",
+       "specialpages-group-redirects": "Tilvísaðar kerfissíður",
        "specialpages-group-spam": "Amasendingasíur",
        "specialpages-group-developer": "Forritaratól",
        "blankpage": "Tóm síða",
index 045b17e..dca3547 100644 (file)
                        "Saracrovetto",
                        "Tosky",
                        "Selven",
-                       "Margherita.mignanelli"
+                       "Margherita.mignanelli",
+                       "Redredsonia"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "policy-url": "Project:Policy",
        "portal": "Portale comunità",
        "portal-url": "Project:Portale comunità",
-       "privacy": "Informazioni sulla privacy",
+       "privacy": "Informativa sulla privacy",
        "privacypage": "Project:Informazioni sulla privacy",
        "badaccess": "Permessi non sufficienti",
        "badaccess-group0": "Non si dispone dei permessi necessari per eseguire l'azione richiesta.",
        "notloggedin": "Accesso non effettuato",
        "userlogin-noaccount": "Non hai ancora effettuato la registrazione?",
        "userlogin-joinproject": "Registrati su {{SITENAME}}",
-       "nologin": "Non hai ancora un accesso? $1.",
+       "nologin": "Non hai un'utenza? $1.",
        "nologinlink": "Registrati",
        "createaccount": "Registrati",
-       "gotaccount": "Hai già un accesso? $1.",
+       "gotaccount": "Hai già un'utenza? $1.",
        "gotaccountlink": "Entra",
        "userlogin-resetlink": "Hai dimenticato i tuoi dati di accesso?",
        "userlogin-resetpassword-link": "Hai dimenticato la password?",
        "selfredirect": "<strong>Attenzione:</strong> stai reindirizzando questa pagina a se stessa.\nPotresti aver indicato la destinazione errata per il redirect, o stai modificando la pagina sbagliata.\nSe fai clic nuovamente su \"{{int:savearticle}}\", il redirect sarà creato comunque.",
        "missingcommenttext": "Inserire un commento qui sotto.",
        "missingcommentheader": "<strong>Attenzione:</strong> non è stato specificato l'oggetto di questo commento. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza.",
-       "summary-preview": "Anteprima dell'oggetto:",
-       "subject-preview": "Anteprima oggetto:",
+       "summary-preview": "Anteprima dell'oggetto della modifica:",
+       "subject-preview": "Anteprima dell'oggetto:",
        "previewerrortext": "Si è verificato un errore durante il tentativo di mostrare l'anteprima delle tue modifiche.",
        "blockedtitle": "Utente bloccato.",
        "blockedtext": "'''Il tuo nome utente o indirizzo IP è stato bloccato.'''\n\nIl blocco è stato imposto da $1. La motivazione del blocco è la seguente: ''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nSe lo si desidera, è possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per discutere del blocco.\n\nSi noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]] o se l'utilizzo di tale funzione è stato bloccato.\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5.\nSi prega di specificare tutti i dettagli precedenti in qualsiasi richiesta di chiarimenti.",
        "post-expand-template-inclusion-warning": "<strong>Attenzione:</strong> la dimensione dei template inclusi è troppo grande.\nAlcuni template non verranno inclusi.",
        "post-expand-template-inclusion-category": "Pagine per le quali la dimensione dei template inclusi supera il limite consentito",
        "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 argomenti mancanti",
+       "post-expand-template-argument-category": "Pagine contenenti template con parametri omessi",
        "parser-template-loop-warning": "Rilevato loop del template: [[$1]]",
        "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)",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultati successivi}}",
        "shown-title": "Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina",
        "viewprevnext": "Vedi ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Sul sito esiste una pagina il cui nome è \"[[:$1]]\"'''",
+       "searchmenu-exists": "<strong>Su questo wiki esiste una pagina il cui nome è \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vedi anche gli altri risultati trovati.}}",
        "searchmenu-new": "<strong>Crea la pagina \"[[:$1]]\" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}",
        "searchprofile-articles": "Pagine di contenuti",
        "searchprofile-images": "Multimedia",
        "search-interwiki-caption": "Progetti fratelli",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
+       "search-interwiki-more-results": "altri risultati",
        "search-relatedarticle": "Risultati correlati",
        "searchrelated": "correlati",
        "searchall": "tutti",
        "editusergroup": "Modifica gruppi utente",
        "editinguser": "Modifica in corso dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Visualizzazione dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modifica gruppi utente",
-       "userrights-viewusergroup": "Visualizza gruppi utente",
+       "userrights-editusergroup": "Modifica gruppi {{GENDER:$1|utente}}",
+       "userrights-viewusergroup": "Visualizza gruppi {{GENDER:$1|utente}}",
        "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).",
+       "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-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-current": "Scade il $1",
        "userrights-expiry-none": "Non ha scadenza",
        "userrights-expiry": "Scadenza:",
+       "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-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
        "group": "Gruppo:",
        "rcfilters-invalid-filter": "Filtro non valido",
        "rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-highlightmenu-title": "Seleziona un colore",
        "rcfilters-filterlist-noresults": "Nessun filtro trovato",
        "rcfilters-filtergroup-registration": "Registrazione utente",
        "rcfilters-filter-registered-label": "Registrato",
        "largefileserver": "Il file supera le dimensioni consentite dalla configurazione del server.",
        "emptyfile": "Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.",
        "windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
-       "fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
+       "fileexists": "Un file con questo nome esiste già, verifica prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
        "filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
        "fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
        "uploaded-setting-handler-svg": "SVG che imposta l'attributo \"handler\" con remote/data/script è bloccato. Trovato <code>$1=\"$2\"</code> nel file SVG caricato.",
        "uploaded-remote-url-svg": "SVG che imposta qualsiasi attributo di stile con URL remoti è bloccato. Trovato <code>$1=\"$2\"</code> nel file SVG caricato.",
        "uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel file in formato SVG caricato.",
-       "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
+       "uploadscriptednamespace": "Questo file SVG contiene un namespace '<nowiki>$1</nowiki>' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "uploadvirus": "Questo file contiene un virus! Dettagli: $1",
        "uploadjava": "Questo file è un file ZIP che contiene un file .class Java.\nCaricare i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
        "editcomment": "L'oggetto della modifica era: <em>$1</em>.",
        "revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]",
        "revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
+       "rollback-success": "Annullate le modifiche di {{GENDER:$3|$1}}; pagina riportata all'ultima versione di {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
        "protect-expiry-indefinite": "infinito",
        "protect-cascade": "Protezione ricorsiva (estende la protezione a tutte le pagine incluse in questa).",
        "protect-cantedit": "Non è possibile modificare i livelli di protezione per la pagina in quanto non si dispone dei permessi necessari per modificare la pagina stessa.",
-       "protect-othertime": "Durata non in elenco:",
-       "protect-othertime-op": "durata non in elenco",
+       "protect-othertime": "Altra durata:",
+       "protect-othertime-op": "altra durata",
        "protect-existing-expiry": "Scadenza attuale: $2, $3",
        "protect-existing-expiry-infinity": "Scadenza attuale: infinito",
        "protect-otherreason": "Altri motivi/dettagli:",
        "ipbemailban": "Impedisci all'utente l'invio di email",
        "ipbenableautoblock": "Blocca automaticamente l'ultimo indirizzo IP usato dall'utente e i successivi con cui vengono tentate modifiche",
        "ipbsubmit": "Blocca l'utente",
-       "ipbother": "Durata non in elenco:",
+       "ipbother": "Altra durata:",
        "ipboptions": "2 ore:2 hours,1 giorno:1 day,3 giorni:3 days,1 settimana:1 week,2 settimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year,infinito:infinite",
        "ipbhidename": "Nascondi il nome utente dalle modifiche e dagli elenchi.",
        "ipbwatchuser": "Segui le pagine e le discussioni utente di questo utente",
index fb0d58c..2c4c3ba 100644 (file)
        "uploaded-setting-handler-svg": "リモート/データ/スクリプトの「handler」属性を設定するSVGがブロックされています。アップロードされたSVGファイルに <code>$1=\"$2\"</code> が見つかりました。",
        "uploaded-remote-url-svg": "リモート URL の任意のスタイルを設定するSVGがブロックされています。アップロードされたSVGファイルに <code>$1=\"$2\"</code> が見つかりました。",
        "uploaded-image-filter-svg": "URL に画像フィルターが見つかりました: アップロードされたSVGファイルの <code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「$1」を含んでいます。",
+       "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「<nowiki>$1</nowiki>」を含んでいます。",
        "uploadinvalidxml": "アップロードされたファイルに含まれる XML が構文解析できませんでした。",
        "uploadvirus": "このファイルはウイルスを含んでいます!\n詳細: $1",
        "uploadjava": "このファイルは、Javaの.classファイルを含むZIPファイルです。\nセキュリティ上の制限を回避されるおそれがあるため、Javaファイルのアップロードは許可されていません。",
        "authmanager-create-not-in-progress": "アカウントの作成が行われていない、またはセッションデータが失われました。最初からやり直してください。",
        "authmanager-create-no-primary": "指定された証明情報は、アカウントの作成に使用できませんでした。",
        "authmanager-link-no-primary": "指定された証明情報は、アカウントの関連付けに使用できませんでした。",
-       "authmanager-link-not-in-progress": "アカウントの関連付けが行われていない、またはセッションデータが失われました。最初からやり直してください。",
+       "authmanager-link-not-in-progress": "アカウントの関連付けが処理されていないか、セッションデータが失われています。最初からやり直してください。",
        "authmanager-authplugin-setpass-failed-title": "パスワードの変更に失敗しました",
        "authmanager-authplugin-setpass-failed-message": "パスワードの変更は、認証プラグインによって拒否されました。",
        "authmanager-authplugin-create-fail": "アカウントの作成は、認証プラグインによって拒否されました。",
index f327937..89c777e 100644 (file)
        "media_tip": "Pranala barkas",
        "sig_tip": "Tandha tangan sampéyan mawa tandha wayah",
        "hr_tip": "Garis horisontal",
-       "summary": "Tingkesan:",
+       "summary": "Ringkesan:",
        "subject": "Jejer:",
        "minoredit": "Iki besutan cilik",
        "watchthis": "Awasi kaca iki",
        "editingcomment": "Mbesut $1 (pérangan anyar)",
        "editconflict": "Cengkah besutan: $1",
        "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan sing panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca sing bakal kasimpen menawa panjenengan mencèt \"{{int:savearticle}}\".",
-       "yourtext": "Tulisan sampéyan",
+       "yourtext": "Tulisan panjenengan",
        "storedversion": "Owahan kasimpen",
        "nonunicodebrowser": "'''PÈNGET: Panjlajah wèb panjenengan ora ndhukung Unicode, mangga gantènana panjlajah wèb panjenengan sadurungé nyunting artikel.'''",
        "editingold": "'''PÈNGET:''' Panjenengan nyunting revisi lawas sawijining kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan sing wis digawé wiwit revisi iki bakal ilang.",
        "prefs-help-signature": "Tanggapan ing kaca parembugan kudu ditandhatangani mawa \"<nowiki>~~~~</nowiki>\", sing bakal salin dadi tandha tangan lan cap wektumu.",
        "badsig": "Tapak astanipun klèntu; cèk rambu HTML.",
        "badsiglength": "Tapak asta panjenengan kedawan.\nAja luwih saka {{PLURAL:$1|karakter|karakter}}.",
-       "yourgender": "Kepiyé sampéyan medhar priangganing sampéyan?",
+       "yourgender": "Kepiyé sampéyan medhar priangganing panjenengan?",
        "gender-unknown": "Nalika nyebut sampéyan, piranti alus iku bakal nganggo tembung sing nétral jèndher sabisané",
        "gender-male": "Dhèwèké mbesut kaca wiki",
        "gender-female": "Dhèwèké mbesut kaca wiki",
        "uploadlogpage": "Log unggah",
        "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan berkas sing anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan visual.",
        "filename": "Jeneng barkas",
-       "filedesc": "Tingkesan",
+       "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
        "filereuploadsummary": "Owah-owahan berkas:",
        "filestatus": "Status hak cipta",
        "badipaddress": "Alamat IP klèntu",
        "blockipsuccesssub": "Pemblokiran suksès",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDelok [[Special:BlockList|daptar blokir]] kanggo ninjo blokiran.",
-       "ipb-blockingself": "Sampéyan arep mblokir Sampéyan dhéwé! Sampéyan yakin arep nglakoni kuwi?",
+       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni kuwi?",
        "ipb-confirmhideuser": "Sampéyan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Sampéyan yakin arep nglakoni kuwi?",
        "ipb-edit-dropdown": "Besut jalaraning pamalang",
        "ipb-unblock-addr": "Ilangna blokir $1",
        "tooltip-pt-login": "Sampéyan prayogané mlebu masiya ora kudu",
        "tooltip-pt-logout": "Metu",
        "tooltip-pt-createaccount": "Sampéyan prayogané gawé akun lan mlebu masiya ora kudu",
-       "tooltip-ca-talk": "Rerembuganing kaca isi",
+       "tooltip-ca-talk": "Pirembug ngenani kaca isi",
        "tooltip-ca-edit": "Besut kaca iki",
        "tooltip-ca-addsection": "Miwiti pérangan anyar",
        "tooltip-ca-viewsource": "Kaca iki direksa. \nSampéyan bisa ndeleng sumberé",
        "tooltip-rollback": "Balèkaké besutan-besutan kaca iki déning sing pungkasan nyumbang sarana saklikan.",
        "tooltip-undo": "\"Wurung\" mbalèkaké besutan iki lan mbukak blangko besutan sarana modhe pratuduh. Alesan kena diwuwuhaké ing babagan ringkesan.",
        "tooltip-preferences-save": "Simpen préperensi",
-       "tooltip-summary": "Isi tingkesan cendhak",
+       "tooltip-summary": "Isènana ringkesan cekak",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
index f5066c9..9fde977 100644 (file)
@@ -27,7 +27,8 @@
                        "Gi777ga",
                        "Matma Rex",
                        "Sopopruidze",
-                       "Dixtosa"
+                       "Dixtosa",
+                       "OpusDEI"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
@@ -72,7 +73,7 @@
        "tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
        "tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება",
        "tog-useeditwarning": "გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით",
-       "tog-prefershttps": "á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ á\83\9bá\83£á\83\93á\83\90á\83\9b გამოყენება ავტორიზაციის შემდეგ",
+       "tog-prefershttps": "á\83\9bá\83£á\83\93á\83\90á\83\9b á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ გამოყენება ავტორიზაციის შემდეგ",
        "underline-always": "მუდამ",
        "underline-never": "არასდროს",
        "underline-default": "დამოკიდებული მომხმარებელზე ან ბრაუზერის არჩევანზე",
        "category-file-count-limited": "შემდეგი {{PLURAL:$1|ფაილი|$1 ფაილები}} ამ კატეგორიაშია.",
        "listingcontinuesabbrev": "გაგრძ.",
        "index-category": "გვერდების ინდექსაცია",
-       "noindex-category": "არ არსებობს ინდექსირებული გვერდები",
+       "noindex-category": "არინდექსირებული გვერდები",
        "broken-file-category": "გვერდები ფაილების არასწორი ბმულებით",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "newwindow": "(ახალ ფანჯარაში)",
        "cancel": "გაუქმება",
        "moredotdotdot": "ვრცლად...",
-       "morenotlisted": "á\83\94á\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98 á\83¡á\83\98á\83\90á\83\90.",
+       "morenotlisted": "á\83\94á\83¡ á\83¡á\83\98á\83\90 á\83¨á\83\94á\83\98á\83«á\83\9aá\83\94á\83\91á\83\90 á\83\98á\83§á\83\9dá\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98.",
        "mypage": "გვერდი",
        "mytalk": "განხილვა",
        "anontalk": "განხილვა",
        "searcharticle": "გვერდი",
        "history": "გვერდის ისტორია",
        "history_short": "ისტორია",
+       "history_small": "ისტორია",
        "updatedmarker": "განახლდა ჩემი ბოლო შემოსვლის შემდეგ",
        "printableversion": "დასაბეჭდი ვერსია",
        "permalink": "მუდმივი ბმული",
        "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის|გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ჩვენება",
+       "rcfilters-highlightmenu-title": "ფერის არჩევა",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "rcshowhideminor": "მცირე რედაქტირების $1",
        "uploaded-setting-handler-svg": "SVG, რომელიც სვავს \"handler\" ატრიბუტს remote/data/script-ით, დაბლკილია. ნაპოვნია <code>$1=\"$2\"</code> ატვირთულ SVG ფაილში.",
        "uploaded-remote-url-svg": "SVG, რომელიც სვავს რომელიმე სტილის ატრიბუტს დაშორებული URL-თი, დაბლოკილია. ნაპოვნია <code>$1=\"$2\"</code> ატვირთულ SVG ფაილში.",
        "uploaded-image-filter-svg": "ნაპოვნია სურათის ფილტრი URL-ით: <code>&lt;$1 $2=\"$3\"&gt;</code> ატვირთულ SVG ფაილში.",
-       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"$1\".",
+       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML ჩატვირთულ ფაილში არ შეიძლება იყოს ანალიზირებული",
        "uploadvirus": "ფაილი ვირუსს შეიცავს! დეტალები: $1",
        "uploadjava": "ეს არის ZIP-ფაილი, რომელიც ჯავას CLASS-ფაილს შეიცავს.\nჯავა-ფაილების ატვირთვა დაუშვებელია, ვინაიდან მათ შესაძლოა შეზღუდონ უსაფრთხოება.",
index 5ff8194..2f4c06a 100644 (file)
        "saveprefs": "محفوظ",
        "restoreprefs": "تمام بےنقص ترتیباتن بحال کورے",
        "prefs-editing": "تدوین",
-       "rows": "صف:",
-       "columns": "قطار:",
        "searchresultshead": "Search/تلاش",
        "stub-threshold-disabled": "غیر فعال",
        "timezonelegend": "وختو زون",
index 1580a47..1b03b32 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "Macofe",
                        "Kumkumuk",
-                       "Asmen"
+                       "Asmen",
+                       "Gırd"
                ]
        },
        "tog-underline": "Bınê gırey de xete bonce:",
        "hiddencategories": "Na pele mensuba {{PLURAL:$1|1 kategoriya nımıtiya|$1 kategoriunê nımıtuna}}:",
        "permissionserrors": "Xetê desturi",
        "permissionserrorstext-withaction": "Desturê to be $2 çino, serba {{PLURAL:$1|na sebebi|nê sebebu}} ra:",
-       "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:",
+       "recreate-moveddeleted-warn": "'''Hişyari: na perra ke şıma vırazenê verê cı vıraziyayo.'''\n\nŞıma diqat bıkerê no vırnayışê şıma gani bêro akerdış:",
        "moveddeleted-notice": "Ma ena pele wederna.\nQe referansi logê wedernayışi bın de mocnayiya.",
        "edit-conflict": "Têverabiyayena vurnayişi.",
        "post-expand-template-inclusion-warning": "'''Teme''': Zerrekê şabloni zaf gırso.\nTaê şabloni ilawe nêbenê.",
        "prefs-rendering": "Asais",
        "saveprefs": "Qeyd ke",
        "prefs-editing": "Vurnais",
-       "rows": "Rêji:",
-       "columns": "Ustıni:",
        "searchresultshead": "Cıcêre",
        "stub-threshold": "Tertibê şêmıga <a href=\"#\" class=\"stub\">stub link</a> (''bytes''):",
        "recentchangesdays": "Rozê ke vurnaisunê peyênun de asenê:",
        "rcshowhidebots": "Botu $1",
        "rcshowhideliu": "karberê qeydbiyayeyi $1",
        "rcshowhideanons": "$1 karberê anonimi",
-       "rcshowhidepatr": "Vurnayışê cıyê vênıtey $1",
+       "rcshowhidepatr": "Vırnayışê cıyê vênıtey $1",
        "rcshowhidemine": "Vurnayisanê mı $1",
        "rclinks": "Peyniya $2 rozu de $1 vurnayisu bıasne <br />$3",
        "diff": "ferq",
index f7ad3d9..5829ad7 100644 (file)
        "saveprefs": "Сақтау",
        "restoreprefs": "Барлығын бастапқы баптауларға қайтару (барлық бөлімдердегі)",
        "prefs-editing": "Өңдеу",
-       "rows": "Жолдар:",
-       "columns": "Бағандар:",
        "searchresultshead": "Іздеу",
        "stub-threshold": "Бастама сілтемесін пішімдеу табалдырығы ($1):",
        "stub-threshold-sample-link": "қарапайым",
        "uploaddisabledtext": "Файл жүктеу өшірілген.",
        "php-uploaddisabledtext": "PHP-де файл жүктеулері өшірілген.\nfile_uploads баптауын тексеріңіз.",
        "uploadscripted": "Бұл файлда веб шолғышты қателікпен талдатқызатын HTML не әмір коды бар.",
-       "uploadscriptednamespace": "Бұл SVG файл дұрыс емес «$1» есім кеңістігінен тұрады.",
+       "uploadscriptednamespace": "Бұл SVG файл дұрыс емес «<nowiki>$1</nowiki>» есім кеңістігінен тұрады.",
        "uploadinvalidxml": "Жүктелген файлдағы XML талданбайды.",
        "uploadvirus": "Бұл файлда вирус бар! Егжей-тегжейлері: $1",
        "uploadjava": "ZIP файл  Java . түріндегі файлдан тұрады.\nJava файлдарды жүктеу рұқсат етілмейді, себебі құпиялық шектеулерге айналуына себеп болады.",
        "feedback-useragent": "Қатысушы агент:",
        "searchsuggest-search": "{{SITENAME}} жобасынан іздеу",
        "searchsuggest-containing": "қамтылуда...",
-       "api-error-badaccess-groups": "Сізге бұл уикиге файл жүктеуге рұқсат етілмеген.",
        "api-error-badtoken": "Ішкі қате: Жаман байрақша",
-       "api-error-copyuploaddisabled": "URL бойынша жүктеу бұл серверде өшірілген",
-       "api-error-duplicate": "{{PLURAL:$1|басқа [$2 файл]|кейбір [$2 басқа файл]}} әлеқашан сайтта ,бірдей мазмұнда бар.",
-       "api-error-empty-file": "Сіз жіберген файл бос.",
        "api-error-emptypage": "Бос бетті жаңадан бастау рұқсат етілмейді.",
-       "api-error-fetchfileerror": "Ішкі қателік: Файлды алу барысында қате кетті.",
-       "api-error-fileexists-forbidden": "\"$1\" атауымен файл әлдеқашан бар және үстінен жазылмайды.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" атауымен файл ортаққорда әлдеқашан бар және үстінен жазылмайды.",
-       "api-error-file-too-large": "Сіз жіберген файл тым үлкен.",
-       "api-error-filename-tooshort": "Файл атауы тым қысқа",
-       "api-error-filetype-banned": "Бұл файл түрі тыйым салынған.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|рұқсат етілмеген файл түрі|рұқсат етілмеген файл түрі}}. Рұқсат етілген {{PLURAL:$3|файл түрі|файл түрлері}}: $2.",
-       "api-error-filetype-missing": "Файл атауы кеңейтілім қажет етеді.",
-       "api-error-hookaborted": "Сіз жасамақ болған түрлендірім кеңейтілім арқылы тоқтатылды.",
-       "api-error-http": "Ішкі қате: Серверге қосылу қолайсыз.",
-       "api-error-illegal-filename": "Файл атауы рұқсат етілмеген.",
-       "api-error-internal-error": "Ішкі қателік: Уикидегі жүктеу барысында  қате кетті",
-       "api-error-invalid-file-key": "Ішкі қате: Файл уақытша сақтағыштан табылмады.",
-       "api-error-missingparam": "Ішкі қате: Ұсынылған параметрлерді қажет етеді",
-       "api-error-missingresult": "Ішкі қателік: Есе сәтті болғанын анықтамады.",
-       "api-error-mustbeloggedin": "Файлдар жүктеу үшін кіруіңіз қажет",
-       "api-error-mustbeposted": "Ішкі қателік: Сұраныс HTTP POST қажет етеді.",
-       "api-error-noimageinfo": "Жүктеу сәтті болды, бірақ бізге файл туралы қандай да бір мәліметті сервер бере алмады.",
-       "api-error-nomodule": "Ішкі қателік: Жүктеу модуль жиынтығы жоқ.",
-       "api-error-ok-but-empty": "Ішкі қателік: Серверден жауап жоқ.",
-       "api-error-overwrite": "Бар файлды ауыстыру рұқсат етілмейді.",
-       "api-error-stashfailed": "Ішкі қателік: Сервер уақытша файлды сақтамады.",
        "api-error-publishfailed": "Ішкі қателік: Сервер уақытша файлды жарияламады.",
-       "api-error-stasherror": "Сақтау орнына файлды жүктеу кезінде қате болды.",
-       "api-error-stashedfilenotfound": "Уақытша қоймадағы файлды жүктемекші болған кезде бастапқы файл табылмады.",
-       "api-error-stashpathinvalid": "Уақытша қоймада жүктелген файл табылуға тиіс болған жол жарамсыз.",
-       "api-error-stashfilestorage": "Файлды уақытша қоймаға жүктеу барысында қате болды.",
-       "api-error-stashzerolength": "Сервер файлды уақытша қорға сақтай алмайды, себебі ұзындығы нөдге тең.",
-       "api-error-stashnotloggedin": "Жүктеу қоймасына сақтау үшін сіздің кіруіңіз керек.",
-       "api-error-stashwrongowner": "Сіз қатынамақшы болған қордағы файл сізге қарасты емес.",
-       "api-error-stashnosuchfilekey": "Сіз қатынамақшы болған қордағы файл құпия сөзі жоқ.",
-       "api-error-timeout": "Сервер межелеген мерзімде жауап бермеді.",
-       "api-error-unclassified": "Белгісіз қателік орын алды.",
-       "api-error-unknown-code": "Белгісіз қате: \"$1\".",
-       "api-error-unknown-error": "Ішкі қателік: Сіздің файлыңызды жүктеу барысында қате кетті.",
+       "api-error-stashfailed": "Ішкі қателік: Сервер уақытша файлды сақтамады.",
        "api-error-unknown-warning": "Белгісіз ескерту: \"$1\".",
        "api-error-unknownerror": "Белгісіз қате: \"$1\".",
-       "api-error-uploaddisabled": "Бұл уикиде жүктеп беру өшірілген.",
-       "api-error-verification-error": "Бұл файл бүлінген болуы мүмкін немесе теріс кеңейтуі бар.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|сағат|сағат}}",
index 89564eb..2b3ef5a 100644 (file)
@@ -16,7 +16,8 @@
                        "វ័ណថារិទ្ធ",
                        "아라",
                        "Macofe",
-                       "Dcljr"
+                       "Dcljr",
+                       "Aefgh39622"
                ]
        },
        "tog-underline": "គូសបន្ទាត់ក្រោម​តំណភ្ជាប់៖",
@@ -43,7 +44,7 @@
        "tog-enotifminoredits": "ផ្ញើអ៊ីមែល​មកខ្ញុំពេលមានបន្លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​",
        "tog-enotifrevealaddr": "បង្ហាញ​អាសយដ្ឋានអ៊ីមែល​របស់ខ្ញុំ​ក្នុង​​អ៊ីមែល​ក្រើនរំលឹក​",
        "tog-shownumberswatching": "បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ",
-       "tog-oldsig": "ហត្ថលេខាមានហើយ៖",
+       "tog-oldsig": "á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e¶á\9e\93á\9e á\9e¾á\9e\99á\9f\96",
        "tog-fancysig": "ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)",
        "tog-uselivepreview": "ប្រើប្រាស់​ការមើលមុនរហ័ស",
        "tog-forceeditsummary": "សូមរំលឹកខ្ញុំ​កាលបើខ្ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនេរ",
@@ -59,7 +60,7 @@
        "tog-showhiddencats": "បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់",
        "tog-norollbackdiff": "បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ",
        "tog-useeditwarning": "សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបន្លាស់ប្ដូរ​នានា​",
-       "tog-prefershttps": "ប្រើប្រាស់ការតភ្ជាប់មានសុវត្ថិភាពជានិច្ចពេលកត់ឈ្មោះចូល",
+       "tog-prefershttps": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\8fá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\9fá\9e»á\9e\9cá\9e\8fá\9f\92á\9e\90á\9e·á\9e\97á\9e¶á\9e\96á\9e\87á\9e¶á\9e\93á\9e·á\9e\85á\9f\92á\9e\85á\9e\96á\9f\81á\9e\9bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b",
        "underline-always": "ជានិច្ច",
        "underline-never": "កុំឲ្យសោះ",
        "underline-default": "តាមលំនាំដើមនៃ​កម្មវិធី​រុករក​",
        "morenotlisted": "បញ្ជីនេះមិនទាន់ពេញលេញទេ។",
        "mypage": "ទំព័រ​",
        "mytalk": "ការពិភាក្សា​",
-       "anontalk": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8b IP á\9e\93á\9f\81á\9f\87",
+       "anontalk": "á\9e\80á\9e¶á\9e\9aâ\80\8bá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e",
        "navigation": "ការណែនាំ",
        "and": "&#32;និង",
        "qbfind": "ស្វែងរក",
        "nocookieslogin": "{{SITENAME}}ប្រើខូឃីដើម្បីកត់ឈ្មោះចូល។\n\nអ្នកបានជ្រើសមិនប្រើខូឃី។​\n\nសូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។",
-       "loginsuccesstitle": "á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85",
+       "loginsuccesstitle": "á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e á\9e¾á\9e\99",
        "loginsuccess": "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"$1\"ហើយ។'''",
        "nosuchuser": "មិនមានអ្នកប្រើដែលមានឈ្មោះ \"$1\" ទេ។\n\nសូម​ពិនិត្យ​ក្រែង​លោ​មានកំហុស​អក្ខរាវិរុទ្ធឬ [[Special:CreateAccount|បង្កើត​គណនី​ថ្មី]]។",
        "nosuchusershort": "គ្មានអ្នកប្រើដែលមានឈ្មោះ $1\" ទេ។\n\nសូម​ពិនិត្យ​​អក្ខរាវិរុទ្ធ​របស់អ្នក ។",
        "newpassword": "ពាក្យសម្ងាត់ថ្មី៖",
        "retypenew": "សូមវាយពាក្យសម្ងាត់ថ្មី​ម្តងទៀត៖",
        "resetpass_submit": "ដាក់ប្រើពាក្យសម្ងាត់និង​កត់ឈ្មោះចូល",
-       "changepassword-success": "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86á\9e\9aá\9f\81á\9e\85á\9e á\9e¾á\9e\99!",
+       "changepassword-success": "ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរហើយ!",
        "changepassword-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលជាប់ៗគ្នាច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
        "resetpass_forbidden": "ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ",
        "resetpass-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "passwordreset-emaildisabled": "មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។",
        "passwordreset-username": "អត្តនាម៖",
        "passwordreset-domain": "ដូម៉ែន៖",
-       "passwordreset-capture": "មើលអ៊ីមែលលទ្ធផល?",
-       "passwordreset-capture-help": "ប្រសិនបើអ្នកគូសធីកប្រអប់នេះ អ៊ីមែល (ដែលមានពាក្យសម្ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។",
        "passwordreset-email": "អាសយដ្ឋានអ៊ីមែល៖",
        "passwordreset-emailtitle": "ព័ត៌មានលំអិតពីគណនីនៅលើ {{SITENAME}}",
        "passwordreset-emailtext-ip": "មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកសម្រាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ\nមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "saveprefs": "រក្សាទុក",
        "restoreprefs": "ស្ដារ​ការកំណត់​ទាំងអស់​ទៅ​លំនាំដើម (គ្រប់ផ្នែកទាំងអស់)",
        "prefs-editing": "កំណែប្រែ",
-       "rows": "ជួរដេក៖",
-       "columns": "ជួរឈរ៖",
        "searchresultshead": "ស្វែងរក",
        "stub-threshold": "ទំហំអប្បបរមាសម្រាប់ដាក់ជាទម្រង់ទំព័រកំប៉ិចកំប៉ុក($1)៖",
        "stub-threshold-sample-link": "គំរូ",
        "userrights-reason": "មូលហេតុ៖",
        "userrights-no-interwiki": "អ្នកគ្មានការអនុញ្ញាតកែប្រែសិទ្ធិរបស់អ្នកប្រើប្រាស់លើវិគីផ្សេងទេ។",
        "userrights-nodatabase": "មូលដ្ឋានទិន្នន័យ $1 មិនមាន ឬ ស្ថិតនៅខាងក្រៅ។",
-       "userrights-nologin": "អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]]ដោយប្រើគណនីអ្នកអភិបាលដើម្បីផ្ដល់សិទ្ធិឱ្យអ្នកប្រើប្រាស់​។",
-       "userrights-notallowed": "លោកអ្នកគ្មានការអនុញ្ញាតដើម្បីបន្ថែមឬដកសិទ្ធិរបស់អ្នកប្រើប្រាស់ដទៃទេ។",
        "userrights-changeable-col": "ក្រុមនានាដែលអ្នកអាចផ្លាស់ប្ដូរបាន",
        "userrights-unchangeable-col": "ក្រុមនានាដែលអ្នកមិនអាចផ្លាស់ប្ដូរបាន",
        "userrights-conflict": "មានទំនាស់អំពីការកែប្រែសិទ្ធិអ្នកប្រើប្រាស់! សូមត្រួតពិនិត្យឡើងវិញរួចអះអាងពីការកែប្រែរបស់អ្នក។",
-       "userrights-removed-self": "អ្នកបានដកសិទ្ធិខ្លួនឯងបានសម្រេចហើយ។ ហេតុនេះ អ្នកមិនអាចចូលមើលទំព័រនេះតទៅទៀតទេ។",
        "group": "ក្រុម៖",
        "group-user": "អ្នកប្រើប្រាស់",
        "group-autoconfirmed": "អ្នកប្រើប្រាស់ទទួលស្គាល់ដោយស្វ័យប្រវត្តិ",
        "right-siteadmin": "ចាក់សោនិងបើកសោមូលដ្ឋានទិន្នន័យ",
        "right-override-export-depth": "នាំចេញទំព័ររួមទាំងទំព័រដែលមានភ្ជាប់តំណភ្ជាប់​រហូតដល់លំដាប់ទី៥",
        "right-sendemail": "ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ",
-       "right-passwordreset": "មើលអ៊ីមែលសំរាប់កំណត់ពាក្យសម្ងាត់ឡើងវិញ",
        "newuserlogpage": "កំណត់ហេតុនៃការបង្កើតគណនី",
        "newuserlogpagetext": "នេះជាកំណត់ហេតុនៃការបង្កើតអ្នកប្រើប្រាស់។",
        "rightslog": "កំណត់ហេតុនៃការប្តូរសិទ្ធិអ្នកប្រើប្រាស់",
        "rightslogtext": "នេះ​ជា​កំណត់ហេតុនៃបំលាស់ប្ដូរចំពោះកាប្ដូរក្រុមសមាជិកភាព​របស់​អ្នកប្រើប្រាស់។",
        "action-read": "អានទំព័រនេះ",
        "action-edit": "កែប្រែទំព័រនេះ",
-       "action-createpage": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9e¶á\9e\93á\9e",
-       "action-createtalk": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9e¶á\9e\93á\9e",
+       "action-createpage": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87",
+       "action-createtalk": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9f\81á\9f\87",
        "action-createaccount": "បង្កើតគណនីអ្នកប្រើប្រាស់នេះ",
        "action-history": "មើលប្រវត្តិទំព័រនេះ",
        "action-minoredit": "ចំណាំកំណែប្រែនេះថាជាកំណែប្រែតិចតួច",
        "feedback-thanks-title": "សូមអរគុណ!",
        "searchsuggest-search": "ស្វែងរក​",
        "searchsuggest-containing": "ដែលមានពាក្យ...",
-       "api-error-badaccess-groups": "អ្នកគ្មានការអនុញ្ញាតអោយផ្ទុកឯកសារឡើងទៅក្នុងវិគីនេះទេ។",
-       "api-error-empty-file": "ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។",
        "api-error-emptypage": "ការអនុញ្ញាតអោយបង្កើតទំព័រថ្មីដែលគ្មានសរសេរអ្វីទេ",
-       "api-error-fileexists-forbidden": "ឯកសារដែលមានឈ្មោះ \"$1\" មានរួចហើយ ហើយមិនអាចសរសេរជាន់ពីលើបានទេ។",
-       "api-error-fileexists-shared-forbidden": "ឯកសារដែលមានឈ្មោះ \"$1\" មានរួចហើយនៅក្នុងថតឯកសាររួម ហើយមិនអាចសរសេរជាន់ពីលើបានទេ។",
-       "api-error-file-too-large": "ឯកសារដែលអ្នកបានដាក់ស្នើធំពេកហើយ។",
-       "api-error-filename-tooshort": "ឈ្មោះឯកសារខ្លីពេកហើយ។",
-       "api-error-filetype-banned": "ឯកសារប្រភេទនេះត្រូវបានហាមប្រាម។",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ​}}។\n{{PLURAL:$3|ប្រភេទឯកសារ​|ប្រភេទឯកសារ​}}ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​គឺ $2 ។",
-       "api-error-filetype-missing": "ឈ្មោះឯកសារបាត់កន្ទុយ។",
-       "api-error-http": "បញ្ហាខាងក្នុង៖ មិនអាចភ្ជាប់ទោកាន់ម៉ាស៊ីនបំរើការ។",
-       "api-error-illegal-filename": "មិនអនុញ្ញាតអោយប្រើឈ្មោះឯកសារនេះ។",
-       "api-error-internal-error": "បញ្ហាខាងក្នុង៖ មានបញ្ហាណាមួយកើតឡើងពេលកំពុងដំណើរការផ្ទុកឯកសារអ្នកឡើងទៅក្នុងវិគី។",
-       "api-error-missingresult": "បញ្ហាខាងក្នុង៖ មិនអាចកំណត់បានថាការថតចំលងបានសំរេចទេ។",
-       "api-error-mustbeloggedin": "អ្នកត្រូវតែកត់ឈ្មោះចូលដើម្បីផ្ទុកឯកសារឡើង។",
-       "api-error-ok-but-empty": "បញ្ហាខាងក្នុង៖ គ្មានចម្លើយពីម៉ាស៊ីនបម្រើការ។",
-       "api-error-overwrite": "មិនអនុញ្ញាតអោយសរសេរជាន់ពីលើឯកសារដែលមានស្រាប់ហើយ។",
-       "api-error-timeout": "ម៉ាស៊ីនបំរើការមិនបានឆ្លើយតបក្នុងរយៈពេលដែលយើងរំពឹងទុក។",
-       "api-error-unclassified": "បញ្ហាមិនស្គាល់មួយបានកើតឡើង។",
-       "api-error-unknown-code": "បញ្ហាមិនស្គាល់៖ \"$1\" ។",
-       "api-error-unknown-error": "បញ្ហាខាងក្នុង៖ មានបញ្ហាមិនស្រួលពេលកំពុងព្យាយាមផ្ទុកឯកសាររបស់អ្នកឡើង។",
        "api-error-unknown-warning": "ការព្រមានមិនស្គាល់៖ \"$1 ។",
        "api-error-unknownerror": "បញ្ហាមិនស្គាល់៖ \"$1\" ។",
-       "api-error-uploaddisabled": "ការផ្ទុកឡើងត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះទេ។",
-       "api-error-verification-error": "ឯកសារនេះប្រហែលជាខូច ឯមានកន្ទុយមិនត្រឹមត្រូវ។",
        "duration-seconds": "$1 {{PLURAL:$1|វិនាទី|វិនាទី}}",
        "duration-minutes": "$1 {{PLURAL:$1|នាទី|នាទី}}",
        "duration-hours": "$1 {{PLURAL:$1|ម៉ោង|ម៉ោង}}",
index a3f6370..8660847 100644 (file)
        "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
        "missingcommentheader": "<strong>알림:</strong> 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
-       "summary-preview": "요약 미리 보기:",
+       "summary-preview": "편집 요약 미리 보기:",
        "subject-preview": "주제 미리 보기:",
        "previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
        "blockedtitle": "사용자가 차단됨",
        "search-interwiki-caption": "자매 프로젝트",
        "search-interwiki-default": "$1로부터의 결과:",
        "search-interwiki-more": "(더 보기)",
+       "search-interwiki-more-results": "더 많은 결과",
        "search-relatedarticle": "관련",
        "searchrelated": "관련",
        "searchall": "모두",
        "youremail": "이메일:",
        "username": "{{GENDER:$1|사용자 이름}}:",
        "prefs-memberingroups": "{{GENDER:$2|소속}} {{PLURAL:$1|그룹}}:",
+       "group-membership-link-with-expiry": "$1 ($2 까지)",
        "prefs-registration": "등록 시간:",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "editusergroup": "사용자 그룹 불러오기",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한 바꾸기",
        "viewinguserrights": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한을 보는 중",
-       "userrights-editusergroup": "사용자 그룹 편집",
-       "userrights-viewusergroup": "사용자 그룹 보기",
+       "userrights-editusergroup": "{{GENDER:$1|사용자}} 그룹 편집",
+       "userrights-viewusergroup": "{{GENDER:$1|사용자}} 그룹을 보기",
        "saveusergroups": "{{GENDER:$1|사용자}} 권한 저장",
        "userrights-groupsmember": "현재 권한:",
        "userrights-groupsmember-auto": "자동으로 부여된 권한:",
        "userrights-nodatabase": "데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.",
        "userrights-changeable-col": "바꿀 수 있는 권한",
        "userrights-unchangeable-col": "바꿀 수 없는 권한",
+       "userrights-expiry-current": "$1에 만료",
        "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-conflict": "사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.",
        "rcfilters-invalid-filter": "유효하지 않은 필터",
        "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
+       "rcfilters-highlightbutton-title": "결과 강조",
+       "rcfilters-highlightmenu-title": "색 선택",
        "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
        "rcfilters-filtergroup-registration": "사용자 등록",
        "rcfilters-filter-registered-label": "등록됨",
        "rcfilters-filter-bots-label": "봇",
        "rcfilters-filter-bots-description": "자동 도구를 이용한 편집.",
        "rcfilters-filter-humans-label": "사람 (봇이 아님)",
-       "rcfilters-filter-humans-description": "ì\88\98ë\8f\99ì\9c¼ë¡\9c 한 편집.",
+       "rcfilters-filter-humans-description": "ì\82¬ë\9e\8cì\9d´ 한 편집.",
        "rcfilters-filtergroup-significance": "의미",
        "rcfilters-filter-minor-label": "사소한 편집",
        "rcfilters-filter-major-label": "사소하지 않은 편집",
        "rcfilters-filter-newpages-description": "새 문서를 만드는 편집.",
        "rcfilters-filter-categorization-label": "분류 차이",
        "rcfilters-filter-categorization-description": "분류에서 추가되거나 제거되는 페이지의 기록.",
+       "rcfilters-filter-logactions-description": "관리적 조치, 계정 만들기, 페이지 삭제, 업로드...",
        "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집 $1",
        "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 파일은 사용할 수 없는 이름공간 '$1'을 포함하고 있습니다.",
+       "uploadscriptednamespace": "이 SVG 파일은 사용할 수 없는 이름공간 '<nowiki>$1</nowiki>'을 포함하고 있습니다.",
        "uploadinvalidxml": "업로드된 파일의 XML의 구문을 분석할 수 없습니다.",
        "uploadvirus": "파일이 바이러스를 포함하고 있습니다!\n자세한 설명: $1",
        "uploadjava": "이 ZIP 파일은 자바의 .class 파일을 포함하고 있습니다.\n보안 규제를 우회할 수 있기 때문에 자바 파일을 올리는 것이 허용되지 않습니다.",
        "uncategorizedcategories": "분류되지 않은 분류 목록",
        "uncategorizedimages": "분류되지 않은 파일 목록",
        "uncategorizedtemplates": "분류되지 않은 틀 목록",
+       "uncategorized-categories-exceptionlist": "# \"특수:분류안된분류\"에 언급되지 않은 분류의 목록을 포함합니다. 한 줄에 하나씩 \"*\"로 시작합니다. 다른 문자(공백 포함)로 시작하는 줄들은 무시됩니다. 주석의 경우 \"#\"를 사용하십시오.",
        "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\" 토크을 가져오는데 실패했습니다.",
        "apisandbox-alert-field": "이 필드의 값이 유효하지 않습니다.",
        "apisandbox-continue": "계속",
        "apisandbox-continue-clear": "지우기",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}}은 마지막 요청을 [https://www.mediawiki.org/wiki/API:Query#Continuing_queries 계속]합니다. {{int:apisandbox-continue-clear}}는 계속 관련 변수들을 삭제합니다.",
        "apisandbox-param-limit": "최대 한계치를 사용하려면 <kbd>max</kbd>를 입력하십시오.",
        "apisandbox-multivalue-all-namespaces": "$1 (모든 이름공간)",
        "apisandbox-multivalue-all-values": "$1 (모든 값)",
        "allpages": "모든 문서 목록",
        "nextpage": "다음 문서 ($1)",
        "prevpage": "이전 문서 ($1)",
-       "allpagesfrom": "다음으로 시작하는 문서 보기:",
-       "allpagesto": "다음으로 끝나는 문서 보기:",
+       "allpagesfrom": "다음으로 시작하는 문서 표시:",
+       "allpagesto": "다음으로 끝나는 문서 표시:",
        "allarticles": "모든 문서",
        "allinnamespace": "$1 이름공간의 모든 문서",
        "allpagessubmit": "보기",
-       "allpagesprefix": "다음으로 시작하는 문서 보기:",
+       "allpagesprefix": "다음 접두어로 시작하는 문서 표시:",
        "allpagesbadtitle": "주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
        "allpages-bad-ns": "{{SITENAME}}에서는 \"$1\" 이름공간을 사용하지 않습니다.",
        "allpages-hide-redirects": "넘겨주기 숨기기",
        "categories": "분류 목록",
        "categories-submit": "보이기",
        "categoriespagetext": "문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.\n[[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.\n[[Special:WantedCategories|필요한 분류]]도 참조하세요.",
-       "categoriesfrom": "다음으로 시작하는 분류를 보여주기:",
+       "categoriesfrom": "다음으로 시작하는 분류 표시:",
        "deletedcontributions": "삭제된 사용자 기여",
        "deletedcontributions-title": "삭제된 사용자 기여",
        "sp-deletedcontributions-contribs": "기여",
        "linksearch-text": "\"*.wikipedia.org\"와 같이 와일드 카드를 사용할 수 있습니다.\n적어도 \"*.org\"와 같이 최상위 도메인을 입력해야 합니다.<br />\n지원하는 {{PLURAL:$2|프로토콜}}: $1 (프로토콜을 지정하지 않을 때 기본값은 http://)",
        "linksearch-line": "$1가 $2에서 링크됩니다.",
        "linksearch-error": "와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.",
-       "listusersfrom": "다음으로 시작하는 사용자 보기:",
+       "listusersfrom": "다음으로 시작하는 사용자 표시:",
        "listusers-submit": "보기",
        "listusers-noresult": "사용자를 찾을 수 없습니다.",
        "listusers-blocked": "(차단됨)",
        "activeusers": "활동하는 사용자 목록",
        "activeusers-intro": "다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.",
        "activeusers-count": "마지막 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회",
-       "activeusers-from": "다음으로 시작하는 사용자를 보기:",
+       "activeusers-from": "다음으로 시작하는 사용자 표시:",
        "activeusers-groups": "그룹에 속한 사용자 표시:",
        "activeusers-excludegroups": "그룹에 속한 사용자 제외:",
        "activeusers-noresult": "사용자를 찾을 수 없습니다.",
-       "activeusers-submit": "활동하고 있는 사용자 보이기",
+       "activeusers-submit": "활동하고 있는 사용자 표시",
        "listgrouprights": "사용자 권한 목록",
        "listgrouprights-summary": "다음은 이 위키에 있는 사용자 권한 그룹의 목록입니다.\n각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|추가 정보]]를 참조하세요.",
        "listgrouprights-key": "범례:\n* <span class=\"listgrouprights-granted\">부여된 권한</span>\n* <span class=\"listgrouprights-revoked\">해제된 권한</span>",
        "emailccsubject": "$1에게 보낸 메시지의 복사본: $2",
        "emailsent": "이메일 보냄",
        "emailsenttext": "이메일을 보냈습니다.",
-       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1님이 $2에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다.",
+       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1님이 $2님에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다. 이 이메일에 답장을 보내게 되면 원래 이메일을 보낸 사용자에게 직접 답장을 보내게 되며, 따라서 귀하의 이메일 주소를 보낸 사용자에게 공개하게 됩니다.",
        "usermessage-summary": "시스템 메시지 남기기",
        "usermessage-editor": "시스템 메신저",
        "usermessage-template": "MediaWiki:UserMessage",
        "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브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
        "imagenocrossnamespace": "파일을 파일이 아닌 이름공간으로 이동할 수 없습니다.",
        "nonfile-cannot-move-to-file": "파일이 아닌 문서를 파일 이름공간으로 이동할 수 없습니다.",
        "imagetypemismatch": "새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.",
-       "imageinvalidfilename": " 파일 이름이 잘못되었습니다.",
+       "imageinvalidfilename": "대상 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "이동한 뒤 넘겨주기를 남기기",
        "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 보호되어 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
        "size-bytes": "$1 {{PLURAL:$1|바이트}}",
        "size-pixel": "$1 {{PLURAL:$1|픽셀}}",
        "lag-warn-normal": "최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.",
-       "lag-warn-high": "데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서 목록은 보이지 않을 수 있습니다.",
+       "lag-warn-high": "데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초|초}} 안에 바뀐 문서 목록은 보이지 않을 수 있습니다.",
        "watchlistedit-normal-title": "주시문서 목록 편집하기",
        "watchlistedit-normal-legend": "주시문서 목록에서 문서 제거하기",
        "watchlistedit-normal-explain": "주시문서 목록에 있는 문서의 제목이 아래에 나와 있습니다.\n주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 \"{{int:Watchlistedit-normal-submit}}\"를 클릭해주세요.\n또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|토론]])",
        "timezone-local": "로컬",
        "duplicate-defaultsort": "<strong>경고:</strong> 기본 정렬 키 \"$2\"가 이전의 기본 정렬 키 \"$1\"를 덮어쓰고 있습니다.",
-       "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 제목 표시는 기존의 표시되는 제목 \"$1\"을 덮어씁니다.",
+       "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 표시 제목은 먼저번의 표시 제목 \"$1\"을 덮어씁니다.",
        "restricted-displaytitle": "<strong>경고:</strong> 표시하려는 제목 \"$1\"은(는) 문서의 실제 제목과 동일하지 않으므로 무시되었습니다.",
        "invalid-indicator-name": "<strong>오류:</strong> 문서 상태 표시기의 <code>name</code> 특성은 비어 있지 않아야 합니다.",
        "version": "버전",
        "htmlform-date-invalid": "지정한 값은 인식할 수 있는 날짜가 아닙니다. YYYY-MM-DD 형식을 사용하세요.",
        "htmlform-time-invalid": "지정한 값은 인식할 수 있는 시간이 아닙니다. HH:MM:SS 형식을 사용하세요.",
        "htmlform-datetime-invalid": "지정한 값은 인식할 수 있는 날짜 및 시간이 아닙니다. YYYY-MM-DD HH:MM:SS 형식을 사용하세요.",
+       "htmlform-date-toolow": "지정된 값은 최소로 허용된 날짜 $1 보다 이전입니다.",
+       "htmlform-date-toohigh": "지정된 값은 최대로 허용된 날짜 $1 보다 이후입니다.",
+       "htmlform-time-toolow": "지정된 값은 최소로 허용된 시간 $1 보다 이전입니다.",
+       "htmlform-time-toohigh": "지정된 값은 최대로 허용된 시간 $1 보다 이후입니다.",
+       "htmlform-datetime-toolow": "지정된 값은 최소로 허용된 시간 $1 보다 이전입니다.",
+       "htmlform-datetime-toohigh": "지정된 값은 최대로 허용된 시간 $1 보다 이후입니다.",
        "htmlform-title-badnamespace": "[[:$1]] 문서는 \"{{ns:$2}}\" 이름공간에 없습니다.",
        "htmlform-title-not-creatable": "\"$1\"은 만들 수 없는 문서 제목입니다.",
        "htmlform-title-not-exists": "$1 문서는 존재하지 않습니다.",
        "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": "감사합니다! 혹시 해당 사항이 [$1 기존의 버그 보고서]에 올라와 있는지 확인해주세요.",
        "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": "쿠키 기반 세션",
        "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>",
        "revid": "$1 판",
        "pageid": "페이지 ID $1"
 }
index 7d67c36..3d70dbb 100644 (file)
        "passwordreset-emaildisabled": "Heh dat Wiki määt nix met <i lang=\"en\">e-mail</i>!",
        "passwordreset-username": "Metmaacher_Nahme:",
        "passwordreset-domain": "Domähn:",
-       "passwordreset-capture": "Wells De di <i lang=\"en\">e-mail</i> beloore?",
-       "passwordreset-capture-help": "Wann De heh e Krüzje määß, kriß de di <i lang=\"en\">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.",
        "passwordreset-email": "De Adräß för de <i lang=\"en\">e-mail</i>:",
        "passwordreset-emailtitle": "Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailelement": "Metmaacher Name: \n$1\n\nEijmohl-Paßwoot: \n$2",
        "passwordreset-emailsentemail": "Wann dat en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för Dinge Zohjang verschek, öm e neu Paßwoot ze krijje.",
        "passwordreset-emailsentusername": "Wann heh dä Metmaacher en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß hät, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> verschek, öm e neu Paßwoot ze krijje.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es|De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>s sin|Nix es}} verschek woode, öm e neu Paßwoot ze krijje. {{PLURAL:$1|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|Däm|Däm|Däm Metmaacher|Dä|Däm}} $1 en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze scheke hät nit jeflupp: {{PLURAL:$3|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
        "passwordreset-nocaller": "Entärne Fähler: Ene Oprohfer moß aanjejovve sin.",
        "passwordreset-nosuchcaller": "Entärne Fähler: Dä Oprohfer „$1“ känne mer nit.",
        "passwordreset-invalidemail": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "saveprefs": "Faßhalde",
        "restoreprefs": "Donn en alle Afschnedde alles op der Schtandatt retuur schtälle",
        "prefs-editing": "Beim Beärbeijde",
-       "rows": "Reihe:",
-       "columns": "Spalte:",
        "searchresultshead": "Beim Söhke",
        "stub-threshold": "Lengks zopaß för klein Sigge ($1) fomatehre av esu vill <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>:",
        "stub-threshold-sample-link": "Beijschpell_Lengk",
        "userrights-reason": "Aanlaß odder Jrund:",
        "userrights-no-interwiki": "Do häs nit dat Rääsch, Metmaacher ier Rääschte in ander Wikis ze ändere.",
        "userrights-nodatabase": "De Datebank „<strong>$1</strong>“ is nit doh, oder se litt op enem andere ẞööver.",
-       "userrights-nologin": "Do moss als ene Wiki-Köbes [[Special:UserLogin|enjelog sin]], för dat De Metmaacher ier Rääschte ändere kanns.",
-       "userrights-notallowed": "Do häs nit dat Rääsch, Rääschde aan Metmaacher ze verdeile udder se fott ze nämme.",
        "userrights-changeable-col": "{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns",
        "userrights-unchangeable-col": "{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns",
        "userrights-irreversible-marker": "$1 *",
        "userrights-conflict": "Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr_ens, wann nüüdesch.",
-       "userrights-removed-self": "Do häs Ding Rääsch dohzoh jraad drannjejovve, dröm kanns De heh di Sigg nit mih oprohfe.",
        "group": "Jropp:",
        "group-user": "Metmaacher",
        "group-autoconfirmed": "Bestätichte Metmaacher",
        "right-siteadmin": "De Dahtebangk deeschmaache un opmaache för Änderonge",
        "right-override-export-depth": "Beim Sigge Expoteere de Sigge metnämme, woh Lingks drop jon — beß fönef Schredde wigk",
        "right-sendemail": "<i lang=\"en\">e-mail</i> aan ander Metmaacher schecke",
-       "right-passwordreset": "De <i lang=\"en\">e-mails</i> vum Paßwoot neu Säze aanloore",
        "right-managechangetags": "[[Special:Tags|Kännzeijsche]] aanlähje udder ußschallde",
        "right-applychangetags": "[[Special:Tags|Makehronge]] met de eije Änderonge zersamme verjävve",
        "right-changetags": "[[Special:Tags|Makehronge]] vun Väsjohne un Enndrähsche em Logbohch fott nämme un zohföhje",
        "uploaded-setting-handler-svg": "Mer han „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1=\"$2\"</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge. Esu en Datteije, di de Eijeschaff „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">handler</code>“ op ein vun „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">remote/data/script</code>“ säz sin jeschpächt.",
        "uploaded-remote-url-svg": "\n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Datteije di öhnds_e „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">style</code>“-Ellemänt obb_en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> ußerhallef vum Wikki säze sin verbodde un jeschpächt. Mer han \n„<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1=\"$2\"</code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
        "uploaded-image-filter-svg": "Mer han ene Belder_Felter met däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">&lt;$1 $2=\"$3\"&gt;</code> en dä huhjelahde \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
-       "uploadscriptednamespace": "De aanjejovve <i lang=\"en\" xml:lang=\"en\">SVG</i>-Dattei benöds dä verbodde Nahme-Roum „$1“",
+       "uploadscriptednamespace": "De aanjejovve <i lang=\"en\" xml:lang=\"en\">SVG</i>-Dattei benöds dä verbodde Nahme-Roum „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "Dat <i lang=\"en\" xml:lang=\"en\">XML</i> en dä huh jelaade Dattei kunnt wohr nit en Oodenong beim Ongersöhke.",
        "uploadvirus": "Esu ene Dress:\n<br />\nEn dä Datei stich e Kompjutervirus!\n<br />\nDe Einzelheite: $1",
        "uploadjava": "Dat es en Sammel_Dattei em ZIP-Fommaat, woh en Java-.class-Datei dren shtich.\nJava-Datteie huhlaade es nit zohjelohße, weil mer domet de Enshtellunge ömjonn kann, di der ẞörver schöze un däm sing Sescherheit jarranteere.",
        "feedback-useragent": "Dä Brauser:",
        "searchsuggest-search": "Söhke",
        "searchsuggest-containing": "dren änthallde…",
-       "api-error-badaccess-groups": "Do häs nit et Rääsch, Datteije en heh dat Wiki huhzelaade.",
        "api-error-badtoken": "Fähler: et Kännzeijsche (<i lang=\"en\">token</i>) es kappott.",
-       "api-error-blocked": "Do bes föh et Änndere jeschpächt.",
-       "api-error-copyuploaddisabled": "Et Huhlaade vun enem <i lang=\"en\">URL</i> es op däm ẞööver heh nit zohjelohße.",
-       "api-error-duplicate": "Mer han em Wiki ald {{PLURAL:$1|[en Dattei]|[$1 andere Datteije]|[kein Dattei]}} mem akeraat sellve Enhalldt.",
-       "api-error-duplicate-archive": "Mer hatte {{PLURAL:$1|[en ander Dattei]|[ander Datteije]|[kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.",
-       "api-error-empty-file": "En dä huhjelaade Dattei wohr jaa_nix dren.",
        "api-error-emptypage": "Neu läddijje Sigge aanzelääje es verbodde.",
-       "api-error-fetchfileerror": "Fähler: Beim eronger Lahde hät jät nit jeflupp.",
-       "api-error-fileexists-forbidden": "En Dattei mem Name „$1“ es ald doh un mer künne se nit övverschriive.",
-       "api-error-fileexists-shared-forbidden": "En Dattei mem Name „$1“ es ald en ene jemeinsamme Sammlong, un mer künne se nit övverschriive.",
-       "api-error-file-too-large": "De huhjelaade Dattei wohr ze jruß.",
-       "api-error-filename-tooshort": "Der Name för di Dattei es ze koot.",
-       "api-error-filetype-banned": "Di Zoot Dattei es nit zohjelohße.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Dat Dateifommaat|De Dateifommaate|}} $1 wulle mer nit huhjelaade krijje. Älaup {{PLURAL:$3|es|sin_er|}}: $2",
-       "api-error-filetype-missing": "Dä Dattei iehre Nahme hät kein Ändong.",
-       "api-error-hookaborted": "Ding Änderong wood vun enem Zohsazprojramm nit zohjelohße.",
-       "api-error-http": "Fähler: Mer krijje kein Verbendung mem ẞööver.",
-       "api-error-illegal-filename": "Der Name för di Dattei es verbodde.",
-       "api-error-internal-error": "Fähler: Noh em Huhlaade en et Wiki es em Wiki jät scheif jeloufe.",
-       "api-error-invalid-file-key": "Fähler: En Dattei wohr nit em Zwescheschpeischer ze fenge.",
-       "api-error-missingparam": "Fähler: Doh fähle Parrameetere en däm, wat aan dä ẞööver övvermeddelt woode es.",
-       "api-error-missingresult": "Fähler: Mer kunnte nit eruß krijje, ob et Koppeere joht jejange wohr.",
-       "api-error-mustbeloggedin": "För Datteije huh_ze_laade moß de ald enjelogg sinn.",
-       "api-error-mustbeposted": "Fähler: Mer hätt dat mt <code lang=\"en\">HTTP POST</code> schecke mößße.",
-       "api-error-noimageinfo": "Et Huhlaade hät jeflupp, ävver der ẞööver hät ons övver di Dattei nix verzallt.",
-       "api-error-nomodule": "Fähler: Mer han kei Modul för et Huhlssde faßjelaat.",
-       "api-error-ok-but-empty": "Fähler: Mer krijje kein Antwoot vum ẞööver.",
-       "api-error-overwrite": "En Dattei ze övverschrieve es nit zohjelohße.",
-       "api-error-stashfailed": "Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.",
        "api-error-publishfailed": "Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.",
-       "api-error-stasherror": "Ene Fähler es opjetrodde, wi mer di Dattei en der Bunker huh aam lahde wohre.",
-       "api-error-stashedfilenotfound": "Di Dattei wohd em Bunker nit jefonge, wi mer se vun doh huh lahde wullte.",
-       "api-error-stashpathinvalid": "Di Dattei wohd em Bunker nit jefonge, weil dä Pad do hen nit jeschtemmp hät.",
-       "api-error-stashfilestorage": "Ene Fähler es opjetrodd, wi mer di Dattei en der Bunker donn wullte.",
-       "api-error-stashzerolength": "Dä ẞööver kunnt di Dattei nit en der Bunker donn, weil en dä Dattei nix dren schtund.",
-       "api-error-stashnotloggedin": "Do moß enjelogg sin, öm huhjelahde Datteije en der Bunker ze donn.",
-       "api-error-stashwrongowner": "Di Dattei em Bunker woh De draan wells, di jehürt Der nit.",
-       "api-error-stashnosuchfilekey": "Dä Schlößel fö_di Dattei, woh De draan wells, em Bunker, di jidd_et nit.",
-       "api-error-timeout": "Dä ẞööver hät en dä jewennde Zick nit jeantwoot.",
-       "api-error-unclassified": "Ene Fähler es opjetrodde, der mer nit kenne.",
-       "api-error-unknown-code": "Nit bekannte Fähler: „$1“",
-       "api-error-unknown-error": "Fähler: Mer han et Huhlaade versöhk, ävver et es jät donävve jejange.",
+       "api-error-stashfailed": "Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.",
        "api-error-unknown-warning": "En onbikannte Warnong: $1",
        "api-error-unknownerror": "Ene onbikannte Fähler: „$1“",
-       "api-error-uploaddisabled": "Et Huhlaade es en heh däm Wiki nit zohjelohße.",
-       "api-error-verification-error": "Di Dattei künnt kappott sin, udder en verkehte Endong em Nahme han.",
        "duration-seconds": "{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}",
        "duration-minutes": "{{PLURAL:$1|ein&nbsp;Menot|$1&nbsp;Menotte|kein&nbsp;Menot}}",
        "duration-hours": "{{PLURAL:$1|en&nbsp;Schtond|$1&nbsp;Schtonde|kein&nbsp;Schtond}}",
index 9317066..2180402 100644 (file)
        "history": "Dîroka rûpelê",
        "history_short": "Dîrok",
        "updatedmarker": "ji serdana min a dawî ve hate rojanekirin",
-       "printableversion": "Guhertoya bo çapkirinê",
+       "printableversion": "Guhertoya çapkirinê",
        "permalink": "Girêdana daîmî",
        "print": "Çap",
        "view": "Bibîne",
        "editing": "\"$1\" tê guherandin",
        "creating": "\"$1\" tê çêkirin",
        "editingsection": "\"$1\" (beş) tê guherandin",
-       "editingcomment": "$1 (beşek nû) tê guherandin.",
+       "editingcomment": "\"$1\" (beşek nû) tê guherandin.",
        "editconflict": "Têkçûna guherandinan: $1",
        "explainconflict": "Ji dema te dest bi guherandinê kir heta niha kesekê/î din ev rûpel guherand.\nLi jor guhertoya heyî tê dîtîn.\nGuherandinên te li jêr tên nîşandan.\nDivê tu wan bikî yek.\nHeke niha tomar bikî, '''bi tenê''' nivîsara qutiya jor wê bê tomarkirin.",
        "yourtext": "Nivîsara te",
        "rcshowhideanons-show": "nîşan bide",
        "rcshowhideanons-hide": "veşêre",
        "rcshowhidepatr": "Guherandinên kontrolkirî $1",
-       "rcshowhidepatr-show": "Nîşan bide",
-       "rcshowhidepatr-hide": "Veşêre",
+       "rcshowhidepatr-show": "nîşan bide",
+       "rcshowhidepatr-hide": "veşêre",
        "rcshowhidemine": "Guherandinên min $1",
        "rcshowhidemine-show": "nîşan bide",
        "rcshowhidemine-hide": "veşêre",
        "sp-contributions-hideminor": "Guherandinên biçûk veşêre",
        "sp-contributions-submit": "Lêgerîn",
        "whatlinkshere": "Girêdanên li ser vê rûpelê",
-       "whatlinkshere-title": "Rûpelan, yê berve $1 tên",
+       "whatlinkshere-title": "Rûpelên ku yê berve \"$1\" tên",
        "whatlinkshere-page": "Rûpel:",
        "linkshere": "Ev rûpel tên ser vê rûpelê '''[[:$1]]''':",
        "nolinkshere": "Ne ji rûpelekê lînk tên ser '''[[:$1]]'''.",
        "ilsubmit": "Lêgerîn",
        "bydate": "li gor dîrokê",
        "sp-newimages-showfrom": "Daneyên nû ji dema $1, saet $2 ve bibîne",
+       "seconds-abbrev": "$1 s",
+       "hours-abbrev": "$1 st",
+       "days-abbrev": "$1 r",
+       "seconds": "{{PLURAL:$1|$1 saniye}}",
+       "hours": "{{PLURAL:$1|$1 saet|$1 saet}}",
+       "days": "{{PLURAL:$1|$1 roj}}",
        "weeks": "{{PLURAL:$1|$1 hefte}}",
        "months": "{{PLURAL:$1|$1 meh}}",
        "years": "{{PLURAL:$1|$1 sal}}",
        "searchsuggest-containing": "dihundirîne...",
        "api-error-unknownerror": "Çewtiya nenas: \"$1\".",
        "duration-years": "$1 {{PLURAL:$1|sal}}",
+       "duration-centuries": "$1 {{PLURAL:$1|sedsal}}",
        "expand_templates_output": "Encam",
        "expand_templates_ok": "Baş e",
        "expand_templates_preview": "Pêşdîtin",
index 18d958d..32af23f 100644 (file)
        "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Aäit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
        "missingcommenttext": "Gitt w.e.g. eng Bemierkung an.",
        "missingcommentheader": "<strong>Denkt drun:</strong> Dir hutt kee Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
-       "summary-preview": "Resumé kucken ouni ofzespäicheren:",
-       "subject-preview": "Sujett kucken:",
+       "summary-preview": "Resumé vun der Ännerung kucken ouni ze späicheren:",
+       "subject-preview": "Sujet kucken ouni ze späicheren:",
        "previewerrortext": "Beim Versuch fir Är Ännerungen ze weisen, ass e Feeler geschitt.",
        "blockedtitle": "Benotzer ass gespaart",
        "blockedtext": "Äre Benotzernumm oder Är IP-Adress gouf gespaart.\n\nD'Spär gouf vum $1 gemaach. Als Grond gouf ''$2'' uginn.\n\n* Ufank vun der Spär: $8\n* Enn vun der Spär: $6\n* Spär betrëfft: $7\n\nDir kënnt den/d' $1 kontaktéieren oder ee vun den aneren [[{{MediaWiki:Grouppage-sysop}}|Administrateure]] fir iwwer d'Spär ze schwätzen.\n\nDëst sollt Der besonnesch maachen, wann Der d'Gefill hutt, datt de Grond fir d'Spären net bei Iech läit.\nD'Ursaach dofir ass an deem Fall, datt der eng dynamesch IP hutt, iwwer en Access-Provider, iwwer deen och aner Leit fueren.\nAus deem Grond ass et recommandéiert, sech e Benotzernumm zouzeleeën, fir all Mëssverständnes z'evitéieren.\n\nDir kënnt d'Funktioun \"Dësem Benotzer eng E-Mail schécken\" nëmme benotzen, wann Dir eng gëlteg E-Mail Adress bei Ären [[Special:Preferences|Astellungen]] aginn hutt.\nÄr aktuell IP-Adress ass $3 an d'Nummer vun der Spär ass #$5.\nSchreift all dës Informatioune w.e.g. bei all Ufro derbäi.",
        "search-interwiki-caption": "Schwësterprojeten",
        "search-interwiki-default": "Resultater vu(n) $1:",
        "search-interwiki-more": "(méi)",
+       "search-interwiki-more-results": "méi Resultater",
        "search-relatedarticle": "A Verbindung",
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "userrights-user-editname": "Benotzernumm uginn:",
        "editusergroup": "Benotzergruppe lueden",
        "editinguser": "Ännere vun de Rechter vum  {{GENDER:$1|Benotzer}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Benotzergruppen änneren",
-       "userrights-viewusergroup": "Benotzergruppe weisen",
+       "userrights-editusergroup": "{{GENDER:$1|Benotzer}}gruppen änneren",
+       "userrights-viewusergroup": "{{GENDER:$1|Benotzer}}gruppe weisen",
        "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 derbäigesat ass oder gouf.",
+       "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-reason": "Grond:",
        "userrights-no-interwiki": "Dir hutt net déi néideg Rechter, fir d'Rechter vu Benoutzer op anere Wikien z'änneren.",
        "userrights-nodatabase": "D'Datebank $1 gëtt et net oder se ass net lokal.",
        "userrights-changeable-col": "Gruppen déi Dir ännere kënnt",
        "userrights-unchangeable-col": "Gruppen déi Dir net ännere kënnt",
+       "userrights-expiry-current": "Bis $1",
        "userrights-expiry-none": "Leeft net of",
        "userrights-expiry": "Valabel bis:",
+       "userrights-expiry-othertime": "Aner Zäit:",
+       "userrights-expiry-options": "1 Dag:1 day,1 Woch:1 week,1 Mount:1 month,3 Méint:3 months,6 Méint:6 months,1 Joer:1 year",
        "userrights-conflict": "Konflikt bei de Benotzerrechter! Kuckt Är Ännerunge w.e.g. no a maacht se w.e.g. nach eng Kéier.",
        "group": "Grupp:",
        "group-user": "Benotzer",
        "rcfilters-search-placeholder": "Rezent Ännerunge filteren (duerchsichen oder ufänke mat tippen)",
        "rcfilters-invalid-filter": "Net valabele Filter",
        "rcfilters-filterlist-title": "Filteren",
+       "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
        "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
        "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
        "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
        "upload-scripted-pi-callback": "Et ass net méiglech XML-Fichieren eropzelueden an deenen XML-Stylesheet Instruktioune fir d'Verschaffen drastinn",
        "uploaded-hostile-svg": "Net sécheren CSS am Stilelement vum eropgeluedene SVG-Fichier fonnt.",
        "uploaded-image-filter-svg": "Bildfilter mat der URL: <code>&lt;$1 $2=\"$3\"&gt;</code> am eropgeluedenen SVG-Fichier fonnt.",
-       "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"$1\"",
+       "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "Den XML am eropgelueden Fichier konnt net verschafft ginn.",
        "uploadvirus": "An dësem Fichier ass ee Virus! Detailer: $1",
        "uploadjava": "An dësem ZIP-Fichier ass e JAVA CLASS-Fichier dran.\nD'Eropluede vu JAVA-Fichieren ass net erlaabt, well si d'Ëmgoe vu Sécherheetsmoossnamen erméigleche kënnen.",
        "apisandbox-sending-request": "Schécke vun der API-Ufro...",
        "apisandbox-loading-results": "Ofruffe vun den API-Resultater...",
        "apisandbox-request-url-label": "URL fir Ufroen:",
+       "apisandbox-request-json-label": "JSON-Ufro:",
        "apisandbox-request-time": "Dauer vun der Ufro: {{PLURAL:$1|$1 ms}}",
        "apisandbox-alert-page": "Felder op dëser Säit sinn net valabel.",
        "apisandbox-alert-field": "De wäert vun dësem Feld ass net valabel.",
        "editcomment": "De Resumé vun der Ännerung war: <em>$1</em>.",
        "revertpage": "Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]",
        "revertpage-nouser": "Zréckgesaten Ännerungen duerch e verstoppte Benotzer op déi lescht Versioun vum {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "D'Ännerunge vum $1 goufen zréckgesat op déi lescht Versioun vum $2.",
+       "rollback-success": "D'Ännerunge vum {{GENDER:$3|$1}} goufen zréckgesat op déi lescht Versioun vum {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Zréckgesat Ännerunge vum $1:\nzréckgeännert op déi lescht Versioun vum $2. [$3 Ännerunge weisen]",
        "sessionfailure-title": "Setzungsfeeler",
        "sessionfailure": "Et schéngt e Problem mat Ärer Loginseance ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Seance piratéiert ka ginn.\nKlickt w.e.g. op \"Zréck\" a luet déi Säit vun där Dir komm sidd nei, a versicht et dann nach eng Kéier.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|huet}} d'{{PLURAL:$7|Markéierung|Markéierunge(n)}} $6 op d'Versioun $4 vun der Säit $3 dobäigesat",
        "rightsnone": "(keen)",
        "revdelete-summary": "Resumé änneren",
+       "rightslogentry-temporary-group": "$1 (temporär, bis $2)",
        "feedback-adding": "Feedback gëtt bei d'Säit derbäigesat...",
        "feedback-back": "Zréck",
        "feedback-bugcheck": "Super! Kuckt just no ob et net ee vun de scho [$1 bekannte Feeler] ass.",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
        "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Eng Kategorie derbäisetzen...",
+       "mw-widgets-usersmultiselect-placeholder": "Méi derbäisetzen...",
        "sessionprovider-generic": "$1-Sessiounen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-baséiert Sessiounen",
        "sessionprovider-nocookies": "Cookië sinn eventuell desaktivéiert. Vergewëssert Iech datt Dir d'Cookien aktivéiert hutt a probéiert nach eng Kéier.",
index d5033a8..06998ae 100644 (file)
        "uploaded-setting-handler-svg": "o SVG ch'o l'imposta l'attributo \"handler\" con remote/data/script o l'è bloccou. Trovou <code>$1=\"$2\"</code>into file SVG caregou.",
        "uploaded-remote-url-svg": "o SVG ch'o l'imposta qua-se-sæ attributo de stile con di URL remoti o l'è bloccato. Trovou <code>$1=\"$2\"</code> into file SVG caregou.",
        "uploaded-image-filter-svg": "Trovou filtro immaggine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> into file in formato SVG caregou.",
-       "uploadscriptednamespace": "Questo file SVG o conten un namespace '$1' non consentio",
+       "uploadscriptednamespace": "Questo file SVG o conten un namespace '<nowiki>$1</nowiki>' non consentio",
        "uploadinvalidxml": "O codiçe XML into file caregou o no poeu ese elaboou.",
        "uploadvirus": "Questo file o conten un virus! Dettaggi: $1",
        "uploadjava": "Questo file o l'è un file ZIP ch'o conten un file .class Java.\nCaregâ i file Java no l'è consentio, perché poeuan caosâ l'aggiamento de restriçioin de segueçça.",
        "wantedfiletext-nocat-noforeign": "I seguenti file son in doeuvia, ma no existan.",
        "wantedtemplates": "Template domandæ",
        "mostlinked": "Paggine ciû collegæ",
-       "mostlinkedcategories": "Categorîe ciû collegæ",
+       "mostlinkedcategories": "Categorie ciu conligæ",
        "mostlinkedtemplates": "Paggine ciu incluse",
        "mostcategories": "Voxe con ciû categorîe",
        "mostimages": "Immaggini con ciû collegamenti",
        "protectedtitles-summary": "Questa pagina a l'elenca i titoli che son attualmente protetti da-a creaçion. Pe 'n elenco de pagine existente che son protette, amia [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tittoli protezui con sti parammetri pe-o momento no ghe n'è.",
        "protectedtitles-submit": "Mostra tittoli",
-       "listusers": "Lista dtenti",
+       "listusers": "Lista di utenti",
        "listusers-editsonly": "Mostra solo i utenti con di contributi",
        "listusers-creationsort": "Ordina pe dæta de creaçion",
        "listusers-desc": "Ordina in senso decrescente",
index b08935b..24a123d 100644 (file)
        "uploaded-setting-handler-svg": "پرونده SVG تنظیم شده با مشخصهٔ \"handler\"  با remote/data/script بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-remote-url-svg": "پرونده SVG تنظیم شده با remote URL بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
        "uploaded-image-filter-svg": "پالایه پرونده در نشانی:<code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده SVG بارگذاری‌شده یافت شد.",
-       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '<nowiki>$1</nowiki>' است",
        "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
        "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
index 996551b..4a39965 100644 (file)
        "passwordreset-emaildisabled": "چیا هأنی کئ هان د أنجومانامە د ئی ڤیکی ناکونئشتگأر بینە.",
        "passwordreset-username": "نوم کاریاری:",
        "passwordreset-domain": "پوشگئر",
-       "passwordreset-capture": "أنجومانامە نأتیجە نە سئل بأکیت؟",
-       "passwordreset-capture-help": "أر شوما ئی جأڤە نئ ڤارئسی بأکیت.أنجومانامە (ڤا رازینە گوڤاردئن موڤأقأتی) جوٙری کئ سی کاریاریا هأنی کئل بییە دیاری میکە.",
        "passwordreset-email": "تیرنئشوٙن أنجومانامە",
        "passwordreset-emailtitle": "جوزئیات حئساڤ ها د {{نوم مالگە}}",
        "passwordreset-emailtext-ip": "یە کئسی(گاسی خوتوٙ، ڤا تیرنئشوٙن آی پی $1) د نۊ زئنە کئردئن رازینە گوڤاردئنئتوٙ د {{SITENAME}} حاستیتە($4).\nسی کاریار «$2» یئ گئل رازینە گوڤاردئن موڤأقتی رأڤأندیاری بییە و هومبأراڤأر «$3» ە.\nأر دالئتوٙ یە بییە ئیسئ ڤاس بیائیت ڤامین ساموٙنە و یئ گئل رازینە گوڤاردئن هأنی بئهایت.\n رازینە گوڤاردئن {{PLURAL:$3|ئی رازینە یا گوڤاردئن موڤأقأتی|ئی رازینە یا گوڤاردئن موڤأقأتی}} شوما د گات {{PLURAL:$5|یئ روٙ|$5 روٙ}} باطئل بوٙە.\n\nأر کأسی هأنی چئن حاستی داشتە یا یە کئ رازینە گوڤاردئن دئمایی شوما د ڤیرئتوٙ ئوٙما و دە نئمیهایت ڤئنە آلئشت کاری بأکیت، می توٙنیت د ئی پئیغوم تیە پوٙشی بأکیت و هأموٙ رازینە گوڤاردئن دئمایی نە بونیت د کار.",
        "saveprefs": "ئمایە کئردئن",
        "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
        "prefs-editing": "د حال و بال ڤیرایئشت",
-       "rows": "رأگیا:",
-       "columns": "ستينا:",
        "searchresultshead": "پئی جوٙری",
        "stub-threshold": "آستوٙنە ڤیرایئشتکاریا د یأک دیسئسە <a href=\"#\" class=\"stub\">ناقئص</a> (بایت):",
        "stub-threshold-sample-link": "نئموٙنە",
        "userrights-reason": "دألیل:",
        "userrights-no-interwiki": "شما سی ویرایشت حقوق کاریار د ویکی یا هنی دسرسی ناریت.",
        "userrights-nodatabase": "پاگا دونسمنی $1 یا نیئش یا د ولاتنشین نئ.",
-       "userrights-nologin": "شما باید وا یه گل حساو کاریاری دیووندار [[Special:UserLogin|روئیت وامین ]] تا تونستوییت حقوق کاریاری کاریار نه گماشته کاری بکیت.",
-       "userrights-notallowed": "شما سی اضاف کردن  حقوق کاریار یا ورداشتنش دسرسی ناریت.",
        "userrights-changeable-col": "گرویایی که شما تونیت ویرایشت بکید",
        "userrights-unchangeable-col": "گرویایی که شما نتونیت ویرایشت بکید",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "تعارض دسرسیا کاریاری! لطف بکیت یه گل وارسی انجوم بئیت و آلشتانه پشت راس بکیت.",
-       "userrights-removed-self": "شما د خوئی حقوق خوتونه ؤرداشتیته، چی یه که مثلا شما تر نمی تونیت وه ای بلگه دسرسی داشتویت.",
        "group": "جأرغە",
        "group-user": "کاریاریا",
        "group-autoconfirmed": "کاریاریا خود پوشت راس بییە",
        "right-siteadmin": "پاگا دونسمنی نه قلف بکید یا نکید",
        "right-override-export-depth": "وه در دئن بلگه یایی که بلگه یا هوم پیوند بیه تا پی یا 5 ها دشو",
        "right-sendemail": "سی کاریاریا هنی انجومانامه کل بکید",
-       "right-passwordreset": "رازینه گواردن انجومانامه د نو دئه بیه نه بوینیت",
        "right-managechangetags": "راس کئردئن [[Special:سأردیسیا|سأردیسیا]] پاکسا کئردئن د رئسینە جا",
        "right-applychangetags": "ڤئ کار گئرئتئنئ [[Special:سأردیسیا|سأردیسیا]] ڤاگئرد آلئشتیا ھأرکومئشوٙ.",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "php-uploaddisabledtext": "سوارکرد جانیایا د پی اچ پی ناکشتگر بیه.\nلطفن میزونکاری سوارکرد جانیا نه وارسی بکیت.",
        "uploadscripted": "ای بلگه مینونه دار رازینه اچ تی امل یا نیسسه یه که شایت وه ناخوشی وا دوراته نیئر واشکافت با.",
        "upload-scripted-pi-callback": "نأبوٙە جانیایایی کئ د ڤأرگئرئتە آموختارکاری پأردازئشت بألگە یا ئیکس ئم ئلئن سوڤار بأکیت.",
-       "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '$1' داره.",
+       "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '<nowiki>$1</nowiki>' داره.",
        "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.",
        "uploadvirus": "د ای جانیا ویروس هئ!\nجزیات:$1",
        "uploadjava": "ای جانیا یه گل جانیا زیپه که مینونه دار جانیایی د نوع کلاس جاوائه.\nسوارکردن جانیایا جاوا قدقن بیه، سی یه که شایت ونو صلا دور زئن محدودیتیا امنیتی نه بی ئن.",
        "feedback-useragent": "راوط کاریا:",
        "searchsuggest-search": "پی جوری",
        "searchsuggest-containing": "د حال و بار مینونه دار...",
-       "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
        "api-error-badtoken": "خطا مینجا:رازینه امنیتی اشتوا",
-       "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
-       "api-error-duplicate": "{{PLURAL:$1|یه گل جانیا هنی|چن گل جانیا هنی}} د دیارگه وا مینونه هومبراور بی.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|یه گل جانیا هنی|چن گل جانیا هنی}} د دیارگه وا مینونه هومبراور بی.ولی پاکسا {{PLURAL:$1|بیه|بینه}}.",
-       "api-error-empty-file": "جانیایی که دئی ته حالی بی.",
        "api-error-emptypage": "یه گل بلگه تازه راس بکیت،بلگه یا حالی صلادار کاری نیئن.",
-       "api-error-fetchfileerror": "خطا مین کار: د گات گرتن جانیا، یه چی یی خو پیش نرت.",
-       "api-error-fileexists-forbidden": "یه گل جانیا وا نوم \"$1\" هئ و نبوئه ونه دوارته نیسی بکی.",
-       "api-error-fileexists-shared-forbidden": "یه گل جانیا وا نوم \"$1\" ها د جانیا بهر بیه د اماییه گا و نبوئه ونه دوارته نیسی بکی.",
-       "api-error-file-too-large": "جانیایی که دئیته فره گپه.",
-       "api-error-filename-tooshort": "نوم جانیا فره کؤچکه.",
-       "api-error-filetype-banned": "چنی جانیا قدقه بیه.",
-       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یه جور جانیا ناصلاداره|چن جور جانیا ناصلادارن}}. {{PLURAL:$3|جور جانیا صلاداره|چن جور جانیا صلادارن}} چنیه: $2.",
-       "api-error-filetype-missing": "نوم جانیا یه گل دمادیس گم بیه ئه.",
-       "api-error-hookaborted": "آلشکاری که شما میهاستیت ره وندیاریش بکیت وا یه گل دما دیس انجوم شیو بیه.",
-       "api-error-http": "خطا مینجایی:نبوئه د رسینه جا وصل بوئیت.",
-       "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
-       "api-error-internal-error": "خطا مینجاکار: وا پردازشتکاری سوارکرد شما د ویکی ، یه گل اشتوا پیش اوما.",
-       "api-error-invalid-file-key": "خطا مینجاکار: جانیا د اماییه جا موقت نئ.",
-       "api-error-missingparam": "خطا مینجاکار: پارامتریایی که د حاست نیئن.",
-       "api-error-missingresult": "خطا مینجاکار: نبوئه بفمئی که ورداشت کاری خوش سرانجوم بیه یا نه.",
-       "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
-       "api-error-mustbeposted": "خطای مینجاکار: حاستن واس د طریق روشت POST HTTP کل با.",
-       "api-error-noimageinfo": "سوارکرد خوش سرانجوم بی، ولی رسینه جا هیچ جور دونسمنی یی د جانیا وه ایما نه دئه.",
-       "api-error-nomodule": "خطا مینجاکار: ماجول سوارکرد میزونکاری نبیه.",
-       "api-error-ok-but-empty": "خطا مینجاکار: رسینه جا جواوی نده.",
-       "api-error-overwrite": "نیسنن ری یه گل جانیایی که هیئش صلا ندئه بیه",
-       "api-error-stashfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
        "api-error-publishfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
-       "api-error-stasherror": "د گات جا وه جاکاری جانیا سی اماییه کاری یه گل خطا پیش اوما.",
-       "api-error-stashedfilenotfound": "د گاتی که سی سوارکرد جانیا استش تلاش می کردیت، جانیا استش دیاری نکرد.",
-       "api-error-stashpathinvalid": "مسیری که جانیا استش واس د وه با اشتوا بی.",
-       "api-error-stashfilestorage": "د گات اماییه کاری جانیا سی اماییه کاری یه گل خطا پیش اوما.",
-       "api-error-stashzerolength": "رسینه جا نمی تونه جانیا استش نه اماییه بکه سی یه انازه وه صفره.",
-       "api-error-stashnotloggedin": "سی اماییه کاری جانیایا د سوارکرد استش واس روئیت مین سامونه.",
-       "api-error-stashwrongowner": "جانیا کلیتی که شما میهاستیت د وه دسرسی داشتوئیت،مال شما نئ.",
-       "api-error-stashnosuchfilekey": "جانیا کلیتی که شما میهاستیت د وه دسرسی داشتوئیت، نیئش.",
-       "api-error-timeout": "رسینه جا د گات تیه وه را بیین جواوی نده.",
-       "api-error-unclassified": "یه گل خطا نادیار ری ون کرده.",
-       "api-error-unknown-code": "خطا نادیار:\"$1\".",
-       "api-error-unknown-error": "خطا مینونه: د گاتی که شما د حال و بار تلاش سی سوارکرد جانیاتو بییت، یه گل اشتوا پیش اوما.",
+       "api-error-stashfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
        "api-error-unknown-warning": "هشدار نادیار:\"$1\".",
        "api-error-unknownerror": "خطا نادیار:\"$1\".",
-       "api-error-uploaddisabled": "سوار کردن د ای ویکی ناکشتگر بیه.",
-       "api-error-verification-error": "شایت جانیا خراو بیه، یا پسون غلط داشتوئه.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقه یا}}",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتیا}}",
index 1def888..195699d 100644 (file)
        "rcfilters-clear-all-filters": "Valyti visus filtrus",
        "rcfilters-invalid-filter": "Negalimas filtras",
        "rcfilters-filterlist-title": "Filtrai",
+       "rcfilters-highlightmenu-title": "Pasirinkti spalvą",
        "rcfilters-filterlist-noresults": "Nerastas toks filtras",
        "rcfilters-filtergroup-registration": "Vartotojo registracija",
        "rcfilters-filter-registered-label": "Registruoti",
        "uploaded-setting-handler-svg": "SVG, kurie nustato \"handler\" atributą naudodami remote/data/script, yra užblokuoti. Įkeltame SVG faile rasta <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "Užblokuoti SVG, kurie nustato style atributą naudodami nuotolinį URL. Įkeltame SVG faile rasta <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "Įkeltame SVG faile rastas paveikslėlio filtras su URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Šis SVG failas turi neteisėtą vietą vardui '$1'",
+       "uploadscriptednamespace": "Šis SVG failas turi neteisėtą vietą vardui '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML įkeltoje rinkmenoje negali būti išnagrinėtas.",
        "uploadvirus": "Šiame faile yra virusas! Smulkiau: $1",
        "uploadjava": "Ši rinkmena tai ZIP rinkmena, kurioje yra Java .class rinkmena.\nĮkelti Java rinkmenų neleidžiama, nes jos gali padėti apeiti saugumo apribojimus.",
index 06536c9..c0035b9 100644 (file)
@@ -63,7 +63,7 @@
        "tog-watchlisthideanons": "Paslēpt anonīmo dalībnieku labojumus uzraugāmo lapu sarakstā",
        "tog-watchlisthidepatrolled": "Paslēpt pārbaudītās lapas uzraugāmo lapu sarakstā",
        "tog-watchlisthidecategorization": "Paslēpt lapu kategorizēšanu",
-       "tog-ccmeonemails": "Sūtīt sev citiem dalībniekiem nosūtīto epastu kopijas",
+       "tog-ccmeonemails": "Sūtīt sev citiem dalībniekiem nosūtīto e-pastu kopijas",
        "tog-diffonly": "Nerādīt lapu saturu zem izmaiņām",
        "tog-showhiddencats": "Rādīt slēptās kategorijas",
        "tog-norollbackdiff": "Neņemt vērā atšķirības, veicot atriti",
        "searcharticle": "Aiziet!",
        "history": "hronoloģija",
        "history_short": "Vēsture",
+       "history_small": "vēsture",
        "updatedmarker": "atjaunināti kopš pēdējā apmeklējuma",
        "printableversion": "Drukājama versija",
        "permalink": "Pastāvīgā saite",
        "views": "Apskates",
        "toolbox": "Rīki",
        "tool-link-userrights": "Mainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
+       "tool-link-userrights-readonly": "Apskatīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "tool-link-emailuser": "Nosūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
        "userpage": "Skatīt dalībnieka lapu",
        "projectpage": "Skatīt projekta lapu",
        "newarticletext": "Šajā projektā vēl nav lapas ar šādu nosaukumu.\nLai izveidotu lapu, sāc rakstīt teksta logā apakšā (par teksta formatēšanu un sīkākai informācija skatīt [$1 palīdzības lapu]).\nJa tu šeit nonāci kļūdas pēc, vienkārši uzspied <strong>back</strong> pogu pārlūkprogrammā.",
        "anontalkpagetext": "----''Šī ir diskusiju lapa anonīmam dalībniekam, kurš vēl nav kļuvis par reģistrētu dalībnieku vai arī neizmanto savu dalībnieka vārdu. Tādēļ mums ir jāizmanto skaitliskā IP adrese, lai viņu identificētu.\nŠāda IP adrese var būt vairākiem dalībniekiem.\nJa tu esi anonīms dalībnieks un uzskati, ka tev ir adresēti neatbilstoši komentāri, lūdzu, [[Special:CreateAccount|kļūsti par dalībnieku]] vai arī [[Special:UserLogin|izmanto jau izveidotu dalībnieka vārdu]], lai izvairītos no turpmākām neskaidrībām un tu netiktu sajaukts ar citiem anonīmiem dalībniekiem.''",
        "noarticletext": "Šajā lapā šobrīd nav nekāda teksta, tu vari [[Special:Search/{{PAGENAME}}|meklēt citās lapās pēc šīs lapas nosaukuma]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītos reģistru ierakstos] vai arī [{{fullurl:{{FULLPAGENAME}}|action=edit}} sākt rediģēt šo lapu]</span>.",
-       "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot si lapu.",
+       "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot šo lapu.",
        "userpage-userdoesnotexist": "Lietotājs \"<nowiki>$1</nowiki>\" nav reģistrēts.\nLūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.",
        "userpage-userdoesnotexist-view": "Dalībnieks \"$1\" nav reģistrēts.",
        "blocked-notice-logextract": "Šis dalībnieks pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
        "right-unblockself": "Atbloķēt sevi",
        "right-protect": "Izmainīt aizsargātās lapas un to aizsardzības līmeni",
        "right-editprotected": "Labot aizsargātās lapas (bez kaskādes aizsardzības)",
+       "right-editcontentmodel": "Labot lapas satura modeli",
        "right-editinterface": "Izmainīt dalībnieka interfeisu",
        "right-editusercssjs": "Izmainīt citu dalībnieku CSS un JS failus",
        "right-editusercss": "Izmainīt citu dalībnieku CSS failus",
        "right-editmyusercss": "Rediģējiet savus dalībnieka CSS failus",
        "right-editmyuserjs": "Rediģējiet savus dalībnieka JavaScript failus",
        "right-viewmywatchlist": "Apskatīt savu uzraugāmo rakstu sarakstu",
+       "right-viewmyprivateinfo": "Skatit savus privātos datus (piemēram, e-pasta adresi, īsto vārdu)",
+       "right-editmyprivateinfo": "Labot savus privātos datus (piemēram, e-pasta adresi, īsto vārdu)",
+       "right-editmyoptions": "Labot savas izvēles",
        "right-rollback": "Ātri veikt atriti pēdējā dalībnieka labojumiem, kas veica izmaiņas kādā konkrētā lapā",
        "right-markbotedits": "Atzīmēt labojumus, kam veikta atrite, kā bota labojumus",
        "right-noratelimit": "Būt darbību ātruma ierobežojumu neietekmētiem",
        "action-upload_by_url": "augšupielādēt šo failu no URL",
        "action-writeapi": "izmantot rakstīto lietojumprogrammu saskarni",
        "action-delete": "izdzēst šo lapu",
-       "action-deleterevision": "izdzēst šo versiju",
-       "action-deletedhistory": "skatīt šīs lapas dzēsto hronoloģiju",
+       "action-deleterevision": "dzēst versijas",
+       "action-deletelogentry": "dzēst žurnāla ierakstus",
+       "action-deletedhistory": "skatīt šīs lapas dzēsto vēsturi",
        "action-browsearchive": "meklēt dzēstās lapas",
        "action-undelete": "atjaunot šo lapu",
        "action-suppressrevision": "pārskatīt un atjaunot šo slēpto versiju",
        "recentchanges-legend-heading": "<strong>Apzīmējumi:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "recentchanges-submit": "Rādīt",
+       "rcfilters-invalid-filter": "Nederīgs filtrs",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-noresults": "Filtri nav atrasti",
+       "rcfilters-filtergroup-registration": "Lietotāja reģistrācija",
+       "rcfilters-filtergroup-changetype": "Izmaiņu veids",
+       "rcfilters-filter-pageedits-label": "Lapu labojumi",
+       "rcfilters-filter-pageedits-description": "Labojumi vikivietnes saturā, diskusijā, kategoriju aprakstos...",
+       "rcfilters-filter-newpages-label": "Lapu veidošana",
+       "rcfilters-filter-newpages-description": "Labojumi, kas veido jaunas lapas.",
+       "rcfilters-filter-categorization-label": "Kategoriju izmaiņas",
+       "rcfilters-filter-categorization-description": "Ieraksti par lapu pievienošanu vai noņemšanu no kategorijām.",
+       "rcfilters-filter-logactions-label": "Reģistrētās darbības",
+       "rcfilters-filter-logactions-description": "Administratīvās darbības, kontu veidošana, lapu dzēšana, augšupielādes...",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
        "statistics-files": "Augšuplādētie faili",
        "statistics-edits": "Lapu izmaiņas kopš {{grammar:ģenitīvs{{SITENAME}}}} izveidošanas",
        "statistics-edits-average": "Vidējais izmaiņu skaits uz lapu",
-       "statistics-users": "Reģistrēti lietotāji",
+       "statistics-users": "Reģistrēti [[Special:ListUsers|dalībnieki]]",
        "statistics-users-active": "Aktīvi lietotāji",
        "statistics-users-active-desc": "Lietotāji, kas ir veikuši jebkādu darbību {{PLURAL:$1|iepriekšējās $1 dienās|iepriekšējā $1 dienā|iepriekšējās $1 dienās}}",
        "pageswithprop-prop": "Īpašības nosaukums:",
        "apihelp-no-such-module": "Modulis \"$1\" nav atrasts.",
        "apisandbox": "API smilškaste",
        "apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
+       "apisandbox-unfullscreen": "Rādīt lapau",
+       "apisandbox-submit": "Izveidot pieprasījumu",
        "apisandbox-reset": "Notīrīt",
        "apisandbox-retry": "Mēģināt vēlreiz",
        "apisandbox-no-parameters": "Šo API modulim nav parametru.",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametra nosaukums",
        "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
+       "apisandbox-request-json-label": "Pieprasījuma JSON:",
        "apisandbox-request-time": "Pieprasījuma izpildes laiks: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "Turpināt",
        "apisandbox-continue-clear": "Notīrīt",
+       "apisandbox-multivalue-all-namespaces": "$1 (visas vārdtelpas)",
+       "apisandbox-multivalue-all-values": "$1 (visas vērtības)",
        "booksources": "Grāmatu avoti",
        "booksources-search-legend": "Meklēt grāmatu avotus",
        "booksources-search": "Meklēt",
        "listgrouprights-removegroup": "Noņemt {{PLURAL:$2|grupas|grupu|grupas}}: $1",
        "listgrouprights-addgroup-all": "Pievienot visas grupas",
        "listgrouprights-removegroup-all": "Noņemt visas grupas",
+       "listgrouprights-removegroup-self": "Noņemt {{PLURAL:$2|grupu|grupas}} no sava konta: $1",
        "listgrouprights-addgroup-self-all": "Pievienot visas grupas savam kontam",
        "listgrouprights-removegroup-self-all": "Noņemt visas grupas no sava konta",
        "listgrouprights-namespaceprotection-header": "Vārdtelpas ierobežojumi",
        "watchlist-submit": "Rādīt",
        "wlshowhideminor": "maznozīmīgos labojumus",
        "wlshowhidebots": "boti",
-       "wlshowhideliu": "reģistrēti lietotāji",
+       "wlshowhideliu": "reģistrēti dalībnieki",
        "wlshowhideanons": "anonīmi lietotāji",
        "wlshowhidepatr": "pārbaudīti labojumi",
        "wlshowhidemine": "mani labojumi",
        "sp-contributions-blocked-notice-anon": "Šī IP adrese pašlaik ir nobloķēta.\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
        "sp-contributions-search": "Meklēt lietotāju veiktās izmaiņas",
        "sp-contributions-username": "IP adrese vai dalībnieka vārds:",
-       "sp-contributions-toponly": "Rādīt tikai labojumus, kuri ir jaunākās versijas",
+       "sp-contributions-toponly": "Rādīt tikai labojumus, kas ir jaunākās versijas",
        "sp-contributions-submit": "Meklēt",
        "whatlinkshere": "Norādes uz šo rakstu",
        "whatlinkshere-title": "Lapas, kurās ir saites uz lapu \"$1\"",
        "pageinfo-watchers": "Lapas uzraudzītāju skaits",
        "pageinfo-redirects-name": "Pāradresāciju skaits uz šo lapu",
        "pageinfo-subpages-name": "Šīs lapas apakšlapas",
+       "pageinfo-firstuser": "Lapas izveidotājs",
+       "pageinfo-firsttime": "Lapas izveides datums",
        "pageinfo-lastuser": "Pēdējais labotājs",
+       "pageinfo-lasttime": "Pēdējā labojuma datums",
        "pageinfo-edits": "Kopējais izmaiņu skaits",
        "pageinfo-authors": "Kopējais atsevišķu autoru skaits",
        "pageinfo-toolboxlink": "Lapas informācija",
        "pageinfo-category-pages": "Lapu skaits",
        "pageinfo-category-subcats": "Apakškategoriju skaits",
        "pageinfo-category-files": "Failu skaits",
+       "pageinfo-user-id": "Lietotāja ID",
        "markaspatrolleddiff": "Atzīmēt kā pārbaudītu",
        "markaspatrolledtext": "Atzīmēt šo lapu kā pārbaudītu",
        "markedaspatrolled": "Atzīmēta kā pārbaudīta",
        "patrol-log-page": "Pārbaudes reģistrs",
        "patrol-log-header": "Šis ir pārbaudīto versiju reģistrs.",
        "log-show-hide-patrol": "$1 pārbaudes reģistrs",
+       "confirm-markpatrolled-button": "Labi",
        "deletedrevision": "Izdzēstā vecā versija $1",
        "filedeleteerror-short": "Kļūda dzēšot failu: $1",
        "filedeleteerror-long": "Kļūdas, kas radās failu dzēšanas laikā:\n\n$1",
        "feedback-submit": "Iesniegt",
        "feedback-thanks": "Paldies! Jūsu atsauksmes ir ievietotas lapā \"[$2  $1]\".",
        "feedback-thanks-title": "Paldies!",
+       "feedback-useragent": "Lietotāja aģents:",
        "searchsuggest-search": "Meklēt {{SITENAME}}",
        "searchsuggest-containing": "Meklējamā frāze:",
        "api-error-unknown-warning": "Nezināms brīdinājums: $1",
        "api-error-unknownerror": "Nezināma kļūda: \"$1\"",
+       "duration-seconds": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minūtes|minūte|minūtes}}",
+       "duration-hours": "$1 {{PLURAL:$1|stundas|stunda|stundas}}",
+       "duration-days": "$1 {{PLURAL:$1|dienas|diena|dienas}}",
+       "duration-weeks": "$1 {{PLURAL:$1|nedēļas|nedēļa|nedēļas}}",
+       "duration-years": "$1 {{PLURAL:$1|gadi|gads|gadi}}",
+       "duration-decades": "$1 {{PLURAL:$1|desmitgades|desmitgade|desmitgades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|gadsimti|gadsimts|gadsimti}}",
+       "duration-millennia": "$1 {{PLURAL:$1|tūkstošgades|tūkstošgade|tūkstošgades}}",
        "limitreport-title": "Parsētāja profilēšanas dati:",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "limitreport-templateargumentsize": "Veidnes argumenta izmērs",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
        "special-characters-group-gujarati": "Gudžarati",
        "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
        "mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
+       "mw-widgets-categoryselector-add-category-placeholder": "Pievienot kategoriju...",
+       "sessionprovider-generic": "$1 sesijas",
        "authmanager-email-label": "E-pasts",
        "authmanager-email-help": "E-pasta adrese",
        "authmanager-realname-label": "Tavs īstais vārds",
index c997386..ef6dbf2 100644 (file)
        "passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-username": "प्रयोक्तानाम:",
        "passwordreset-domain": "क्षेत्र:",
-       "passwordreset-capture": "परिणाम ई-पत्र देखी?",
-       "passwordreset-capture-help": "जँ अहाँ ई बक्शाकेँ देखै छी, ई-पत्र (तात्कालिक कूटशब्दकसंग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
        "passwordreset-email": "ई-पत्र सङ्केत:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाता विवरण",
        "passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{SITENAME}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि|लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
        "saveprefs": "सङ्ग्रह करी",
        "restoreprefs": "सभटा पूर्वनिर्धारित चयनकेँ फेरसँ आनी",
        "prefs-editing": "सम्पादन कऽ रहल छी",
-       "rows": "पाँतीसभ",
-       "columns": "स्तम्भसभ",
        "searchresultshead": "ताकी",
        "stub-threshold": "आधार लिङ्क हेतु प्रारूपण ($1):",
        "stub-threshold-sample-link": "उदाहरण",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "अहाँकेँ दोसर विकीपर प्रयोक्ता अधिकारकेँ बदलबाक अधिकार नै अछि।",
        "userrights-nodatabase": "दत्तनिधि $1 नै अछि वा स्थानीय नै अछि।",
-       "userrights-nologin": "अहाँ [[Special:UserLogin|सम्प्रवेश]] प्रयोक्ता अधिकार देबा लेल संचालक खातासँ सम्प्रवेश करू।",
-       "userrights-notallowed": "अहाँक खाता दोसराक प्रयोक्ता अधिकारमे कमी बेशी नै करैत अछि।",
        "userrights-changeable-col": "वर्ग जे अहाँ बदलि सकै छी",
        "userrights-unchangeable-col": "वर्ग जे अहाँ नै बदलि सकै छी",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "प्रयोक्ता अधिकार बदलावक समयमे अंतर्विरोध! कृपया अपन बदलाव जाँच करु आ पुनः सुनिश्चित करु।",
-       "userrights-removed-self": "अहाँ सफलतापूर्वक अपन अधिकार हटा देने छी। अतः अहाँ आब ई पृष्ठ नै देख सकैत छी।",
        "group": "समूह:",
        "group-user": "प्रयोक्तासभ",
        "group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता",
        "right-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ",
        "right-override-export-depth": "५ परत धरि जा  पन्ना सभ निर्यात, जइमे लागिबला पन्ना सभ शामिल अछि, करू।",
        "right-sendemail": "ई-पत्र दोसर प्रयोक्ता लोकनिकेँ पठाउ",
-       "right-passwordreset": "कूटशब्द पुनर्निर्धारण ई-पत्र देखू",
        "right-managechangetags": "[[Special:Tags|ट्यागसभ]] बनाबी आ नुकाबी",
        "right-applychangetags": "प्रयोग में लाबू [[Special:Tags|tags]] कक्रो बदलाव के साथ।",
        "right-changetags": "जमा करु आर हटाबु स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरण आर लॉग प्रविक्ति पे",
        "uploadscripted": "ई संचिका पर्यंकभाषा वा कूटलिपि युक्त अछि जे गवेषक द्वारा गलत रूपमे व्याख्यायित कएल जा सकैए।",
        "upload-scripted-pi-callback": "ओ फाइल अपलोड नै केल जा सकैत अछि जाहिमे एक्सएमएल-स्टाइलसिट प्रसंस्करण निर्देश समाविष्ट अछि।",
        "uploaded-script-svg": "अपलोड केल गेल एसभिजी फाइलमे स्क्रिप्ट अवयव \"$1\" पाबल गेल।",
-       "uploadscriptednamespace": "इ एस॰वी॰जी फाइलमे अमान्य नामस्थान \"$1\" अछि।",
+       "uploadscriptednamespace": "इ एस॰वी॰जी फाइलमे अमान्य नामस्थान \"<nowiki>$1</nowiki>\" अछि।",
        "uploadinvalidxml": "अपलोड केएल गेल फाइलमे स्थित XML पार्स नै केएल जा सकैत अछि।",
        "uploadvirus": "ई संचिका विषविधियुक्त अछि।\nवर्णन:$1",
        "uploadjava": "ई संचिका एकटा संकुचित संचिका अछि जइमे अछि एकटा जावा .class संचिका।\nजावा संचिका सभक उपारोपण प्रतिबन्धित अछि, कारण ओ सभ सुरक्षा प्रतिबन्ध सभ छी जकरासँ ई तड़पल जा सकैए।",
        "feedback-useragent": "सदस्य कर्ता:",
        "searchsuggest-search": "ताकी",
        "searchsuggest-containing": "...सऽ युक्त",
-       "api-error-badaccess-groups": "अहि विकी सें अहां कोनो प्रारूप लोड नहि क सकब.",
        "api-error-badtoken": "आन्तरिक त्रुटि: खराब टोकन।",
-       "api-error-copyuploaddisabled": "युआरयलद्वारा इ सर्वर पर अपलोड अक्षम अछि।",
-       "api-error-filename-tooshort": "ई संचिका नाम बड छोट अछि |",
-       "api-error-filetype-banned": "ऐ तरहक संचिका नाम प्रतिबंधित  अछि।",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|मान्य संचिका प्रकार नै अछि|मान्य संचिका प्रकार सभ नै अछि}}। मान्य अछि {{PLURAL:$3|संचिका प्रकार अछि|संचिका प्रकार सभ अछि}} $2।",
-       "api-error-http": "आन्तरिक भ्रम: वितरकसँ सम्पर्क करबामे असफल",
-       "api-error-illegal-filename": "ऐ तरहक संचिका नाम अमान्य अछि।",
-       "api-error-mustbeloggedin": "अहाँ के फाइल अपलोड करए के लेल सम्प्रवेष करए पडत।",
-       "api-error-mustbeposted": "आन्तरिक भ्रम: आग्रहक लेल परिपाठ्य संचार संविद पाठ चाही।",
-       "api-error-nomodule": "आन्तरिक भ्रम: कोनो उपारोपण तरीका निर्धारित नै अछि।",
-       "api-error-ok-but-empty": "आन्तरिक भ्रम: वितरकसँ कोनो सम्पर्क नै",
-       "api-error-unclassified": "एकटा अबूझ भ्रम आएल",
-       "api-error-unknown-code": "अबूझ भ्रम:\"$1\"",
        "api-error-unknown-warning": "अज्ञात चेतौनी: $1",
        "api-error-unknownerror": "अज्ञात भ्रम:\"$1\"",
-       "api-error-uploaddisabled": "ऐ विकीपर उपारोपण अशक्त कएल गेल अछि।",
        "expand_templates_output": "परिणाम",
        "expand_templates_xml_output": "XML आउटपुट",
        "expand_templates_ok": "ठीक अछि",
index 74f57ae..5f512ff 100644 (file)
@@ -26,6 +26,7 @@
        "tog-watchdefault": "Hanaraka ny pejy ary ny rakitra ovaiko",
        "tog-watchmoves": "Hanaraka ny pejy ary ny rakitra ovaiko anarana",
        "tog-watchdeletion": "Hanaraka ny pejy ary ny rakitra voafafako",
+       "tog-watchuploads": "Ampiana amin'ny pejy arahako ireo rakitra vaovao nalefako",
        "tog-watchrollback": "Hanaraka pejy nanaovako famoana",
        "tog-minordefault": "Mariho ho madinika foana aloha ny fanovana rehetra",
        "tog-previewontop": "Asehoy alohan'ny boaty fanovana ny tsipalotra",
@@ -35,7 +36,7 @@
        "tog-enotifminoredits": "Andefasana imailaka na dia fanovana madinika aza no atao amin'ny pejy sy ny rakitra",
        "tog-enotifrevealaddr": "Asehoy ny adiresy imailako any amin'ny imailaka fampilazana",
        "tog-shownumberswatching": "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
-       "tog-oldsig": "Topi-mason'ny sonia :",
+       "tog-oldsig": "Topi-mason'ny sonianao :",
        "tog-fancysig": "Sonia tsotra (tsy misy rohy)",
        "tog-uselivepreview": "Hampiasa ny topi-maso mivantana",
        "tog-forceeditsummary": "Teneno ahy ra tsy nametraka ny ambangovangony",
@@ -50,7 +51,7 @@
        "tog-ccmeonemails": "Andefaso tahaka ny imailaka alefako amin'ny mpikambana hafa",
        "tog-diffonly": "Aza ampiseho ny voatonin'ny pejy eo amban'ny diff",
        "tog-showhiddencats": "Asehoy ny sokajy misitrika",
-       "tog-norollbackdiff": "Aza aseho ny diff rehefa avy namafa fanàvana iray",
+       "tog-norollbackdiff": "Aza aseho ny fahasamihafana aorian'ny famoanana",
        "tog-useeditwarning": "Ampitandremo aho raha miala sady mamela pejy ovaiko nefa tsy notahiriziko",
        "tog-prefershttps": "Fanohizana azo antoka foana no ampaisaina rehefa tafiditra",
        "underline-always": "Foana foana",
        "newwindow": "(sokafy anaty takila hafa)",
        "cancel": "Aoka ihany",
        "moredotdotdot": "Tohiny...",
-       "morenotlisted": "Tsy feno ity lisitra ity.",
+       "morenotlisted": "Mety tsy feno ity lisitra ity.",
        "mypage": "Pejy",
        "mytalk": "Dinika",
        "anontalk": "Pejin-dresaka",
        "tagline": "Avy amin'i {{SITENAME}}",
        "help": "Fanoroana",
        "search": "Tadiavo",
+       "search-ignored-headings": "#<!-- Avelao ho toa izao ity andalana ity --> <pre>\n# Ny lohatenim-pizarana dia tsy horaharahiana amin'ny karoka.\n# Ny fiovana atao eto dia hihatra rehefa voasoratra ao amin'ny tondro ilay pejy miaraka amin'ilay lohateny.\n# Azonao atao ny famerenana an-tondro an'ilay pejy amin'ny alalan'ny fanovana tsy misy inona inona.\n# Ny rariteny dia ireo manaraka:\n# *Izay andalana rehetra manomboka amin'ny \"#\" dia resaka\n# *Izay andalana tsy fotsy dia lohateny tsy horaharahiana, iaraka amin'ny haben-tsoratra\nTsiahy\nRohy ivelany\nJereo koa\n#</pre> <!-- Avelao ho toa izao ity andalana ity -->",
        "searchbutton": "Tadiavo",
        "go": "Ndao",
        "searcharticle": "Tsidiho",
        "history": "Tantaran'ny pejy",
        "history_short": "Tantara",
+       "history_small": "tantara",
        "updatedmarker": "niova hatry ny tsidiko farany",
        "printableversion": "Ny votoatiny azo atonta printy",
        "permalink": "Rohy maharitra",
        "talk": "dinika",
        "views": "Fijerena",
        "toolbox": "Fitaovana",
+       "tool-link-userrights": "Hanova ny vondron'i {{GENDER:$1|}}mpikambana",
+       "tool-link-userrights-readonly": "Hijery ny vondron'ny mpikambana{{GENDER:$1|}}",
+       "tool-link-emailuser": "Handefa mailaka an'ity mpikambana ity{{GENDER:$1|}}",
        "userpage": "Hijery ny pejy manokan'ny mpikambana",
        "projectpage": "Pejy meta",
        "imagepage": "Jereo ny pejin'ny sary",
        "missingarticle-rev": "(famerenana faha : $1)",
        "missingarticle-diff": "(diff : $1 ; $2)",
        "readonly_lag": "\nMihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tompony",
+       "nonwrite-api-promise-error": "Ny loha HTTP \"<code>Promise-Non-Write-API-Action:</code>\" dia nalefa fa tsy natao tany amina module fanoratana API ny hataka",
        "internalerror": "Tsy fetezana anatin'ny rindrankajy",
        "internalerror_info": "Tsy fetezana ety anatiny : $1",
        "internalerror-fatal-exception": "Karazana-kadisoana nampijanona \"$1\"",
        "createacct-yourpasswordagain-ph": "Mbola ampidiro fanindroany ny tenimiafinao",
        "userlogin-remembermypassword": "Tadidio aho",
        "userlogin-signwithsecure": "Fidirana amin'ny alalan'ny fanohizana azo antoka",
+       "cannotlogin-title": "Tsy afaka miditra",
+       "cannotlogin-text": "Tsy afaka atao ny fidirana",
        "cannotloginnow-title": "Tsy afaka miditra izao",
        "cannotloginnow-text": "Tsy afaka miditra rehefa mampiasa $1.",
+       "cannotcreateaccount-title": "Tsy afaka mamorona kaonty",
+       "cannotcreateaccount-text": "Tsy ampiasaina eto amin'ty wiki ity ny famoronana kaontim-pikambana avy hatrany.",
        "yourdomainname": "faritra (domaine) misy anao",
        "password-change-forbidden": "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
        "externaldberror": "Nisy tsy fetezana angamba teo amin'ny fanamarinana anao tamin'ny sehatra ivelan'ity wiki ity, na tsy manana alalana hanova ny kaontinao ivelany ianao.",
        "login": "Midira",
+       "login-security": "Hamarino ny famantarana anao",
        "nav-login-createaccount": "Ampidiro ny solonanarana",
        "userlogin": "Hiditra na hanokatra kaonty",
        "userloginnocreate": "hiditra",
        "userlogin-resetpassword-link": "Hadino ny tenimiafina?",
        "userlogin-helplink2": "Fanampiana amin'ny fidirana",
        "userlogin-loggedin": "Efa tafiditra amin'ny anaran'i {{GENDER:$1|$1}} ianao. Ampiasao ny fôrmiolera eo ambany raha hiditra amin'ny anaran'ny mpikambana hafa.",
+       "userlogin-reauth": "{{GENDER:$1|}}Tsy maintsy miditra indray ianao mba ahafantarana hoe $1 ianao.",
        "userlogin-createanother": "Hamorona kaonty hafa",
        "createacct-emailrequired": "Adiresy mailaka :",
        "createacct-emailoptional": "Adiresy mailaka (azo tsy atao) :",
        "createacct-email-ph": "Atsofohy ny adiresy mailakao",
        "createacct-another-email-ph": "Atsofohy ny adiresy mailaka",
        "createaccountmail": "Hampiasa tenimiafina vonjimaika ary handefa azy eo amin'ny adiresy mailaka voalaza",
+       "createaccountmail-help": "Azo ampiasaina amin'ny famoronana kaonty ho an'olon-kafa tsy mila mahafantatra ny tenimiafina.",
        "createacct-realname": "Tena anarana (azo tsy atao)",
        "createaccountreason": "Antony :",
        "createacct-reason": "Antony",
        "createacct-reason-ph": "Inona ny antony hamoronanao kaonty hafa",
+       "createacct-reason-help": "Hafatra ho aseho ao amin'ny laogim-pamoronan-kaonty",
        "createacct-submit": "Hamorona ny kaontinao",
        "createacct-another-submit": "Hamorona kaonty vaovao",
+       "createacct-continue-submit": "Hanohy ny famoronan-kaonty",
+       "createacct-another-continue-submit": "Hanohy ny famoronan-kaonty",
        "createacct-benefit-heading": "Olona tahaka ianao no manoratra eo amin'i {{SITENAME}}",
        "createacct-benefit-body1": "fanovana{{PLURAL:$1}}",
        "createacct-benefit-body2": "pejy{{PLURAL:$1}}",
        "nocookiesnew": "Voasikatra ny kaontim-pikambana, fa tsy tafiditra amin'ny kaontinao ianao.\nMampiasa cookies ny {{SITENAME}} ho an'ny fidirana amin'ny kaonty.\nTsy avelanao mandeha ny cookies.\nAvelao mandeha ny fampidirana cookies, ary midira amin'ny kaontinao.",
        "nocookieslogin": "Mampiasa cookies i {{SITENAME}} nefa ny mpiteti-tranonkalanao no tsy manaiky na mandà azy. Ovay mba hanaiky cookies aloha ny mpiteti-tranonkalanao dia aveo manandrama mihiditra ato indray.",
        "nocookiesfornew": "Tsy mbola noforonina ilay kaontim-pikambana, satria tsy afaka marinanay ilay loharanony.\nMarino tsara raha mahazo mametraka cookie ao amin'ny kompioteranao ny sehata, dia havaozy ilay pejy",
+       "createacct-loginerror": "Noforonina soa aman-tsara ity kaonty ity fa tsy tafiditra ho azy ianao. Midira amin'ny alalan'ny [[Special:UserLogin|pejy fidirana]] azafady.",
        "noname": "Tsy nanome solonanarana mety ianao.",
        "loginsuccesstitle": "Tafiditra soa aman-tsara",
        "loginsuccess": "'''Tafiditra amin'ny {{SITENAME}} ianao ry \"$1\".'''",
-       "nosuchuser": "Tsy misy mpikambana manana izany solonanarana \"$1\" izany. Hamarino ny tsipelina na manokafa kaonty vaovao.",
+       "nosuchuser": "Tsy misy mpikambana manana izany solonanarana \"$1\" izany.\nManavaka ny renisoratra sy ny zanatsoratra ny anaram-pikambana.\nHamarino ny tsipelina na [[Special:CreateAccount|manokafa kaonty vaovao]].",
        "nosuchusershort": "Tsy misy mpikambana hoe \"$1\". Hamarino ny tsipelina.",
        "nouserspecified": "Tsy maintsy mampiditra solonanarana ianao.",
        "login-userblocked": "Voasakana io mpikambana io. Fidirana tsy nahazoan-dalana.",
        "wrongpasswordempty": "Tsy nampiditra tenimiafina ianao, azafady mba avereno indray.",
        "passwordtooshort": "{{PLURAL:}}Fohy loatra io tenimiafina io.\nFarafahakeliny tokony hisy litera $1 ny tenimiafina.",
        "passwordtoolong": "Tsy azo atao ho lava noho ny soratra {{PLURAL:$1|iray|$1}} ny tenimiafina.",
+       "passwordtoopopular": "Tsy azo ampiasana ny tenimiafina ampiasaina matetika. Misafidiana tenimiafina manokana kokoa.",
        "password-name-match": "Tsy maintsy samihafa ny solonanaranao sy ny tenimiafinao tompoko.",
        "password-login-forbidden": "Norarana ny fampiasana io anaram-pikambana ary io tenimiafina io.",
        "mailmypassword": "Hamerina ny tenimiafina",
        "noemail": "Tsy nanome adiresy imailaka i \"$1\".",
        "noemailcreate": "Tsy maintsy misy ny adiresy imailaka ho atsofokao",
        "passwordsent": "Nandefasana tenimiafina vaovao any amin'ny adiresy imailak'i \"$1\".\nAzafady midira rehefa voarainao io imailaka io.",
-       "blocked-mailpassword": "Voasakana ny adiresy IP-nao, nesorina aminao ny asa ''password recovery'' mba tsy hanararaotra.",
+       "blocked-mailpassword": "Voasakana tsy afa-manova ny adiresy IP-nao. Mba tsy hisian'ny fanararaotana dia tsy azo atao ny famerenana tenimiafina avy amin'ity adiresy IP ity.",
        "eauthentsent": "Efa nandefasana imailaka fanamarinana ilay adiresy nomenao.\nAlohan'ny handefasana mailaka hafa any amin'ity kaonty ity dia mila manaraka ny torolalana ianao hahafahana manamarina anao ho tompon'ilay kaonty.",
        "throttled-mailpassword": "Efa nandefasana mailaka famerenana tenimiafiana ianao tanatin'ny {{PLURAL:$1|ora|$1 ora}}.\nMba tsy hisian'ny fanararaotana dia mailaka famerenana tenimiafiana iray ihany no azo ampiasaina isaky ny adin'ny $1{{PLURAL:}}.",
        "mailerror": "Nisy olana tamin'ny fandefasana imailaka: $1",
-       "acct_creation_throttle_hit": "Miala tsiny, efa nanokatra kaonty miisa $1 ianao, ka tsy afaka mamorona hafa intsony.{{PLURAL:}}",
+       "acct_creation_throttle_hit": "Ireo mpitsidika avy amin'ny adiresy IP-nao dia namorona {{PLURAL:$1|kaonty iray|kaonty $1}} tanatin'ny $2, izay isam-panoronana farafahabetsany azo atao anatin'izay fe-potoana izay.\nNy vokatr'izany dia tsy afa-mamorona kaonty vaovao ity adiresy ity amin'izao fotoana izao.",
        "emailauthenticated": "Voamarina tamin'ny $2 tamin'ny $3 ny adiresy mailakao.",
        "emailnotauthenticated": "Tsy mbola nomarinina ny adiresy mailakao.\nTsy handefa mailaka izy ho an'ireo asa ireo.",
        "noemailprefs": "Manomeza adiresy imailaka raha hampiasa ireo fitaovana ireo ianao.",
        "createacct-another-realname-tip": "Azo tsy atsofoka ny tena anarana.\nRaha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
        "pt-login": "Hiditra",
        "pt-login-button": "Hiditra",
+       "pt-login-continue-button": "Hanohy ny fidirana",
        "pt-createaccount": "Hamorona kaonty",
        "pt-userlogout": "Hivoaka",
        "php-mail-error-unknown": "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
        "botpasswords-insert-failed": "Tsy afaka nanampy ny anarana rôbô \"$1\". Tsy efa nampiana ve ilay izy?",
        "botpasswords-update-failed": "Tsy afaka nanavao ny anarana rôbô \"$1\". Nofafàna ve ilay izy?",
        "botpasswords-created-title": "Noforonina ilay tenimiafina rôbô",
-       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\".",
+       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
        "botpasswords-updated-title": "Nohavaozina ny tenimiafina rôbô",
-       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\".",
+       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
        "botpasswords-deleted-title": "Nofafàna ny tenimiafina rôbô",
-       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\".",
+       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\" an'ny mpikambana \"$2\".",
        "botpasswords-newpassword": "Ny tenimiafina idirana amin'i <strong>$1</strong> dia <strong>$2</strong>. <em>Raiketo ilay izy ho an'ny fampiasàna any aoriana any.</em>",
        "botpasswords-no-provider": "Tsy afaka antsoina ny BotPasswordsSessionProvider.",
        "botpasswords-restriction-failed": "Manakana ity fidirana ity ny fepetra mifehy ny tenimiafina rôbô.",
        "passwordreset-emaildisabled": "Tsy avela ny fampiasana mailaka eto amin'ity wiki ity.",
        "passwordreset-username": "Anaram-pikambana :",
        "passwordreset-domain": "Vala (domain) :",
-       "passwordreset-capture": "Hijery ny imailaka vokany ?",
-       "passwordreset-capture-help": "Raha marihanao ity boaty ity, ny mailaka (miaraka amin'ilay tenimiafina vonjimaika) dia ho aseho aminao ary koa ho alefa amin'ilay mpikambana.",
        "passwordreset-email": "Adiresy imailaka :",
        "passwordreset-emailtitle": "Antsipirihan'ny kaonty eo amin'i {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nisy olona (izay mety ianao, avy amin'ny adiresy IP $1) nangataka ny hamerina ny tenimiafin'ny kaontim-pikambany ho an'i {{SITENAME}} ($4). Mampiasa ity adiresy mailaka ity {{PLURAL:$3|ity kaontim-pikambana mpikambana io|ireo kaontim-mpikambana ireo}}:\n\n$2\n\nHitsahatra afaka $5 andro {{PLURAL:$3|io tenimiafina io|ireo tenimiafina ireo}}.\nTokony miditra ianao ary mifidy tenimiafina vaovao. Raha misy olon-kafa nanao ity hataka ity, na efa tadidinao indray ilay tenimiafinao taloha, ary raha tsy tia hanova azy intsony, azonao tsy raharahiana ity hafatra ity ary mitohy mampiasa ny tenimiafinao taloha.",
        "passwordreset-emailtext-user": "Nisy mpikambana mitondra anarana $1 eo amin'i {{SITENAME}} nangataka fampatsiahivana mikasika ny kaontinao eo amin'i {{SITENAME}} ($4). Manana io adiresy imailaka {{PLURAL:$3|io kaontim-pikambana io|ireo kaontim-pikambana ireo}} :\n\n$2\n\nHitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {{PLURAL:$3|io|ireo}}. Mila miditra dien'izao ianao izao ary mifidy tenimiafina vaovao. Raha tsy avy aminao ity hataka ity na efa nahatadidy ny tenimiafinao taloha ianao, ary raha tsy tianao hovaina intsony ilay tenimiafinao, dia azonao tsy raharahiana ity hafatra ity ary mampiasa ny tenimiafinao taloha.",
        "passwordreset-emailelement": "Anaram-pikambana : \n$1\n\nTenimiafina miserana : \n$2",
        "passwordreset-emailsentemail": "Lasa ny mailaka famerenana tenimiafina.",
-       "changeemail": "Hanova ny adiresy imailaka",
-       "changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
+       "passwordreset-nocaller": "Mila manitsy mpiantso",
+       "passwordreset-nosuchcaller": "Tsy misy ilay mpiantso: $1",
+       "passwordreset-invalidemail": "Adiresy mailaka tsy azo raisina",
+       "passwordreset-nodata": "Tsy nanome anaram-pikambana na adiresy mailaka",
+       "changeemail": "Hanova na hanala adiresy mailaka",
+       "changeemail-header": "Fenoy ity fôrmiolera ity ahafahanao manova ny adiresy mailakao. Raha tianao ho esorina ny fifandraisan'ity mailaka ity amin'ny kaontinao dia avelao ho fotsy ny saha rehefa mandefa fôrmiolera.",
        "changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
        "changeemail-oldemail": "Adiresy imailaka ankehitriny :",
        "changeemail-newemail": "Adiresy imailaka vaovao :",
        "minoredit": "Fanovàna kely",
        "watchthis": "Araho maso ity pejy ity",
        "savearticle": "Tehirizo",
+       "savechanges": "Hitahiry ny fiovana",
+       "publishpage": "Hamoaka pejy",
+       "publishchanges": "Hamoaka ny fiovana",
        "preview": "Topi-maso",
        "showpreview": "Asehoy aloha",
        "showdiff": "Asehoy ny fiovana",
        "yourdiff": "Fampitahana",
        "copyrightwarning": "Ny zavatra rehetra apetraka amin'ny {{SITENAME}} dia raisina ho azo adika malalaka araka ny fahazoan-dalana $2 (Jereo $1 ny fanazavana fanampiny). Raha toa ka tianao ho anao manokana ny tahirin-kevitra dia aleo tsy apetraka ato.\n\n<b>AZA MAMPIASA TAHIRINKEVITRA TSY NAHAZOAN-DALANA</b>",
        "copyrightwarning2": "Ny fandraisana anjara ao amin'i {{SITENAME}} dia azo ovaina ary fafan'ny mpikambana hafa. Raha tsy tianao ho ampiasainan, ovaina na zarazaraina ny soratrao, dia aza alefa eto ilay vokatr'asanao<br />\nNy zava-tsoratanao eto dia vokatr'asa naverinao soratana na nodikainao tany amina loharano ao amin'ny vala sarababem-bahoaka na loharano malalaka hafa (Jereo $1 ho an'ny antsipirihany).\n\n'''Aza mampiasa tahirin-kevitra tsy nahazoan-dalana!'''",
+       "editpage-cannot-use-custom-model": "Tsy mety ovaina ny modelim-botoatin'ity pejy ity.",
        "longpageerror": "'''Hadisoana : Ny tahirin-tsoratra nalefanao dia manana halava {{PLURAL:$1|iray|$1}} kilooktety, izay lava kokoa nohon'ny fetra avo indridra izay natao ho {{PLURAL:$2|iray|$2}} kilooktety.'''\nTsy afaka tahirizina ilay tahirin-tsoratra.",
        "readonlywarning": "'''FAMPITANDREMANA: Nohidiana noho ny antony fikolokoloana aloha ny banky angona,\nkoa tsy afaka mitahiry ny fanovana nataonao aloha ianao izao. Angamba tokony hanao Couper coller aloha\nianao dia tehirizo anaty rakitra ny fanovanao mandra-paha.'''\n\nNy mpandrindra nanidy ny banky angona dia nanome ny antony : <br />$1",
        "protectedpagewarning": "'''FAMPITANDREMANA:  Voaaro ity pejy ity ka ny mpikambana manana ny fahazoan-dàlana sysop ihany no afaka manova azy.'''",
        "invalid-content-data": "Data anaty votoatiny tsy miady amin'ny fepetra",
        "content-not-allowed-here": "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
        "editwarning-warning": "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.\nRaha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"{{int:prefs-editing}}\" ao amin'ny safidinao.",
+       "editpage-invalidcontentmodel-title": "Andrefim-botoatiny tsy zaka",
+       "editpage-invalidcontentmodel-text": "Andrefim-botoatiny \"$1\" tsy zaka.",
        "editpage-notsupportedcontentformat-title": "Tsy zaka io andrefim-botoatiny io",
        "editpage-notsupportedcontentformat-text": "Tsy zakan'ny maodelim-botoatiny $1 ny firafi-botoatiny $1",
        "content-model-wikitext": "wiki-soratra",
        "content-model-css": "CSS",
        "content-json-empty-object": "Zavatra foana",
        "content-json-empty-array": "Tabilao foana",
+       "deprecated-self-close-category": "Pejy mampiasa balizy HTML mihidy ho azy izay tsy azo raisina",
        "duplicate-args-category": "Pejy mampiasa dika mitovy hevitra amin'ny fiantsoana endrika",
        "expensive-parserfunction-warning": "Tandremo : Betsaka loatra ny fanantsoana ny tao parser.\n\nTsy maintsy latsaky ny $2 ny tao, kanefa misy $1. {{PLURAL:$2||}}",
        "expensive-parserfunction-category": "Pejy mampiasa be loatra ny tao parser",
        "searchprofile-advanced-tooltip": "Hitady ny anaran-tsehatra ho an'ny fikarohana",
        "search-result-size": "$1 ({{PLURAL:$2|teny|teny}} $2)",
        "search-result-category-size": "Mpiray sokajy $1{{PLURAL:$1}} (zana-tsokajy $2{{PLURAL:}}, rakitra $3{{PLURAL:}})",
-       "search-redirect": "(redirect avy amin'ny/amin'i $1)",
+       "search-redirect": "(fihodinana avy amin'i $1)",
        "search-section": "(fizaràna $1)",
        "search-category": "(sokajy $1)",
        "search-file-match": "(miady amin'ny votoatin-drakitra)",
        "search-interwiki-caption": "zandri-tetikasa",
        "search-interwiki-default": "Valiny amin'ny $1 :",
        "search-interwiki-more": "(be kokoa)",
+       "search-interwiki-more-results": "Valiny be kokoa",
        "search-relatedarticle": "voadinika",
        "searchrelated": "voadinika",
        "searchall": "rehetra",
        "search-external": "Hikaroka any ivelany",
        "searchdisabled": "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
        "search-error": "Hadisoana nitranga tam-pikarohana: $1",
+       "search-warning": "Fampitandremana nitranga teo am-pikarohana: $1",
        "preferences": "Ny momba anao",
        "mypreferences": "Safidy",
        "prefs-edits": "isa ny fanovàna :",
        "saveprefs": "Tehirizo",
        "restoreprefs": "Hamerina ny safidy taloha (amin'ny fizarana rehetra)",
        "prefs-editing": "Fanovana",
-       "rows": "Filaharana :",
-       "columns": "Tsanganana/Tioba :",
        "searchresultshead": "Fikarohana",
        "stub-threshold": "Fetra ambony ho an'i <a href=\"#\" class=\"stub\">rohim-bangovango</a> (oktety):",
        "stub-threshold-sample-link": "santiôna",
        "youremail": "Imailaka:",
        "username": "{{GENDER:$1}}Anaram-pikambana :",
        "prefs-memberingroups": "Mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}}:",
+       "group-membership-link-with-expiry": "$1 (hatramin'i $2)",
        "prefs-registration": "Daty fidirana :",
        "yourrealname": "Tena anarana marina:",
        "yourlanguage": "Tenim-pirenena:",
        "prefswarning-warning": "Efa nanova tamin'ny safidinao tsy mbola voatahiry ianao. Raha miala amin'ity pejy ity amin'ny alalan'ny fanindriana an'i \"$1\" ianao dia tsy ho voavao ny safidinao.",
        "prefs-tabs-navigation-hint": "Torohevitra: afaka mampiasa ny zana-tsipika havia ary havanana ianao ho an'ny fitetezana ny vakizoro ao amin'ny lisi-bakizoro",
        "userrights": "Fandrindràna ny fahefahan'ny mpikambana",
-       "userrights-lookup-user": "Handrindra vondrom-pikambana",
+       "userrights-lookup-user": "Hisafidy mpikambana",
        "userrights-user-editname": "Manomeza solonanarana:",
-       "editusergroup": "Hanova satan'ny {{GENDER:$1|}}mpikambana",
+       "editusergroup": "Hampiditra vondrom-pikambana",
        "editinguser": "Fanovana ny zon'ny mpikambana <strong>{{GENDER:$1|}}[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Hanova vondrom-pikambana",
        "saveusergroups": "{{GENDER:$1|}}Tehirizo ny vondrom-pikambana",
        "userrights-reason": "Antony :",
        "userrights-no-interwiki": "Tsy manana alalana manova ny alalan'ny mpikambana eny amin'ny wiki hafa ianao.",
        "userrights-nodatabase": "Tsy eto akaiky na tsy misy ny banky angona « $1 ».",
-       "userrights-nologin": "Tsy maintsy [[Special:UserLogin|miditra]] ary manana kaontim-pandrindra ianao raha hanova ny alalan'ny mpikambana.",
-       "userrights-notallowed": "Tsy manana alalana ny manova na manampy zom-pikambana ianao.",
        "userrights-changeable-col": "Ny gropy azonao ovaina",
        "userrights-unchangeable-col": "Ny gropy tsy azonao ovaina",
+       "userrights-expiry-current": "Mitsahatra ny $1",
+       "userrights-expiry-none": "Tsy mitsahatra",
+       "userrights-expiry": "Fitsaharana:",
+       "userrights-expiry-existing": "Fotoam-pitsaharana ankehitriny: $3, $2",
+       "userrights-expiry-othertime": "Fotoana hafa:",
+       "userrights-expiry-options": "1 andro:1 day,herinandro:1 week,1 volana:1 month,3 volana:3 months,6 volana:6 months,herintaona:1 year",
+       "userrights-invalid-expiry": "Tsy azo raisina ny fotoam-pitsaharana ho an'ny vondrona \"$1\".",
        "userrights-conflict": "Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.",
-       "userrights-removed-self": "Nanala ny zonao ianao. Noho izany dia tsy afaka mitsidika ity pejy ity intsony ianao.",
        "group": "Gropy :",
        "group-user": "Mpikambana",
        "group-autoconfirmed": "Mpikambana voamarina",
        "right-siteadmin": "Manidy sy manokatra ny banky angona",
        "right-override-export-depth": "Mamoaka ny pejy miaraka amin'ny zana-pejy hatramin'ny ambaratonga fahadimy",
        "right-sendemail": "Mandefa imailaka any amin'ny mpikambana hafa",
-       "right-passwordreset": "Hijery ny imailaka famerenana ny tenimiafina",
        "right-managechangetags": "Mamorona ary mamafa [[Special:Tags|balizy]] ao amin'ny banky angona",
        "grant-generic": "\"$1\" vondron-jo",
        "grant-group-page-interaction": "Mifanakalo amin'ny pejy",
        "grant-group-watchlist-interaction": "Mifanakalo amin'ny lisitry ny pejy arahanao",
        "grant-group-email": "Mandefa mailaka",
        "grant-group-high-volume": "Manao zavatra haingana",
+       "grant-group-customization": "Fikirakirana ary safidy",
        "grant-group-administration": "Hanao asam-pandrindrana",
        "grant-group-other": "Manao hetsika maro samihafa",
        "grant-blockusers": "Manakana sy manala sakan'ny mpikambana",
        "rightslogtext": "Ity ny laogim-piovan'ny zom-pikambana",
        "action-read": "mamaky ity pejy ity",
        "action-edit": "manova ity pejy ity",
-       "action-createpage": "hanao pejy",
-       "action-createtalk": "hanao pejin-dresaka",
+       "action-createpage": "hamorona ity pejy ity",
+       "action-createtalk": "hanao ity pejin-dresaka ity",
        "action-createaccount": "amboary io kaontim-pikambana io",
        "action-autocreateaccount": "foronina ho azy io kaontim-pikambana ivelany io",
        "action-history": "hijery ny tantaran'ity pejy ity",
        "action-upload_by_url": "hampiditra io rakitra io avy amina adiresy URL",
        "action-writeapi": "hanova ny API fanoratana",
        "action-delete": "hamafa io pejy io",
-       "action-deleterevision": "hamafa io version io",
-       "action-deletedhistory": "mijery ny tantara voafafa n'ity pejy ity",
+       "action-deleterevision": "hamafa ireo versiona ireo",
+       "action-deletelogentry": "hamafa iditry ny laogy",
+       "action-deletedhistory": "hijery ny tantara voafafan'ilay pejy",
+       "action-deletedtext": "hijery version-tsoratra voafafa",
        "action-browsearchive": "hitady pejy efa voafafa",
-       "action-undelete": "hamerina io pejy io",
-       "action-suppressrevision": "hijery sy hamerina io version nofafàna io",
+       "action-undelete": "hamerina pejy",
+       "action-suppressrevision": "hijery sy hamerina versiona nafenina",
        "action-suppressionlog": "hijery io tao tsy sarababem-bahoaka",
        "action-block": "manakana am-panoratana ny mpikambana iray",
        "action-protect": "manova ny fanovàn'ity pejy ity",
        "action-userrights-interwiki": "hanova ny fahefan'ny mpikambana any amin'ny wiki hafa",
        "action-siteadmin": "Manidy sy manokatra ny banky angona",
        "action-sendemail": "handefa imailaka",
+       "action-editmyoptions": "hanova ny safidinao",
        "action-editmywatchlist": "Manova ny lisitry ny pejy arahana",
        "action-viewmywatchlist": "Mijery ny pejy arahanao",
        "action-viewmyprivateinfo": "Mijery ny fampahalalana tsy sarababem-bahoakanao",
        "action-editmyprivateinfo": "Mijery ny fampahalalana sarababem-bahoakanao",
        "action-editcontentmodel": "manova ny modelim-botoatin'ny pejy",
-       "action-managechangetags": "hamorona ary hamafa balizy ao amin'ny banky angona",
+       "action-managechangetags": "hamorona ary hampiasa (na tsia) ireo balizy",
        "action-applychangetags": "mampihatra balizy miaraka amin'ny fanovanao",
        "action-changetags": "manampy ary manala balizy amin'ny versiona manokana ary iditry ny laogy",
+       "action-deletechangetags": "hamafa balizy amin'ny banky angona",
+       "action-purge": "handio an'ity pejy ity",
        "nchanges": "{{PLURAL:$1|fanovana|fanovana}} $1",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "recentchanges-legend-heading": "<strong>Maribolana:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
        "recentchanges-submit": "Aseho",
+       "rcfilters-activefilters": "Sivana miasa",
+       "rcfilters-restore-default-filters": "Hamerina sivana ampiasaina raha tsy misy",
+       "rcfilters-clear-all-filters": "Hamafa ny sivana rehetra",
+       "rcfilters-search-placeholder": "Hanivana ny fiovana farany (tetezo na manomboha manoratra)",
+       "rcfilters-invalid-filter": "Sivana tsy azo raisina",
+       "rcfilters-empty-filter": "Tsy misy sivana miasa. Aseho avokoa ireo fandraisan'anjara.",
+       "rcfilters-filterlist-title": "Sivana",
+       "rcfilters-highlightbutton-title": "Hampibaribary ny valiny",
+       "rcfilters-highlightmenu-title": "Hisafidy loko",
+       "rcfilters-filterlist-noresults": "Tsy nahitana sivana",
+       "rcfilters-filtergroup-registration": "Fisoratan'ny mpikambana",
+       "rcfilters-filter-registered-label": "Nisoratra anarana",
+       "rcfilters-filter-registered-description": "Mpanova tafiditra.",
+       "rcfilters-filter-unregistered-label": "Tsy nisoratra anarana",
+       "rcfilters-filter-unregistered-description": "Mpikambana tsy niditra.",
+       "rcfilters-filter-editsbyself-label": "Ny fiovanao",
+       "rcfilters-filter-editsbyself-description": "Fiovana nataonao",
+       "rcfilters-filter-editsbyother-label": "Fiovana nataon'ny hafa",
+       "rcfilters-filter-editsbyother-description": "Fiovana noforonin'ny mpikambana hafa (tsy ianao).",
+       "rcfilters-filtergroup-userExpLevel": "Lentan'ny traikefa (ho an'ireo mpikambana nisoratra anarana ihany)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "Vao tonga",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Latsaky ny fiovana folo ary latsaky ny 4 andro niasana",
+       "rcfilters-filter-userExpLevel-learner-label": "Mpianatra",
+       "rcfilters-filter-userExpLevel-learner-description": "Efa betsaka andro nandraisana anjara ary nanova im-betsaka nohon'ny \"Vao tonga\" fa mbola kely nohon'ny \"Manan-traikefa\".",
+       "rcfilters-filter-userExpLevel-experienced-label": "Mpikambana manan-traikefa",
+       "rcfilters-filter-userExpLevel-experienced-description": "Mahery ny 30 andro nandraisana anjara ary fiovana mahery ny 500.",
+       "rcfilters-filtergroup-automated": "Fandraisan'anjara alefa ho azy",
+       "rcfilters-filter-bots-label": "Rôbô",
+       "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-filtergroup-significance": "Dikany",
+       "rcfilters-filter-minor-label": "Fiovana madinika",
+       "rcfilters-filter-minor-description": "Fiovana nataon'ny tompony ho madinika.",
+       "rcfilters-filter-major-label": "Fiovana tsy madinika",
+       "rcfilters-filter-major-description": "Fiovana tsy natao ho madinika.",
+       "rcfilters-filtergroup-changetype": "Karazam-piovana",
+       "rcfilters-filter-pageedits-label": "Fiovam-pejy",
+       "rcfilters-filter-newpages-label": "Famoronam-pejy",
+       "rcfilters-filter-newpages-description": "Fiovana nahatonga famoronam-pejy.",
+       "rcfilters-filter-categorization-label": "Fiovana amin'ny sokajy",
+       "rcfilters-filter-categorization-description": "Fandraiketana an'ireo pejy ampiana na esorina amin'ny sokajy.",
+       "rcfilters-filter-logactions-label": "Asa voalaogy",
        "rcnotefrom": "Eo ambany dia ahitana ireo fiovana{{PLURAL:$5}} hatry ny <strong>$3, $4</strong> (naseho hatramin'ny <strong>$1</strong>).",
        "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
        "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.",
-       "uploadscriptednamespace": "ahitana valan'anarana \"$1\" ny rakitra SVG.",
+       "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",
        "uploadjava": "Ny rakitra dia rakitra ZIP ahitana rakitra .class Java.\nVoarara ny mandefa rakitra Java satria mety hahavaky ny fepetra mikasika ny antoka ireo rakitra ireo.",
        "upload-copy-upload-invalid-domain": "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
        "upload-dialog-title": "Hanafatra rakitra",
        "upload-dialog-button-cancel": "Aoka",
+       "upload-dialog-button-back": "Hiverina",
        "upload-dialog-button-done": "Vita",
        "upload-dialog-button-save": "Tehirizina",
        "upload-dialog-button-upload": "Mampiditra",
        "whatlinkshere-next": "$1 manaraka{{PLURAL:$1||}}",
        "whatlinkshere-links": "← rohy",
        "whatlinkshere-hideredirs": "$1 ny fihodinana",
-       "whatlinkshere-hidetrans": "$1 ny tsofo-pejy",
+       "whatlinkshere-hidetrans": "$1 ny fampiasam-pejy",
        "whatlinkshere-hidelinks": "$1 ny rohy",
        "whatlinkshere-hideimages": "$1 ny rakitra mirohy",
        "whatlinkshere-filters": "sivana",
        "feedback-submit": "Alefa",
        "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Karohy",
+       "searchsuggest-search": "Hikaroha eto amin'i {{SITENAME}}",
        "searchsuggest-containing": "misy...",
-       "api-error-badaccess-groups": "Tsy afaka mampiditra rakitra eto amin'ity wiki ity ianao.",
        "api-error-badtoken": "Hadisoana anaty : \"token\" diso.",
-       "api-error-copyuploaddisabled": "Tsy avela atao eto amin'ity lohamilina ity ny fampidiran-drakitra amin'ny alalan'ny URL.",
-       "api-error-empty-file": "Tsy misy na inona na inna ilay rakitra nalefanao.",
        "api-error-emptypage": "Tsy azo atao ny mamorona pejy vaovao tsy misy votoatiny.",
-       "api-error-fetchfileerror": "Hadisoana naaty : misy hadisoana nitranga teo am-pangalana ilay rakitra.",
-       "api-error-file-too-large": "Lehibe loatra ny rakitra nalefanao.",
-       "api-error-filename-tooshort": "Fohy loatra ny anaran'ilay rakitra.",
-       "api-error-filetype-banned": "Voarara io karazan-drakitra io.",
-       "api-error-filetype-missing": "Tsy ampy tovana ilay anaran-drakitra.",
-       "api-error-hookaborted": "Najanon'ny faraingon'itatra ny fanovana nandramanao natao.",
-       "api-error-http": "Hadisoana anaty: Tsy tafaray tamin'ilay lohamilina.",
-       "api-error-illegal-filename": "Tsy azo ampiasaina io anaran-drakitra io.",
-       "api-error-internal-error": "Hadisoana anaty: Nisy hadisoana nitranga teo am-pikajikajiana ny rakitrao",
-       "api-error-invalid-file-key": "Hadisoana anaty: Tsy hita tao amin'ilay tahiry vonjimaika ilay rakitra.",
-       "api-error-missingparam": "Hadisoana anaty: Parametatra tsy ampy ao amin'ny hataka.",
-       "api-error-missingresult": "Hadisoana anaty: Tsy afaka milaza izahay raha tena nahomby ilay fandikana.",
-       "api-error-mustbeloggedin": "Mila tafiditra ianao mba handefa rakitra.",
-       "api-error-mustbeposted": "Hadisoana anaty: Mila HTTP POST ilay hataka.",
-       "api-error-noimageinfo": "Nahomby ilay fandikana, fa tsy nanome antsika fampahalalana mikasika ilay raktira ilay lohamilina.",
-       "api-error-nomodule": "Hadisoana anaty: Tsy namaritra joro fandefasana.",
-       "api-error-ok-but-empty": "Hadisoana anaty: Tsy nisy valiny avy amin'ilay lohamilina.",
-       "api-error-overwrite": "Tsy azo atao ny manitsaka rakitra efa misy.",
        "api-error-stashfailed": "Hadisoana anaty: Tsy nahomby ny fitahirizana ilay rakitra vonjimaika ilay lohamilina.",
-       "api-error-timeout": "Tsy namaly tanatin'ny fe-potoana nandrasana ilay lohamilina.",
-       "api-error-unclassified": "Nisy hadisoana tsy fantatra nitranga.",
-       "api-error-unknown-code": "Hadisoana tsy fantatra : ''$1''.",
-       "api-error-unknown-error": "Hadisoana anaty: Nisy hadisoana tam-pandefasana ny rakitrao.",
        "api-error-unknown-warning": "Fampitandremana tsy fantatra : ''$1''.",
        "api-error-unknownerror": "Hadisoana tsy fantatra : ''$1''.",
-       "api-error-uploaddisabled": "Tsy alefa eto amin'ity wiki ity ny fandefasan-drakita.",
-       "api-error-verification-error": "Mety tapaka ity rakitra ity, na diso tovan-drakitra.",
        "special-characters-group-latin": "latina",
        "special-characters-group-latinextended": "latina nitarina",
        "special-characters-group-ipa": "AAI",
        "special-characters-group-khmer": "kimera",
        "special-characters-title-endash": "tsipika anglisy",
        "special-characters-title-emdash": "tsipika em",
-       "special-characters-title-minus": "marika mainosy"
+       "special-characters-title-minus": "marika mainosy",
+       "sessionmanager-tie": "Tsy afaka mampikambana karazan-kataka fampamantarana maromaro: $1.",
+       "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-authplugin-create-fail": "Nandà ny famoronan-kaonty ny plugin fampamantarana.",
+       "authmanager-authplugin-setpass-denied": "Tsy ahafahana manova tenimiafina ny plugin fampamantarana.",
+       "authmanager-userlogin-remembermypassword-help": "Milaza raha tsy maintsy tadidiana mihoatra ny halafan'ny fotoam-pitsidihana ny tenimiafina.",
+       "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-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-help": "Handingana ny famerenam-tenimiafina.",
+       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao."
 }
index 8839a78..629386b 100644 (file)
        "mytalk": "Каҥашымаш",
        "anontalk": "Каҥашымаш тиде IP нерген",
        "navigation": "Навигаций",
+       "and": "&#32;да",
        "qbfind": "Муаш",
        "qbedit": "Тӧрлаташ",
        "qbpageoptions": "Тиде лаштык",
        "view": "Ончалаш",
        "edit": "Тӧрлаташ",
        "create": "Ышташ",
-       "editthispage": "Тӧрлаташ тиде лаштыкым",
+       "editthispage": "Тиде лаштыкым тӧрлаташ",
        "create-this-page": "Тиде лаштыкым ышташ",
        "delete": "Шӧраш",
        "deletethispage": "Тиде лаштыкым шӧраш",
        "emailauthenticated": "Тыйын почто адресетым пеҥгыдемдыме $2, $3.",
        "loginlanguagelabel": "Йылме: $1",
        "pt-login": "Пураш",
+       "pt-createaccount": "Регистрацийым эрте",
        "pt-userlogout": "Лекташ",
        "changepassword": "Шолыпмутым вашталташ",
        "oldpassword": "Тошто шолыпмут:",
        "minoredit": "Тиде изи вашталтыш",
        "watchthis": "Тиде лаштыкым эскераш",
        "savearticle": "Лаштыкым аралаш",
+       "savechanges": "Лаштыкым аралаш",
+       "publishchanges": "Лаштыкым аралаш",
        "preview": "Ончылгоч ончымаш",
        "showpreview": "Ончылгоч ончымаш",
        "showdiff": "Тӧрлатымашым ончыкташ",
-       "anoneditwarning": "'''ТӱÑ\82кӧ Ð»Ð¸Ð¹:''': Ð¢Ñ\8bй Ð°Ð²Ñ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен Ð¾Ñ\82Ñ\8bл. Ð¢Ñ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 Ð¸Ñ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже Ð²Ð¾Ð·Ð°Ð»Ñ\82 ÐºÐ¾Ð´ÐµÑ\88. Ð¨ÐºÐµ Ð»Ó±Ð¼ÐµÑ\82 Ð´ÐµÐ½ Ð¿Ñ\83Ñ\80еÑ\82 Ð°Ð»Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 Ð³Ñ\8bн, Ñ\88каланет пашам ышташ йӧнлырак лиеш.",
+       "anoneditwarning": "'''ТӱÑ\82кӧ Ð»Ð¸Ð¹:''': Ð¢Ñ\8bй Ð°Ð²Ñ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен Ð¾Ñ\82Ñ\8bл. Ð¢Ñ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 Ð¸Ñ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже Ð²Ð¾Ð·Ð°Ð»Ñ\82 ÐºÐ¾Ð´ÐµÑ\88. Ð¨ÐºÐµ Ð»Ó±Ð¼ÐµÑ\82 Ð´ÐµÐ½ Ð¿Ñ\83Ñ\80еÑ\82 Ð°Ð»Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 Ð³Ñ\8bн, Ñ\82Ñ\8bлат пашам ышташ йӧнлырак лиеш.",
        "summary-preview": "Тӧрлатымаш нерген ончылгоч ончымаш:",
        "accmailtitle": "Шолыпмут колтымо.",
        "newarticle": "(У)",
-       "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йонгылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
+       "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йоҥылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
        "noarticletext": "Кызытсе жаплан тиде лаштыкыште нимом возымо огыл.\nТый тиде лаштыкын лӱмжым вес лаштык-влакыште [[Special:Search/{{PAGENAME}}|кычалын]] кертат, але <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журнал-влакыште кычалын] кертат, але [{{fullurl:{{FULLPAGENAME}}|action=edit}} тыгай лӱман лаштыкым ыштен] кертат</span>.",
        "clearyourcache": "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)\n* '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)\n* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''\n* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
        "previewnote": "'''Тиде ончылгоч ончымаш гына;\nвашталтыш-влакым эше аралыме огыл!'''",
        "group-bot-member": "бот",
        "grouppage-bot": "{{ns:project}}:Бот-влак",
        "grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
+       "right-writeapi": "Возымашлан API-ым кучылтмаш",
        "newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
        "rightslog": "Участникын праваже-влакым ончыктышо журнал",
        "action-edit": "тиде лаштыкым тӧрлаташ",
        "minoreditletter": "и",
        "newpageletter": "У",
        "boteditletter": "б",
+       "rc-change-size-new": "Вашталтымаш деч вара $1 {{PLURAL:$1|байт}} лийын",
        "rc-enhanced-expand": "Тичмашын ончыкташ",
        "rc-enhanced-hide": "Рашлык-влакым шылташ",
        "recentchangeslinked": "Ваш кылдалтше тӧрлатымаш-влак",
        "uploadlogpage": "Оптымаш-влак журнал",
        "filedesc": "Файл нерген кӱчыкын увертараш",
        "fileuploadsummary": "Тидын нерген кӱчыкын:",
+       "savefile": "Файлым арален кодаш",
        "watchthisupload": "Тиде файлым эскераш",
        "license-header": "Лицензирований",
        "imgfile": "файл",
        "protectexpiry": "Мучашлалтеш:",
        "protect_expiry_invalid": "Йоҥылыш мучашлалтше жап.",
        "protect_expiry_old": "Мучашлалтше жап эртен.",
-       "protect-text": "Тыште тый '''$1''' лаштыкын шыгыремдымашыжым ончалаш да тӧрлаташ кертат.",
+       "protect-text": "Тыште тый '''$1''' лаштыкын аралымаш уровеньжым ончалын але вашталтен кертат.",
        "protect-locked-access": "Тыйын лаштыкын шыгыремдымашыжым тӧрлаш кертмешет шагал.\nӰлнӧ '''$1''' лаштыкын кызытсе келыштарымаш.",
        "protect-cascadeon": "Тиде лаштыкым тӧрлатымаш деч аралыме.  \nКаскадный аралымашан {{PLURAL:$1|лаштык-влак}} тудо пура.",
        "protect-default": "Чыла пайдаланыше-влаклан йӧным пуаш",
        "file-nohires": "Кугурак чаплык уке.",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
        "show-big-image": "Тӱҥалтыш файл",
+       "show-big-image-preview": "Ончылгоч ончымо годым кугыт: $1",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Кычал",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
-       "logentry-delete-delete": "$1 {{GENDER:$2|лыктын|лыктын}} странице $3",
+       "tag-filter": "[[Special:Tags|Метке]] фильтр:",
+       "logentry-delete-delete": "$1 {{GENDER:$2|шӧрен|шӧрен}} лаштыкым $3",
+       "logentry-newusers-create": "Пайдаланыше {{GENDER:$2}} $1 лаштыкым ыштен.",
        "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
-       "searchsuggest-search": "Кычалаш",
+       "searchsuggest-search": "{{SITENAME}} сайтыште кычалаш",
        "expand_templates_ok": "Йӧра",
        "expand_templates_preview": "Ончылгоч ончымаш"
 }
index 1755524..4872f4a 100644 (file)
@@ -19,7 +19,8 @@
                        "Macofe",
                        "Nemo bis",
                        "Matma Rex",
-                       "Kaldari"
+                       "Kaldari",
+                       "Xð"
                ]
        },
        "tog-underline": "Потцртување на врски:",
        "unprotectthispage": "Измена на заштитата на страницава",
        "newpage": "Нова страница",
        "talkpage": "Разговор",
-       "talkpagelinktext": "Разговор",
+       "talkpagelinktext": "разговор",
        "specialpage": "Службена страница",
        "personaltools": "Лични алатки",
        "articlepage": "Преглед на содржината",
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $1",
-       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако последица на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
        "emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
        "emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
        "noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
        "selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „{{int:savearticle}}“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
        "missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
-       "summary-preview": "Ð\98зглед на описот:",
+       "summary-preview": "Ð\9fÑ\80еглед на описот:",
        "subject-preview": "Преглед на насловот:",
        "previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
        "blockedtitle": "Корисникот е блокиран",
        "nextn": "{{PLURAL:следна $1|следни $1}}",
        "prev-page": "претходна страница",
        "next-page": "следна страница",
-       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85оден|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "nextn-title": "{{PLURAL:$1|Следен|Следни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}} Ð½Ð° страница",
+       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85одна|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "nextn-title": "{{PLURAL:$1|Следна|Следни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}} Ð¿Ð¾ страница",
        "viewprevnext": "Погледајте ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''На ова вики има страница со наслов „[[:$1]]“'''",
        "searchmenu-new": "<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте го и најденото од пребарувањето.}}",
        "search-interwiki-caption": "Збратимени проекти",
        "search-interwiki-default": "Најдено на $1:",
        "search-interwiki-more": "(уште)",
+       "search-interwiki-more-results": "повеќе ставки",
        "search-relatedarticle": "Поврзано",
        "searchrelated": "поврзано",
        "searchall": "сè",
-       "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
-       "showingresultsinrange": "Ð\94олÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажан Ð´Ð¾ <strong>еден</strong> Ñ\80езÑ\83лÑ\82аÑ\82\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\80езÑ\83лÑ\82аÑ\82и}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82и <strong>$1 - $2</strong> од <strong>$3</strong>}}",
-       "search-nonefound": "Нема резултати што одговараат на бараното.",
-       "search-nonefound-thiswiki": "Ð\9dема Ñ\80езÑ\83лÑ\82аÑ\82и што одговараат на бараното на ова мрежно место.",
+       "showingresults": "Подолу {{PLURAL:$1|е прикажана <strong>1</strong> ставка|се прикажани <strong>$1</strong> ставки}} почнувајќи од бр. <strong>$2</strong>.",
+       "showingresultsinrange": "Ð\9fодолÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажана Ð´Ð¾ <strong>една</strong> Ñ\81Ñ\82авка|Ñ\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\81Ñ\82авки}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|СÑ\82авка <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|СÑ\82авки <strong>$1 - $2</strong> од <strong>$3</strong>}}",
+       "search-nonefound": "Нема исходни ставки што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Ð\9dема Ñ\81Ñ\82авки што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Избор:",
        "editusergroup": "Вчитај кориснички групи",
        "editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Поглед на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Уреди ги корисничките групи",
-       "userrights-viewusergroup": "Преглед на корисничките групи",
+       "userrights-editusergroup": "Уреди ги {{GENDER:$1|корисничките}} групи",
+       "userrights-viewusergroup": "Преглед на {{GENDER:$1|корисничките}} групи",
        "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": "Немате дозвола за уредување на кориснички права на други викија.",
        "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-feedbacklink": "Дајте мислење за новите (бета) филтри",
+       "rcfilters-highlightbutton-title": "Истакнување на исход",
+       "rcfilters-highlightmenu-title": "Изберете боја",
        "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
        "rcfilters-filtergroup-registration": "Регистрација на корисници",
        "rcfilters-filter-registered-label": "Регистрирани",
        "uploaded-setting-handler-svg": "SVG што го задава атрибутот „handler“ со оддалечено/податочна/скриптна е спречен. Пронајдов <code>$1=\"$2\"</code> во подигнатата SVG-податотека.",
        "uploaded-remote-url-svg": "SVG што задава било каков стилски атрибут со оддалечена URL е спречен. Пронајдов <code>$1=\"$2\"</code> во подигнатата SVG-податотека.",
        "uploaded-image-filter-svg": "Пронајдов филтер за слики со URL: <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
-       "uploadscriptednamespace": "Овааа SVG-податотека го содржи недопуштениот именски простор „$1“",
+       "uploadscriptednamespace": "Овааа SVG-податотека го содржи недопуштениот именски простор „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "Не можев да го расчленам XML-от што се наоѓа во подигнатата податотека.",
        "uploadvirus": "Оваа податотека содржи вирус! Повеќе подробности: $1",
        "uploadjava": "Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.\nПодигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.",
        "wantedcategories": "Потребни категории",
        "wantedpages": "Потребни страници",
        "wantedpages-summary": "Список на непостоечки страници со највеќе врски што водат до нив, исклучувајќи страниците до кои водат само пренасочувања. Список на непостоечки страници до кои водат пренасочувања ќе најдете на [[{{#special:BrokenRedirects}}|списокот на прекинати пренасочувања]].",
-       "wantedpages-badtitle": "Ð\9dевалиден Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82ите: $1",
+       "wantedpages-badtitle": "Ð\9dеважеÑ\87ки Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\81Ñ\82авките: $1",
        "wantedfiles": "Потребни податотеки",
        "wantedfiletext-cat": "Следниве податотеки се користат, но не постојат. Податотеките од други складишта може да се наведени дури и ако постојат. Таквите ќе бидат <del>поништени</del> од списокот. Покрај ова, страниците што содржат податотеки кои не постојат се наведени на [[:$1]].",
        "wantedfiletext-cat-noforeign": "Следниве податотеки се користат, но не постојат. Покрај ова, страниците што ги содржат непостоечките податотеки се наведени во [[:$1]].",
        "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; вратено на последната верзија на $2.",
+       "rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};; вратено на последната верзија на {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
        "sessionfailure-title": "Седницата не успеа",
        "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
        "feedback-external-bug-report-button": "Поднеси техничка задача",
        "feedback-dialog-title": "Поднеси мислење",
        "feedback-dialog-intro": "Послужете се со едноставниот образец подолу за да го поднесете вашето мислење. Коментарот ќе ви биде додаден на страницата „$1“, заедно со вашето корисничко име.",
-       "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
+       "feedback-error1": "Грешка: Непрепознаен исход од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
        "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
        "expand_templates_html_output": "Сиров HTML-извод",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Отстрани коментари",
-       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во резултатот",
+       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во исходот",
        "expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
        "expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
        "expand_templates_preview": "Преглед",
        "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": "седници со колачиња",
index dc267a8..a1b4175 100644 (file)
        "minoredit": "ഇതൊരു ചെറിയ തിരുത്താണ്",
        "watchthis": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "savearticle": "താൾ സേവ് ചെയ്യുക",
+       "savechanges": "മാറ്റങ്ങൾ സേവ് ചെയ്യുക",
        "preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
        "searchprofile-advanced-tooltip": "തിരഞ്ഞെടുത്ത നാമമേഖലകളിൽ തിരച്ചിൽ നടത്തുവാൻ",
        "search-result-size": "$1 ({{PLURAL:$2|ഒരു വാക്ക്|$2 വാക്കുകൾ}})",
        "search-result-category-size": "{{PLURAL:$1|ഒരു അംഗം|$1 അംഗങ്ങൾ}} ({{PLURAL:$2|ഒരു ഉപവർഗ്ഗം|$2 ഉപവർഗ്ഗങ്ങൾ}}, {{PLURAL:$3|ഒരു പ്രമാണം|$3 പ്രമാണങ്ങൾ}})",
-       "search-redirect": "(തിരിച്ചുവിടൽ താൾ $1)",
+       "search-redirect": "($1 എന്ന താളിൽ നിന്ന് തിരിച്ചുവിട്ടത്)",
        "search-section": "(വിഭാഗം $1)",
        "search-category": "(വർഗ്ഗം $1)",
        "search-file-match": "(പ്രമാണ ഉള്ളടക്കവുമായി ഒത്തുപോകുന്നുണ്ട്)",
        "prefs-help-recentchangescount": "പുതിയ മാറ്റങ്ങൾ, താളിന്റെ നാൾവഴികൾ, രേഖകൾ എന്നിവക്കും ഇത് ബാധകമാണ്.",
        "prefs-help-watchlist-token2": "ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ  പട്ടികയുടെ വെബ്‌ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.\nഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.\n[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].",
        "savedprefs": "താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.",
-       "savedrights": "{{GENDER:$1|$1}} à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dà´±àµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
+       "savedrights": "{{GENDER:$1|$1}} à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dà´±àµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´¸à´\82à´\98ങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
        "timezonelegend": "സമയ മേഖല:",
        "localtime": "പ്രാദേശിക സമയം:",
        "timezoneuseserverdefault": "വിക്കിയിൽ സ്വതേയുള്ളത് ഉപയോഗിക്കുക ($1)",
        "uploaded-setting-handler-svg": "വിദൂര/ഡേറ്റ/സ്ക്രിപ്റ്റിനൊപ്പം \"handler\" ആട്രിബ്യൂട്ട് സജ്ജീകരിക്കുന്ന എസ്.വി.ജി. തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>$1=\"$2\"</code> കണ്ടെത്തി.",
        "uploaded-remote-url-svg": "റിമോട്ട് യു.ആർ.എലിനൊപ്പം ഏതെങ്കിലും സ്റ്റൈൽ ആട്രിബ്യൂട്ട് സജ്ജീകരിക്കുന്ന എസ്.വി.ജി. തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>$1=\"$2\"</code> കണ്ടെത്തി.",
        "uploaded-image-filter-svg": "യു.ആർ.എൽ. ഉൾപ്പെടെയുള്ള ചിത്ര അരിപ്പ : <code>&lt;$1 $2=\"$3\"&gt;</code>, അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. ചിത്രത്തിൽ കണ്ടെത്തി.",
-       "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"$1\" ഉണ്ട്",
+       "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"<nowiki>$1</nowiki>\" ഉണ്ട്",
        "uploadinvalidxml": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.",
        "uploadvirus": "പ്രമാണത്തിൽ വൈറസുണ്ട്! വിശദാംശങ്ങൾ: $1",
        "uploadjava": "ഇത്, ജാവ .class പ്രമാണങ്ങൾ അടക്കം ചെയ്തിട്ടുള്ള ഒരു സിപ് (ZIP) പ്രമാണം ആണ്.\nസുരക്ഷാതടയലുകൾ മറികടക്കാൻ കഴിയുമെന്ന കാരണത്താൽ ജാവ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നത് അനുവദിച്ചിട്ടില്ല.",
        "feedback-thanks": "നന്ദി! താങ്കളുടെ പ്രതികരണം \"[$2 $1]\" എന്ന താളിൽ പ്രസിദ്ധീകരിച്ചിട്ടുണ്ട്.",
        "feedback-thanks-title": "നന്ദി!",
        "feedback-useragent": "യൂസർ ഏജന്റ്:",
-       "searchsuggest-search": "തിരയുക",
+       "searchsuggest-search": "{{SITENAME}} സംരംഭത്തിൽ തിരയുക",
        "searchsuggest-containing": "ഉൾപ്പെടുന്നവ...",
        "api-error-badtoken": "ആന്തരിക പിഴവ്: ഗുണകരമല്ലാത്ത ചീട്ട്.",
        "api-error-emptypage": "ശൂന്യമായ പുതിയ താളുകൾ സൃഷ്ടിക്കുന്നത് അനുവദിക്കുന്നില്ല.",
index 66b2190..864bdeb 100644 (file)
        "upload-scripted-pi-callback": "ज्या संचिकेत XML-stylesheet च्या प्रक्रियेचे अनुदेश असतील अशी संचिकेचे अपभारण करु शकत नाही.",
        "uploaded-script-svg": "अपभारीलेल्या SVG संचिकेत,\"$1\" हे लेखनीय अवयव आढळले.",
        "uploaded-hostile-svg": "अपभारीलेल्या SVG संचिकेत,असुरक्षित CSS स्टाईल अवयव आढळले.",
-       "uploadscriptednamespace": "या SVG संचिकेत \"$1\" हे अवैध नामविश्व आहे.",
+       "uploadscriptednamespace": "या SVG संचिकेत \"<nowiki>$1</nowiki>\" हे अवैध नामविश्व आहे.",
        "uploadinvalidxml": "अपभारीत संचिकेतील XML पार्स करता आले नाही.",
        "uploadvirus": "या संचिकेत विषाणू(व्हायरस) आहे. अधिक माहिती: $1",
        "uploadjava": "ही फाईल झीप ह्या प्रकारातील आहे ज्यामधे जावा .क्लास फाईल. आहे,जावा फाईलचे अपभारणास परवानगी नाही कारण त्याने सुरक्षा-बंधने टाळल्या जाऊ शकतात.",
index 0a5267d..865fa33 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Tambahkan laman-laman dan fail-fail yang saya sunting ke dalam senarai pantau saya",
        "tog-watchmoves": "Tambahkan laman-laman dan fail-fail yang saya pindah ke dalam senarai pantau saya",
        "tog-watchdeletion": "Tambahkan laman-laman dan fail-fail yang saya hapuskan ke dalam senarai pantau saya",
+       "tog-watchuploads": "Tambahkan fail baru yang saya muat naik ke senarai pantauan",
        "tog-watchrollback": "Tambahkan laman-laman yang saya undurkan ke dalam senarai pantau saya",
        "tog-minordefault": "Tandakan semua suntingan sebagai kecil secara lalai",
        "tog-previewontop": "Tunjukkan pralihat di atas kotak sunting",
@@ -49,7 +50,7 @@
        "tog-enotifminoredits": "Juga e-melkan saya untuk suntingan-suntingan laman dan fail yang kecil",
        "tog-enotifrevealaddr": "Serlahkan alamat e-mel saya dalam e-mel pemberitahuan",
        "tog-shownumberswatching": "Tunjukkan bilangan pemantau",
-       "tog-oldsig": "Tanda tangan yang sedia ada:",
+       "tog-oldsig": "Tandatangan yang sedia ada:",
        "tog-fancysig": "Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)",
        "tog-uselivepreview": "Gunakan prebiu langsung",
        "tog-forceeditsummary": "Tanya saya jika ringkasan suntingan kosong",
        "october-date": "$1 Oktober",
        "november-date": "$1 November",
        "december-date": "$1 Disember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
        "category_header": "Laman-laman dalam kategori \"$1\"",
        "subcategories": "Subkategori",
        "category-file-count-limited": "$1 fail berikut terdapat dalam kategori ini.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Laman terindeks",
-       "noindex-category": "Laman tak diindeks",
+       "noindex-category": "Laman tak diindekskan",
        "broken-file-category": "Laman yang ada pautan fail yang terputus",
        "about": "Perihal",
        "article": "Laman kandungan",
        "newwindow": "(dibuka di tetingkap baru)",
        "cancel": "Batal",
        "moredotdotdot": "Lagi...",
-       "morenotlisted": "Senarai ini tidak lengkap.",
+       "morenotlisted": "Senarai ini mungkin tidak lengkap.",
        "mypage": "Halaman",
        "mytalk": "Perbincangan",
        "anontalk": "Perbincangan",
        "searcharticle": "Pergi",
        "history": "Sejarah laman",
        "history_short": "Sejarah",
+       "history_small": "sejarah",
        "updatedmarker": "dikemaskinikan sejak kunjungan terakhir saya",
        "printableversion": "Versi boleh cetak",
        "permalink": "Pautan kekal",
        "talk": "Perbincangan",
        "views": "Rupa",
        "toolbox": "Peralatan",
+       "tool-link-userrights": "Tukar kumpulan {{GENDER:$1|pengguna}}",
+       "tool-link-userrights-readonly": "Lihat kumpulan {{GENDER:$1|pengguna}}",
+       "tool-link-emailuser": "Email {{GENDER:$1|pengguna}} ini",
        "userpage": "Lihat laman pengguna",
        "projectpage": "Lihat laman projek",
        "imagepage": "Lihat laman fail",
        "databaseerror-query": "Pertanyaan: $1",
        "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "Ralat: $1",
-       "transaction-duration-limit-exceeded": "Demi mengelakkan terjadinya jeda pengulangan yang tinggi, transaksi ini dibatalkan kerana tempoh menulis ($1) telah melebihi had $2 saat.",
+       "transaction-duration-limit-exceeded": "Demi mengelakkan terjadinya kelewatan pengulangan yang tinggi, transaksi ini dibatalkan kerana tempoh menulis ($1) telah melebihi had $2 saat.",
        "laggedslavemode": "Amaran: Laman ini mungkin bukan yang terkini.",
        "readonly": "Pangkalan data dikunci",
        "enterlockreason": "Sila nyatakan sebab penguncian dan jangkaan\nbila kunci ini akan dibuka.",
        "virus-scanfailed": "pengimbasan gagal (kod $1)",
        "virus-unknownscanner": "antivirus tidak dikenali:",
        "logouttext": "'''Anda telah log keluar.'''\n\nSila ingat bahawa sesetengah halaman mungkin masih dipaparkan seolah-olah anda masih log masuk hingga anda memadamkan cache pelayar anda.",
+       "cannotlogoutnow-title": "Tidak boleh melog keluar sekarang",
+       "cannotlogoutnow-text": "Melog keluar tidak boleh dilakukan apabila menggunakan $1",
        "welcomeuser": "Selamat datang, $1!",
        "welcomecreation-msg": "Akaun anda telah dibuka.\nJangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].",
        "yourname": "Nama pengguna:",
        "createacct-yourpasswordagain-ph": "Isikan kata laluan semula",
        "userlogin-remembermypassword": "Biar saya kekal log masuk",
        "userlogin-signwithsecure": "Gunakan sambungan terlindung",
+       "cannotlogin-title": "Tidak boleh melog masuk",
+       "cannotlogin-text": "Tidak mungkin boleh melog masuk.",
+       "cannotloginnow-title": "Tidak boleh melog masuk sekarang",
+       "cannotloginnow-text": "Melog masuk tidak boleh dilakukan apabila menggunakan $1",
+       "cannotcreateaccount-title": "Tidak boleh mencipta akaun",
+       "cannotcreateaccount-text": "Penciptaan akaun langsung tidak diaktifkan di wiki ini.",
        "yourdomainname": "Domain anda:",
        "password-change-forbidden": "Anda tidak dapat mengubah kata laluan di wiki ini.",
        "externaldberror": "Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.",
        "login": "Log masuk",
+       "login-security": "Mengesahkan identiti anda",
        "nav-login-createaccount": "Log masuk / buka akaun",
        "userlogin": "Log masuk / buka akaun",
        "userloginnocreate": "Log masuk",
        "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.",
+       "userlogin-reauth": "Anda mesti log masuk sekali lagi untuk mengesahkan bahawa anda adalah {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Buka satu lagi akaun",
        "createacct-emailrequired": "Alamat e-mel",
        "createacct-emailoptional": "Alamat e-mel (pilihan)",
        "createacct-email-ph": "Isikan alamt e-mel anda",
        "createacct-another-email-ph": "Masukkan alamat e-mel",
        "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",
        "createacct-submit": "Wujudkan akaun anda",
        "createacct-another-submit": "Buka akaun",
+       "createacct-continue-submit": "Teruskan penciptaan akaun",
+       "createacct-another-continue-submit": "Teruskan penciptaan akaun",
        "createacct-benefit-heading": "{{SITENAME}} dijayakan oleh orang ramai seperti anda.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntingan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "nocookieslogin": "{{SITENAME}} menggunakan ''cookies'' untuk mencatat status log masuk pengguna. Sila aktifkan sokongan ''cookies'' pada pelayar anda dan cuba lagi.",
        "nocookiesfornew": "Akaun pengguna tidak dicipta kerana kami tidak dapat sahkan sumbernya.\nPastikan anda telah bolehkan kuki, muat semula laman ini dan cuba lagi.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Akaun ini telah berjaya dicipta tetapi anda tidak boleh log masuk secara automatik. Sila ke [[Special:UserLogin|log masuk manual]].",
        "noname": "Nama pengguna tidak sah.",
-       "loginsuccesstitle": "Berjaya log masuk",
+       "loginsuccesstitle": "Berjaya melog masuk",
        "loginsuccess": "'''Anda telah log masuk ke dalam {{SITENAME}} sebagai \"$1\".'''",
-       "nosuchuser": "Pengguna \"$1\" tidak wujud. Nama pengguna adalah peka huruf besar. Sila semak ejaan anda, atau anda boleh [[Special:CreateAccount|membuka akaun baru]].",
+       "nosuchuser": "Tiada pengguna yang menggunakan nama \"$1\".\nNama pengguna adalah kes sensitif.\nSemak ejaan anda, atau sila [[Special:CreateAccount|membuka akaun baru]].",
        "nosuchusershort": "Pengguna \"$1\" tidak wujud. Sila semak ejaan anda.",
        "nouserspecified": "Sila nyatakan nama pengguna.",
        "login-userblocked": "Pengguna ini disekat. Log masuk tidak dibenarkan.",
        "noemail": "Tiada alamat e-mel direkodkan bagi pengguna \"$1\".",
        "noemailcreate": "Anda perlu memberikan alamat e-mel sah",
        "passwordsent": "Kata laluan baru telah dikirim kepada alamat\ne-mel yang didaftarkan oleh \"$1\".\nSila log masuk semula setelah anda menerima e-mel tersebut.",
-       "blocked-mailpassword": "Alamat IP anda telah disekat daripada sebarang penyuntingan, oleh itu, untuk\nmengelak penyalahgunaan, anda tidak dibenarkan menggunakan ciri pemulihan kata laluan.",
+       "blocked-mailpassword": "Alamat IP anda disekat dari menyunting. Untuk mengelakkan penyalahgunaan, ia tidak dibenarkan untuk menggunakan pemulihan kata laluan dari alamat IP ini.",
        "eauthentsent": "Sepucuk e-mel pengesahan telah dikirim kepada alamat e-mel yang dinyatakan.\nSebelum e-mel lain boleh dikirim kepada alamat tersebut, anda perlu mematuhi arahan-arahan pada e-mel pengesahan tersebut untuk mengesahkan bahawa alamat tersebut benar-benar kepunyaan anda.",
        "throttled-mailpassword": "E-mel set semula kata laluan telah dihantar dalam tempoh $1 jam yang lalu.\nUntuk mencegah salah guna, hanya sepucuk e-mel set semula kata laluan dihantar setiap {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Ralat ketika mengirim e-mel: $1",
-       "acct_creation_throttle_hit": "Pengunjung wiki ini yang menggunakan alamat IP anda telah membuka sebanyak $1 akaun semenjak sehari lepas, iaitu merupakan had maksimum yang dibenarkan dalam tempoh tersebut.\nAkibatknya, pengunjung dari alamat IP ini tidak boleh membuka akaun lagi pada masa sekarang.",
+       "acct_creation_throttle_hit": "Pelawat yang datang ke wiki ini menggunakan alamat IP anda telah mencipta $1 akaun dalam $2 terakhir, iaitu maksimum yang dibenarkan dalam tempoh masa ini.\nHasilnya, pelawat menggunakan alamat IP ini tidak boleh membuat apa-apa lebih akaun pada masa ini.",
        "emailauthenticated": "Alamat e-mel anda telah disahkan pada $2, $3.",
        "emailnotauthenticated": "Alamat e-mel anda belum disahkan. Oleh itu, e-mel tidak boleh dikirim bagi ciri-ciri berikut.",
        "noemailprefs": "Anda perlu menetapkan alamat e-mel terlebih dahulu untuk menggunakan ciri-ciri ini.",
        "createaccount-title": "Pembukaan akaun {{SITENAME}}",
        "createaccount-text": "Seseorang telah membuka akaun untuk\nalamat e-mel anda di {{SITENAME}} ($4) dengan nama \"$2\" dan kata laluan \"$3\".\nAnda boleh log masuk dan tukar kata laluan anda sekarang.\n\nSila abaikan mesej ini jika anda tidak meminta untuk membuka akaun tersebut.",
        "login-throttled": "Anda telah mencuba log masuk berulang kali.\nSila tunggu $1 dan cuba lagi.",
-       "login-abort-generic": "Log masuk anda tidak berjaya, dan terpaksa dibatalkan",
+       "login-abort-generic": "Log masuk anda tidak berjaya - Dibatalkan",
        "login-migrated-generic": "Akaun anda telah dipindahkan dan nama pengguna anda tidak lagi wujud di wiki ini.",
        "loginlanguagelabel": "Bahasa: $1",
        "suspicious-userlogout": "Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.",
        "createacct-another-realname-tip": "Nama sebenar adalah tidak wajib.\nJika anda memilih untuk menyatakannya, ini akan digunakan untuk memberikan atribusi kepada pengguna atas sumbangan mereka.",
        "pt-login": "Log masuk",
        "pt-login-button": "Log masuk",
+       "pt-login-continue-button": "Teruskan melog masuk",
        "pt-createaccount": "Buka akaun",
        "pt-userlogout": "Log keluar",
        "php-mail-error-unknown": "Ralat tak diketahui dalam fungsi mail() PHP",
        "newpassword": "Kata laluan baru:",
        "retypenew": "Ulangi kata laluan baru:",
        "resetpass_submit": "Tetapkan kata laluan dan log masuk",
-       "changepassword-success": "Kata laluan anda berjaya ditukar!",
+       "changepassword-success": "Kata laluan anda sudah ditukar!",
        "changepassword-throttled": "Anda telah melakukan terlalu banyak cubaan log masuk baru-baru ini.\nSila tunggu $1 dan cuba lagi.",
+       "botpasswords": "Kata laluan bot",
+       "botpasswords-summary": "<em>Kata laluan bot</em> membenarkan akses kepada akaun pengguna melalui API tanpa menggunakan butiran log masuk utama akaun. Hak-hak pengguna yang apabila log masuk dengan kata laluan bot mungkin terhad.\n\nJika anda tidak tahu mengapa anda mungkin mahu untuk melakukan ini, anda perlu mungkin tidak melakukannya. Tiada siapa yang pernah meminta kepada kamu untuk menjana satu ini dan memberikannya kepada mereka.",
+       "botpasswords-disabled": "Kata laluan bot dilumpuhkan.",
+       "botpasswords-no-central-id": "Untuk menggunakan kata laluan bot, anda mesti log masuk ke akaun berpusat.",
+       "botpasswords-existing": "Kata laluan bot yang sedia ada",
+       "botpasswords-createnew": "Buat kata laluan bot baru",
+       "botpasswords-editexisting": "Ubah kata laluan bot yang sedia ada",
+       "botpasswords-label-appid": "Nama bot:",
+       "botpasswords-label-create": "Cipta",
+       "botpasswords-label-update": "Kemas kini",
+       "botpasswords-label-cancel": "Batalkan",
+       "botpasswords-label-delete": "Hapuskan",
+       "botpasswords-label-resetpassword": "Set semula kata laluan",
+       "botpasswords-label-grants": "Pemberian berkenaan:",
        "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",
        "passwordreset-emaildisabled": "Ciri-ciri e-mel telah dipadamkan di wiki ini.",
        "passwordreset-username": "Nama pengguna:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Lihat e-mel yang terhasil?",
-       "passwordreset-capture-help": "Jika anda menandai ruang ini, e-mel (yang membawa kata laluan sementara) akan ditunjukkan kepada anda dan juga dihantar kepada pengguna itu.",
        "passwordreset-email": "Alamat e-mel:",
        "passwordreset-emailtitle": "Butiran akaun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Seseorang (mungkin anda, dari alamat IP $1) telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut\ndikaitkan dengan alamat e-mel ini:\n\n$2\n\n{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.",
        "saveprefs": "Simpan",
        "restoreprefs": "Pulihkan semua tetapan asali (dalam semua bahagian)",
        "prefs-editing": "Menyunting",
-       "rows": "Baris:",
-       "columns": "Lajur:",
        "searchresultshead": "Cari",
        "stub-threshold": "Ambang untuk pemformatan pautan tunas ($1):",
        "stub-threshold-sample-link": "contoh",
        "userrights-reason": "Sebab:",
        "userrights-no-interwiki": "Anda tidak mempunyai keizinan untuk mengubah hak-hak pengguna di wiki lain.",
        "userrights-nodatabase": "Pangkalan data $1 tiada atau bukan tempatan.",
-       "userrights-nologin": "Anda mesti [[Special:UserLogin|log masuk]] dengan akaun penyelia terlebih dahulu untuk memperuntukkan hak-hak pengguna.",
-       "userrights-notallowed": "Akuan anda tidak dibenarkan untuk menambah atau membuang hak pengguna.",
        "userrights-changeable-col": "Kumpulan yang anda boleh ubah",
        "userrights-unchangeable-col": "Kumpulan yang anda tak boleh ubah",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Percanggahan perubahan hak pengguna! Sila semak dan sahkan perubahan anda.",
-       "userrights-removed-self": "Anda telah berjaya menggugurkan hak-hak sendiri. Oleh yang demikian, anda tidak boleh mengakses halaman ini lagi.",
        "group": "Kumpulan:",
        "group-user": "Pengguna",
        "group-autoconfirmed": "Pengguna sah automatik",
        "right-siteadmin": "Mengunci dan membuka kunci pangkalan data",
        "right-override-export-depth": "Mengeksport laman termasuk laman dipaut sehingga kedalaman 5",
        "right-sendemail": "Mengirim e-mel kepada pengguna-pengguna lain",
-       "right-passwordreset": "Lihat e-mel set semula kata laluan",
        "right-managechangetags": "Mencipta dan menghapuskan [[Special:Tags|teg]] dari pangkalan data",
        "right-applychangetags": "Mengenakan [[Special:Tags|teg]] di samping suntingan seseorang",
        "right-changetags": "Menambah dan menggugurkan [[Special:Tags|teg]] yang dikenakan sembarangan pada semakan dan entri log individu",
        "uploaded-setting-handler-svg": "SVG yang menentukan atribut \"handler\" dengan remote/data/script disekat. Terdapat <code>$1=\"$2\"</code> dalam fail SVG yang dimuat naik.",
        "uploaded-remote-url-svg": "SVG yang menetapkan sebarang atribut style dengan URL luar dikekang. <code>$1=\"$2\"</code> ditemui di dalam fail SVG yang dimuat naik.",
        "uploaded-image-filter-svg": "Terdapat penapis imej dengan URL: <code>&lt;$1 $2=\"$3\"&gt;</code> dalam fail SVG yang dimuat naik.",
-       "uploadscriptednamespace": "Fail SVG ini mengandungi ruang nama terlarang \"$1\"",
+       "uploadscriptednamespace": "Fail SVG ini mengandungi ruang nama terlarang \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.",
        "uploadvirus": "Fail tersebut mengandungi virus! Butiran: $1",
        "uploadjava": "Fail ini ialah fail ZIP yang mengandungi fail .class Java.\nMemuat naik fail Java tidak dibenarkan, kerana boleh menyebabkan sekatan keselamatan dipintas.",
        "feedback-useragent": "Ejen pengguna:",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "mengandungi...",
-       "api-error-badaccess-groups": "Anda tidak dibenarkan memuat naik fail di wiki ini.",
        "api-error-badtoken": "Ralat dalaman: token tak elok.",
-       "api-error-copyuploaddisabled": "Ciri memuat naik melalui URL dimatikan di pelayan ini.",
-       "api-error-duplicate": "Di tapak ini sudah ada {{PLURAL:$1|satu fail lain|fail-fail lain}} yang sama kandungannya.",
-       "api-error-duplicate-archive": "Di tapak ini pernah ada {{PLURAL:$1|satu fail lain|fail-fail lain}} yang sama kandungannya, tetapi telah dihapuskan.",
-       "api-error-empty-file": "Fail yang anda serahkan adalah kosong.",
        "api-error-emptypage": "Anda tidak dibenarkan membuat laman baru yang kosong.",
-       "api-error-fetchfileerror": "Ralat dalaman: ada malasah ketika mengambil fail itu.",
-       "api-error-fileexists-forbidden": "Fail bernama \"$1\" sudah wujud, dan tidak boleh ditulis ganti.",
-       "api-error-fileexists-shared-forbidden": "Fail bernama \"$1\" sudah wujud dalam repositori fail kongsian, dan tidak boleh ditulis ganti.",
-       "api-error-file-too-large": "Fail yang anda serahkan adalah terlalu besar.",
-       "api-error-filename-tooshort": "Nama fail ini terlalu pendek.",
-       "api-error-filetype-banned": "Fail jenis ini adalah dilarang.",
-       "api-error-filetype-banned-type": "$1 merupakan {{PLURAL:$4|jenis|jenis-jenis}} fail yang dilarang. {{PLURAL:$3|Jenis|Jenis-jenis}} fail yang dibenarkan ialah $2.",
-       "api-error-filetype-missing": "Fail ini tiada sambungannya.",
-       "api-error-hookaborted": "Pengubahsuaian yang anda buat telah disekat oleh cangkuk sambungan.",
-       "api-error-http": "Ralat dalaman: tidak dapat bersambung dengan pelayan.",
-       "api-error-illegal-filename": "Nama fail ini tidak dibenarkan.",
-       "api-error-internal-error": "Ralat dalaman: ada masalah ketika memproseskan muat naik anda di wiki ini.",
-       "api-error-invalid-file-key": "Ralat dalaman: fail tidak dijumpai dalam storan sementara.",
-       "api-error-missingparam": "Ralat dalaman: kekosongan parameter pada permohonan.",
-       "api-error-missingresult": "Ralat dalaman: tidak dapat ditentukan sama ada penyalinan berjaya.",
-       "api-error-mustbeloggedin": "Anda mesti log masuk untuk memuat naik fail.",
-       "api-error-mustbeposted": "Ralat dalaman: permohonan memerlukan POST HTTP.",
-       "api-error-noimageinfo": "Muat naik berjaya, tetapi pelayan tidak memberi kita sebarang maklumat tentang fail itu.",
-       "api-error-nomodule": "Ralat dalaman: tiada modul muat naik yang ditetapkan.",
-       "api-error-ok-but-empty": "Ralat dalaman: tiada gerak balas dari pelayan.",
-       "api-error-overwrite": "Menulis ganti fail yang telah wujud adalah tidak dibenarkan.",
-       "api-error-stashfailed": "Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.",
        "api-error-publishfailed": "Ralat dalaman: Pelayan tidak dapat menerbitkan fail sementara.",
-       "api-error-stasherror": "Terdapat ralat ketika menyimpan fail yang dimuat naik.",
-       "api-error-stashedfilenotfound": "Fail yang disimpan tidak dijumpai apabila cuba untuk memuat naik dari simpanan.",
-       "api-error-stashpathinvalid": "Laluan di mana fail disimpan sepatutnya didapati tidak sah.",
-       "api-error-stashfilestorage": "Terdapat ralat semasa menyimpan fail dalam simpanan.",
-       "api-error-stashzerolength": "Pelayan tidak dapat menyimpan fail, kerana ia mempunyai panjang sifar.",
-       "api-error-stashnotloggedin": "Anda mesti log masuk untuk menyimpan fail-fail dalam stor muat naik.",
-       "api-error-stashwrongowner": "Fail yang anda cuba akses dalam stor itu bukan milik anda.",
-       "api-error-stashnosuchfilekey": "Kunci fail yang anda cuba akses dalam stor itu tidak wujud.",
-       "api-error-timeout": "Pelayan tidak bergerak balas dalam tempoh yang diharapkan.",
-       "api-error-unclassified": "Berlakunya ralat yang tidak diketahui",
-       "api-error-unknown-code": "Ralat tidak diketahui: \"$1\"",
-       "api-error-unknown-error": "Ralat dalaman: ada masalah apabila cuba memuat naik fail anda.",
+       "api-error-stashfailed": "Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.",
        "api-error-unknown-warning": "Amaran tidak diketahui: $1",
        "api-error-unknownerror": "Ralat tidak dikenali: \"$1\".",
-       "api-error-uploaddisabled": "Ciri muat naik dimatikan di wiki ini.",
-       "api-error-verification-error": "Fail ini mungkin tercemar atau tersalah sambungannya.",
        "duration-seconds": "$1 saat",
        "duration-minutes": "$1 minit",
        "duration-hours": "$1 jam",
index db52b06..4166acc 100644 (file)
        "passwordreset-emaildisabled": "Karatteristiċi tal-posta elettronika ġew diżattivati fuq din il-wiki.",
        "passwordreset-username": "Isem l-utent:",
        "passwordreset-domain": "Dominju:",
-       "passwordreset-capture": "Ara l-kontenut tal-messaġġ?",
-       "passwordreset-capture-help": "Jekk tagħżel din il-kaxxa, l-indirizz elettroniku (bil-password temporanja) se jiġi muri lilek barra milli jintbagħat lill-utent.",
        "passwordreset-email": "Indirizz elettroniku:",
        "passwordreset-emailtitle": "Dettalji tal-kont fuq {{SITENAME}}",
        "passwordreset-emailtext-ip": "Xi ħadd (probabbilment int, mill-indirizz IP $1) għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). L-{{PLURAL:$3|utent assoċjat|utenti assoċjati}} ma' dan l-indirizz elettroniku {{PLURAL:$3|huwa|huma}}:\n\n$2\n\n{{PLURAL:$3|Din il-password temporanja se tiskadi|Dawn il-passwords temporanji se jiskadu}} fi żmien {{PLURAL:$5|ġurnata|$5 jum}}. Inti għadek tidħol fil-kont tiegħek u tagħżel password ġdida issa. Jekk xi ħadd ieħor għamel din ir-rikjesta, jew jekk ftakart il-password oriġinali, u m'għadekx trid tbiddilha, inti tista' tinjora dan il-messaġġ u tibqa' tuża' l-password il-qadima.",
        "saveprefs": "Salva l-preferenzi",
        "restoreprefs": "Irkupra l-konfigurazzjoni oriġinali (fis-sezzjonijiet kollha)",
        "prefs-editing": "Modifiki",
-       "rows": "Fillieri:",
-       "columns": "Kolonni:",
        "searchresultshead": "Fittex",
        "stub-threshold": "Valur minimu għall-<a href=\"#\" class=\"stub\">ħoloq għall-abozzi</a>, f'bytes:",
        "stub-threshold-disabled": "Diżattivat",
        "userrights-reason": "Raġuni:",
        "userrights-no-interwiki": "M'għandekx permess tagħmel modifiki fid-drittijiet tal-utenti fuq siti oħrajn.",
        "userrights-nodatabase": "Id-Database $1 ma jeżistix jew inkella mhux database lokali.",
-       "userrights-nologin": "Sabiex tkun tista' tagħti drittijiet lill-utenti hemm bżonn li [[Special:UserLogin|tidħol]] bħala amministratur.",
-       "userrights-notallowed": "Il-kont tiegħek m'għandux il-permessi neċessarji li jżid jew ineħħi drittijiet tal-utent.",
        "userrights-changeable-col": "Gruppi li tista' tbiddel",
        "userrights-unchangeable-col": "Gruppi li ma tistax tbiddel",
-       "userrights-removed-self": "Neħħejt b'suċċess id-drittijiet tiegħek. B'hekk, m'għadekx tista' taċċessa din il-paġna.",
        "group": "Grupp:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti konfermati awtomatikament",
        "right-siteadmin": "Agħlaq u iftaħ id-database",
        "right-override-export-depth": "Jesporta paġni li jinkludu paġni b'ħoloq sa fond ta' 5",
        "right-sendemail": "Jibgħat ittri-e lil utenti oħra",
-       "right-passwordreset": "Jara l-messaġġi tal-impostazzjoni mill-ġdid tal-password",
        "right-managechangetags": "Joħloq u jħassar [[Special:Tags|tikketti]] mid-''database''",
        "right-applychangetags": "Japplika [[Special:Tags|tikketti]] flimkien mal-modifiki tiegħu",
        "right-changetags": "Iżid u jneħħi [[Special:Tags|tikketti]] partikulari f'reviżjonijiet u f'daħliet fir-reġistru",
        "uploaddisabledtext": "It-tlugħ ta' fajls mhuwiex attiv.",
        "php-uploaddisabledtext": "It-tlugħ tal-fajls permezz tal-PHP huwa diżattivat. Iċċekkja l-konfigurazzjoni ta' file_uploads.",
        "uploadscripted": "Dan il-fajl fih kodiċi ta' ''HTML'' u ''script'' li jista' jkun interpretat hażin mill-''web browser''.",
-       "uploadscriptednamespace": "Il-fajl SVG jinkludi spazju tal-isem \"$1\" li mhuwiex permess.",
+       "uploadscriptednamespace": "Il-fajl SVG jinkludi spazju tal-isem \"<nowiki>$1</nowiki>\" li mhuwiex permess.",
        "uploadinvalidxml": "L-XML fil-fajl imtella' ma setax jiġi analizzat.",
        "uploadvirus": "Dan il-fajl huwa infettat b'virus! Dettalji: $1",
        "uploadjava": "Il-fajl huwa fajl ZIP li jinkludi fajl .class tal-Java.\nIt-tlugħ ta' fajls tal-Java mhuwiex permess, minħabba li jistgħu jaqbżu restrizzjonijiet ta' sigurtà.",
        "feedback-useragent": "Aġent tal-utent:",
        "searchsuggest-search": "Fittex",
        "searchsuggest-containing": "li tinkludi...",
-       "api-error-badaccess-groups": "Mintix permess li ttella' fajls fuq din il-wiki.",
        "api-error-badtoken": "Żball intern: <em>Token</em> ħażin.",
-       "api-error-copyuploaddisabled": "It-tlugħ ta' fajls bl-użu tal-URL mhuwiex permess fuq dan is-server.",
-       "api-error-duplicate": "Hemm {{PLURAL:$1|fajl ieħor|xi fajls oħra}} diġà fuq dan is-sit bl-istess kontenut.",
-       "api-error-empty-file": "Il-fajl li bgħatt kien vojt.",
        "api-error-emptypage": "Mhuwiex permess il-ħolqien ta' paġna ġdida vojta.",
-       "api-error-fetchfileerror": "Żball intern: Kien hemm problema waqt il-kisba tal-fajl.",
-       "api-error-fileexists-forbidden": "Fajl bl-isem \"$1\" diġà jeżisti, u ma jistax jiġi miktub fuqu.",
-       "api-error-fileexists-shared-forbidden": "Fajl bl-isem \"$1\" diġà jeżisti fir-repożitorju maqsum u ma jistax jiġi miktub fuqu.",
-       "api-error-file-too-large": "Il-fajl magħżul huwa wisq kbir.",
-       "api-error-filename-tooshort": "L-isem tal-fajl huwa qasir wisq.",
-       "api-error-filetype-banned": "It-tip ta' fajl mhuwiex aċċettat.",
-       "api-error-filetype-missing": "L-isem tal-fajl jonqsu l-estensjoni.",
-       "api-error-http": "Żball intern: Mhuwiex possibbli li taqbad mas-server.",
-       "api-error-illegal-filename": "L-isem tal-fajl mhuwiex permess.",
-       "api-error-internal-error": "Żball intern: Xi ħaġa marret ħażina fl-ipproċessar tat-tlugħ tiegħek fuq din il-wiki.",
-       "api-error-invalid-file-key": "Żball intern: Il-fajl ma nstabx fil-ħażna temporanja.",
-       "api-error-missingparam": "Żball intern: Parametri tar-rikjesta nieqsa.",
-       "api-error-missingresult": "Żball intern: Mhuwiex magħruf jekk il-kopja rnexxietx.",
-       "api-error-mustbeloggedin": "Trid tkun fil-kont tiegħek sabiex ittella' fajls.",
-       "api-error-mustbeposted": "Żball intern: Ir-rikjesta għandha bżonn tal-HTTP POST.",
-       "api-error-noimageinfo": "It-tlugħ tal-fajl irnexxa, imma s-server ma ta lura l-ebda informazzjoni dwar il-fajl.",
-       "api-error-ok-but-empty": "Żball intern: L-ebda rispons mis-server.",
-       "api-error-overwrite": "Li tikteb fuq fajl diġà eżistenti mhuwiex permess.",
-       "api-error-stashfailed": "Żball intern: Is-server falla milli jżomm fajl temporanju.",
        "api-error-publishfailed": "Żball intern: Is-server falla milli jippubblika l-fajl temporanju.",
-       "api-error-timeout": "Is-server ma tax risposta lura fil-ħin previst.",
-       "api-error-unclassified": "Inqala żball mhux magħruf.",
-       "api-error-unknown-code": "Żball mhux magħruf: \"$1\".",
-       "api-error-unknown-error": "Żball intern: Xi ħaġa marret ħażin fit-tlugħ tal-fajl.",
+       "api-error-stashfailed": "Żball intern: Is-server falla milli jżomm fajl temporanju.",
        "api-error-unknown-warning": "Avviż mhux magħruf: \"$1\".",
        "api-error-unknownerror": "Żball mhux magħruf: \"$1\"",
-       "api-error-uploaddisabled": "It-tlugħ ta' fajls mhuwiex attivat fuq din il-wiki.",
-       "api-error-verification-error": "Dan il-fajl jista' jkun imħassar, jew għandu l-estensjoni l-ħażina.",
        "duration-seconds": "$1 {{PLURAL:$1|sekonda|sekondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|siegħa|sigħat}}",
index b9f669c..1555a31 100644 (file)
        "help": "အ​ကူ​အ​ညီ​",
        "search": "ရှာဖွေရန်",
        "searchbutton": "ရှာဖွေရန်",
-       "go": "သွား​ပါ​",
-       "searcharticle": "သွား​ပါ​",
+       "go": "သွားပါ",
+       "searcharticle": "သွားပါ",
        "history": "စာမျက်နှာ ရာဇဝင်",
        "history_short": "ရာဇဝင်",
        "updatedmarker": "နောက်ဆုံးကြည့်ပြီးသည့်နောက်ပိုင်း တည်းဖြတ်ထားသည်။",
        "listredirects": "ပြန်ညွှန်းသည့် လင့်များစာရင်း",
        "listduplicatedfiles": "ထပ်တူပုံပွားဖိုင်များ စာရင်း",
        "unusedtemplates": "မသုံးသော တမ်းပလိတ်များ",
-       "unusedtemplateswlh": "á\80¡á\80\81á\80¼á\80¬á\80¸á\80\9cá\80­á\80\95á\80ºá\80\85á\80¬များ",
+       "unusedtemplateswlh": "á\80¡á\80\81á\80¼á\80¬á\80¸á\80\9cá\80\84á\80·á\80ºá\80\81á\80ºများ",
        "randompage": "ကျပန်းစာမျက်နှာ",
        "randomincategory": "ကဏ္ဍတွင်းရှိ ကျပန်း စာမျက်နှာ",
        "randomincategory-category": "ကဏ္ဍ:",
        "allpagesto": "ဤသည်တွင်ဆုံးသော စာမျက်နှာများကို ပြရန် -",
        "allarticles": "စာမျက်နှာအားလုံး",
        "allinnamespace": "စာမျက်နှာအားလုံး (အမည်ညွှန်း $1)",
-       "allpagessubmit": "သွား​ပါ​",
+       "allpagessubmit": "သွားပါ",
        "allpages-hide-redirects": "ပြန်ညွှန်းများအား ဝှက်ရန်",
        "categories": "ကဏ္ဍများ",
        "categories-submit": "ပြသရန်",
        "sp-contributions-hideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို ဝှက်ရန်",
        "sp-contributions-submit": "ရှာဖွေရန်",
        "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
-       "whatlinkshere-title": "\"$1\" á\80\80á\80­á\80¯ á\80\9cá\80\84á\80·်ထားသော စာမျက်နှာများ",
+       "whatlinkshere-title": "\"$1\" á\80\9eá\80­á\80¯á\80· á\80\81á\80»á\80­á\80\90á\80ºá\80\86á\80\80်ထားသော စာမျက်နှာများ",
        "whatlinkshere-page": "စာမျက်နှာ -",
-       "linkshere": "အောက်ပါစာမျက်နှာများသည် '''[[:$1]]''' သို့ လင့်ထားသည် -",
+       "linkshere": "အောက်ပါစာမျက်နှာများသည် <strong>[[:$1]]</strong> သို့ ချိတ်ဆက်ထားသည် -",
        "nolinkshere": "'''[[:$1]]''' သို့ လင့်ထားသော စာမျက်နှာ မရှိပါ။",
        "isredirect": "ပြန်ညွှန်းသော စာမျက်နှာ",
        "istemplate": "ထည့်သွင်းကူးယူချက်",
        "confirm_purge_button": "အိုကေ",
        "imgmultipageprev": "← ပြီးခဲ့သော စာမျက်နှာ",
        "imgmultipagenext": "နောက်စာမျက်နှာ →",
-       "imgmultigo": "သွားပါ!",
+       "imgmultigo": "သွားပါ!",
        "imgmultigoto": "စာမျက်နှာ $1 ကို သွားရန်",
        "img-lang-default": "(ပင်မ ဘာသာစကား)",
        "table_pager_next": "နောက်စာမျက်နှာ",
        "table_pager_prev": "ပြီးခဲ့သော စာမျက်နှာ",
        "table_pager_first": "ပထမဆုံး စာမျက်နှာ",
        "table_pager_last": "နောက်ဆုံးစာမျက်နှာ",
-       "table_pager_limit_submit": "သွား​ပါ​",
+       "table_pager_limit_submit": "သွားပါ",
        "table_pager_empty": "မည်သည့်ရလဒ်မှ မရှိပါ",
        "autosumm-blank": "စာမျက်နှာကို ဗလာလုပ်လိုက်သည်",
        "autoredircomment": "စာမျက်နှာကို [[$1]] သို့ ပြန်ညွှန်းလိုက်သည်",
index 3d79d8c..ef4d79c 100644 (file)
        "prefs-misc": "Kî-thaⁿ ê siat-tēng",
        "saveprefs": "Pó-chûn siat-tēng",
        "prefs-editing": "Pian-chi̍p",
-       "rows": "Chōa:",
-       "columns": "Nôa",
        "searchresultshead": "Chhiau-chhōe kiat-kó ê siat-tēng",
        "recentchangesdays": "Hián-sī kúi ji̍t chòe-kīn ê kái-piàn:",
        "recentchangesdays-max": "siōng-choē $1 {{PLURAL:$1|kang|kang}}",
        "metadata-expand": "Hián-sī iù-chiat",
        "metadata-collapse": "Am iù-chiat",
        "metadata-fields": "佇顯示圖片的頁,若掀開元資料,下跤的EXIF資料會儂看著。其他的元資料是先看無。\n* 廠商\n* 機型\n* 翕像的時陣\n* 曝光\n* 光圈\n* ISO 速率\n* 焦距\n* 作者\n* 版權\n* 說明\n* 緯度(GPS)\n* 經度(GPS)\n* 海拔(GPS)",
+       "exif-xresolution": "Chúi-pêⁿ kái-siōng-tō͘",
+       "exif-yresolution": "Sûi-ti̍t kái-siōng-tō͘",
        "exif-software": "Sú-iōng ê nńg-thé",
        "exif-colorspace": "Sek-chhái khong-kan",
        "namespacesall": "choân-pō·",
index 5cb16cb..47d2bcf 100644 (file)
        "passwordreset-emaildisabled": "'E funzione e-mail songo state stutate dint'a sta wiki.",
        "passwordreset-username": "Nomme utente:",
        "passwordreset-domain": "Duminio:",
-       "passwordreset-capture": "Vulite vedé 'e cuntenute d' 'a mmasciata mail?",
-       "passwordreset-capture-help": "Si se seleziona sta cascia, 'a mmasciata e-mail (c' 'a password temporanea), se mmustarrà a vuje e poi pure se mannarrà a l'utente.",
        "passwordreset-email": "Indirizzo e-mail:",
        "passwordreset-emailtitle": "Dettaglie d' 'o cunto pe' {{SITENAME}}",
        "passwordreset-emailtext-ip": "Coccherun (può darse ca sì tu, cu n'indirizzo IP $1) ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
        "passwordreset-emailsentemail": "Si chesto fosse nu cunto e-mail suoccio a 'o cunto vuost, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
        "passwordreset-emailsentusername": "Si esistesse nu cunto e-mail suòccio a stu nomme utente, allora se mannarrà na mmasciata pe' riabbià 'a password.",
-       "passwordreset-emailsent-capture2": "L'email 'e reimpostazione d' 'a password {{PLURAL:$1|è stata mannata|so' state mannate}}. {{PLURAL:$1|'O nomme|L'elenco 'e nomme}} utente e password è mmustato ccà.",
-       "passwordreset-emailerror-capture2": "'O mannà 'email {{GENDER:$2|a ll'utente}} guastaje: $1. {{PLURAL:$3|'O nomme|L'elenco 'e nomme}} utente e password se ffà vedé ccà.",
        "passwordreset-nocaller": "Nu chiammate s'avess'a dà",
        "passwordreset-nosuchcaller": "'O chiammante nun esiste: $1",
        "passwordreset-ignored": "'A reimpustazione d' 'a password nun s'è gistita. Fosse ca nisciunu fornitore è stato mpustato?",
        "saveprefs": "Sarva",
        "restoreprefs": "Arripiglia 'e mpustaziune predefinite (inta tutte 'e seziune)",
        "prefs-editing": "Cascia 'e cagnamiento",
-       "rows": "Righe:",
-       "columns": "Culonne:",
        "searchresultshead": "Truova",
        "stub-threshold": "Valore lemmeto p' 'o furmato d' 'o cullegamento stub ($1):",
        "stub-threshold-sample-link": "mostra",
        "userrights-reason": "Mutivo:",
        "userrights-no-interwiki": "Nun tenite permesse pe' cagnà 'e deritte 'e l'utente ncopp'a l'ati wiki.",
        "userrights-nodatabase": "'O database $1 nun esiste o nun è nu database lucale.",
-       "userrights-nologin": "Avite 'a [[Special:UserLogin|trasì]] comme ammenistratore si vulite assegnà 'e deritte 'e l'utente.",
-       "userrights-notallowed": "Nun tenite 'e permesse pe' jognere o luvà 'e permesse utente.",
        "userrights-changeable-col": "Gruppe ca putite cagnà",
        "userrights-unchangeable-col": "Gruppe ca nun putite cagnà",
        "userrights-conflict": "Conflitto 'e cagnamiento 'e deritte utente! Cuntrullate e cunfermate 'e cagnamiente vuoste.",
-       "userrights-removed-self": "Avite rimosso 'e deritte vuoste. Picciò nun putite trasì cchiù dint'a sta paggena.",
        "group": "Gruppo:",
        "group-user": "Utente",
        "group-autoconfirmed": "Utente autocunfermate",
        "right-siteadmin": "Blocca e sblocca 'o database",
        "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
        "right-sendemail": "Manna na mail a ll'at'utente",
-       "right-passwordreset": "Vide 'e mmasciate 'e rimpustazione d' 'a password",
        "right-managechangetags": "Crìa e appiccia/stuta 'e [[Special:Tags|tag]]",
        "right-applychangetags": "Appreca [[Special:Tags|tag]] pe' tramente ca se fanno 'e cagnamiente 'e coccheruno",
        "right-changetags": "Azzecca o lèva a caso 'e [[Special:Tags|tag]] dint'a verziune nnividuale e riggistre 'e log",
        "uploaded-setting-handler-svg": "'o SVG ca mpustasse l'attribbuto \"handler\" cu nu remoto/date/script è bluccato. Truvato <code>$1=\"$2\"</code> dint' 'o file SVG carrecato.",
        "uploaded-remote-url-svg": "SVG ca mpustasse n'attribbuto 'e stile cu n'URL remota bluccata. Truvate <code>$1=\"$2\"</code> int' 'o file carrecato SVG.",
        "uploaded-image-filter-svg": "Truvato filtro immaggene cu n'URL: <code>&lt;$1 $2=\"$3\"&gt;</code> int' 'o file SVG carrecato.",
-       "uploadscriptednamespace": "Stu file SVG cuntene nu namespace '$1' nun permesso.",
+       "uploadscriptednamespace": "Stu file SVG cuntene nu namespace '<nowiki>$1</nowiki>' nun permesso.",
        "uploadinvalidxml": "'O códece XML d' 'o file carrecato nun se può passà.",
        "uploadvirus": "Stu file cuntene nu virus! Dettaglie: $1",
        "uploadjava": "Stu file è nu file ZIP ca cuntene nu file .class Java.\nCarrecà 'e file Java nun è permesso, pecché ponno appassà 'e restriziune 'e sicurezza.",
        "feedback-useragent": "Aggente utente:",
        "searchsuggest-search": "Truova",
        "searchsuggest-containing": "tène...",
-       "api-error-autoblocked": "Ll'indirizzo IP d' 'o vuosto è stato bloccato automaticamente, pecché a nu mumento l'ausaje n'utenza bloccata.",
-       "api-error-badaccess-groups": "Tun putite carrecà file ncopp' 'a sta wiki.",
        "api-error-badtoken": "Errore interno: 'O token nun è buono.",
-       "api-error-blocked": "Site stato/a bloccato/a, nun putite ffà cagnamiente.",
-       "api-error-copyuploaddisabled": "'A funzione carrcà 'e n'URL nun è appicciata dint'a stu server.",
-       "api-error-duplicate": "Nce {{PLURAL:$1|sta è n'atu file|stanno ati file}} ncopp' 'o sito ch' 'e cuntenute eguale eguale.",
-       "api-error-duplicate-archive": "Nce {{PLURAL:$1|steva n'atu file|stevano ati file}} già ncopp' 'o sito ch' 'e stisse cuntenute, però {{PLURAL:$1|è stato|so' state}} scancellate.",
-       "api-error-empty-file": "'O file ch'avite mannato è abbacante.",
        "api-error-emptypage": "'A criazione 'e paggene nuove abbacante nun è permessa.",
-       "api-error-fetchfileerror": "Errore interno: Coccosa ascette stuorta quanno se steva 'analizzà stu file.",
-       "api-error-fileexists-forbidden": "Nu file c' 'o nomme \"$1\" esiste già, e chisto nun pò essere sovrascritto.",
-       "api-error-fileexists-shared-forbidden": "Nu file c' 'o nomme \"$1\" esiste già dint' 'a l'archivio 'e file, e chisto nun pò essere sovrascritto.",
-       "api-error-file-too-large": "'O file ch'avite mannato è troppo gruosso.",
-       "api-error-filename-tooshort": "'O nomme d' 'o file è troppo curto.",
-       "api-error-filetype-banned": "Stu tipo 'e file nun è permesso.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun è nu tipo 'e file permesso|nun songo tipe 'e file permesse}}. {{PLURAL:$3|'O tipo 'e file permesso è|'E tipe 'e file permesse songo}} $2.",
-       "api-error-filetype-missing": "Stu file nun tene estensione.",
-       "api-error-hookaborted": "'O cagnamiento c'avite pruvato 'e fà è stato spezzato 'a na stensione.",
-       "api-error-http": "Errore interno: Nun putimmo ngarrà a nce cullegà a 'o server.",
-       "api-error-illegal-filename": "'O nomme d' 'o file nun è permesso.",
-       "api-error-internal-error": "Errore interno: Coccosa ascette male pe' tramente ca se steva processanno 'a carreca dint'a stu wiki.",
-       "api-error-invalid-file-key": "Errore interno: 'O file nun se pò truvà dint' 'a memoria temporanea.",
-       "api-error-missingparam": "Errore interno: nun se trovano 'e parametre pe' ne putè fà 'a richiesta.",
-       "api-error-missingresult": "Errore interno: Nun se pò sapè si 'a copia ascette bbona.",
-       "api-error-mustbeloggedin": "Avite 'a trasì ô sito si vulite carrecà file.",
-       "api-error-mustbeposted": "Errore interno: 'A richiesta vole HTTP POST.",
-       "api-error-noimageinfo": "A carreca ngarraje, ma 'o server nun ce ha pututo dà nisciuna nformazione ncopp' 'o file.",
-       "api-error-nomodule": "Errore interno: Nisciuno modulo 'e carreca mpustato.",
-       "api-error-ok-but-empty": "Errore interno: Nisciuna resposta 'a 'o server.",
-       "api-error-overwrite": "Sovrascrivere nu file ch'esiste già nun è permesso.",
-       "api-error-ratelimited": "Vuje avite tntato 'e carrecà cchiù file dint'a nu mumento curt' 'e tiempo ca sta wiki premmettesse.\nPe' piacere, tentate n'ata vota int'a nu poch' 'e minute.",
-       "api-error-stashfailed": "Errore interno: 'O server nun ngarraje a s'astipà 'o file temporaneo.",
        "api-error-publishfailed": "Errore interno: 'O server nun ngarraje a pubbrecà 'o file temporaneo.",
-       "api-error-stasherror": "'A carreca d' 'o file 'n stash è asciuta male, ce sta n'errore.",
-       "api-error-stashedfilenotfound": "'O file 'n stash nun è stato truvato pe' tramente ca se faceva 'a prova 'e carreca d' 'o stash.",
-       "api-error-stashpathinvalid": "'O cullegamento a 'o pizzo addò avesse stà 'o file 'e stash nun è bbuono.",
-       "api-error-stashfilestorage": "L'astipamento d' 'o file 'n stash è asciuto male, ce sta n'errore.",
-       "api-error-stashzerolength": "'O server nun può nzertà 'o file dint'a 'o stash, pecché è luongo zero zero.",
-       "api-error-stashnotloggedin": "Avisseve 'a trasì pe' ne putè astipà 'e file din' 'o stash 'e càrreca.",
-       "api-error-stashwrongowner": "'O file addò stavate a trasì dint' 'o stash nun v'appartene.",
-       "api-error-stashnosuchfilekey": "'A chiave d' 'o file addò stavate a trasì dint' 'o stash nun esiste.",
-       "api-error-timeout": "'O server nun rispunnette dint'a 'o tiempo stabbelito.",
-       "api-error-unclassified": "È capitato n'errore scanusciuto.",
-       "api-error-unknown-code": "Errore scanusciuto: \"$1\"",
-       "api-error-unknown-error": "Errore interno: Coccosa jette a fernì malalamente quano facisteve 'a carreca d' 'o file vuosto.",
+       "api-error-stashfailed": "Errore interno: 'O server nun ngarraje a s'astipà 'o file temporaneo.",
        "api-error-unknown-warning": "Avvertimento scanusciute: $1",
        "api-error-unknownerror": "Errore scanusciuto: \"$1\"",
-       "api-error-uploaddisabled": "'E carreche so' stutate dint'a sta siki.",
-       "api-error-verification-error": "Stu file putesse stà nguacchiato, o tene n'estensione sbagliata.",
-       "api-error-was-deleted": "Nu file cu stu nomme s'è carrecato primma e po' s'è scancellaje.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|seconde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index de4ad44..445a36e 100644 (file)
@@ -78,7 +78,7 @@
        "tog-enotifminoredits": "Send meg e-post også ved mindre endringer av sider og filer",
        "tog-enotifrevealaddr": "Vis min e-postadresse i utgående meldinger",
        "tog-shownumberswatching": "Vis antall brukere som overvåker",
-       "tog-oldsig": "Nåværende signatur:",
+       "tog-oldsig": "Gjeldende signatur:",
        "tog-fancysig": "Behandle signaturen som wikitekst (uten automatisk lenke)",
        "tog-uselivepreview": "Bruk levende forhåndsvisning",
        "tog-forceeditsummary": "Advar meg når jeg ikke gir noen redigeringsforklaring",
        "changeemail": "Endre eller fjerne epostadresse",
        "changeemail-header": "Fyll ut dette skjemaet for å bytte din epost-adresse. Hvis du vil fjerne epostadressen fra din konto, kan du la ny epostadresse-feltet være tomt når.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
-       "changeemail-oldemail": "Nåværende e-postadresse:",
+       "changeemail-oldemail": "Gjeldende e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
        "changeemail-newemail-help": "Dette feltet bør stå blankt hvis du ønsker å fjerne epostadressen din. Det vil ikke være mulig å nullstille et glemt passord og du vil ikke motta noen eposter fra denne wikien hvis epostadressen fjernes.",
        "changeemail-none": "(ingen)",
        "blockedtitle": "Brukeren er blokkert",
        "blockedtext": "'''Ditt brukernavn eller din IP-adresse har blitt blokkert.'''\n\nBlokkeringen ble utført av $1. Grunnen som ble oppgitt var ''$2''.\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkering ment på: $7\n\nDu kan kontakte $1 eller en annen [[{{MediaWiki:Grouppage-sysop}}|administrator]] for å diskutere blokkeringen.\nDu kan ikke bruke «E-post til denne brukeren»-funksjonen med mindre du har oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]] og du ikke er blokkert fra å sende e-post.\nDin nåværende IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta all denne informasjonen ved henvendelser.",
        "autoblockedtext": "Din IP-adresse har blitt automatisk blokkert fordi den ble brukt av en annen bruker som ble blokkert av $1.\nDen oppgitte grunnen var:\n\n:'''$2'''\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkeringen er ment for: $7\n\nDu kan kontakte $1 eller en av de andre [[{{MediaWiki:Grouppage-sysop}}|administratorene]] for å diskutere blokkeringen.\n\nMerk at du ikke kan bruke «E-post til denne brukeren»-funksjonen med mindre du har registrert en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].\n\nDin IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta med all denne informasjonen ved henvendelser.",
-       "systemblockedtext": "Ditt brukernavn eller IP-adresse har blitt blokkert automatisk av MediaWiki.\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokaden startet: $8\n* Blokaden gjelder til: $6\n* Blokaden er ment for: $7\n\nDin nåværende IP-adresse er $3.\nVennligst inkluder informasjonen over i alle spørsmål du spør angående dette.",
+       "systemblockedtext": "Ditt brukernavn eller IP-adresse har blitt blokkert automatisk av MediaWiki.\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokkeringen startet: $8\n* Blokkeringen gjelder til: $6\n* Blokkeringen er ment for: $7\n\nDin nåværende IP-adresse er $3.\nVennligst inkluder informasjonen over i alle spørsmål du spør angående dette.",
        "blockednoreason": "ingen grunn gitt",
        "whitelistedittext": "Du må $1 for å redigere artikler.",
        "confirmedittext": "Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].",
        "nosuchsectiontitle": "Finner ikke avsnittet",
        "nosuchsectiontext": "Du prøvde å redigere et avsnitt som ikke eksisterer.\nDet kan ha blitt flyttet eller slettet mens du så på siden.",
        "loginreqtitle": "Innlogging kreves",
-       "loginreqlink": "logg inn",
+       "loginreqlink": "logge inn",
        "loginreqpagetext": "Du må $1 for å se andre sider.",
        "accmailtitle": "Passord sendt.",
        "accmailtext": "Et tilfeldig passord for [[User talk:$1|$1]] har blitt sendt til $2. Det kan endres på [[Special:ChangePassword|passordendringssiden]] under innlogging.",
        "search-interwiki-caption": "Søsterprosjekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mer)",
+       "search-interwiki-more-results": "flere resultater",
        "search-relatedarticle": "Relatert",
        "searchrelated": "relatert",
        "searchall": "alle",
        "editusergroup": "Last brukergrupper",
        "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Viser {{GENDER:$1|brukerrettighetene}} til  <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Rediger brukergrupper",
-       "userrights-viewusergroup": "Se brukergrupper",
+       "userrights-editusergroup": "Rediger {{GENDER:$1|brukergrupper}}",
+       "userrights-viewusergroup": "Se {{GENDER:$1|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.",
+       "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-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-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-feedbacklink": "Gi tilbakemelding på de nye (beta)filtrene",
+       "rcfilters-highlightbutton-title": "Marker resultater",
+       "rcfilters-highlightmenu-title": "Velg en farge",
        "rcfilters-filterlist-noresults": "Ingen filtre funnet",
        "rcfilters-filtergroup-registration": "Brukerregistrering",
        "rcfilters-filter-registered-label": "Registrerte",
        "uploaded-setting-handler-svg": "SVG-er som setter «handler»-attributtet med remote/data/script er blokkert. Fant <code>$1=\"$2\"</code> i den opplastede SVG-fila.",
        "uploaded-remote-url-svg": "SVG-er som setter et stilattributt med ekstern URL er blokkert. Fant <code>$1=\"$2\"</code> i den opplastede SVG-fila.",
        "uploaded-image-filter-svg": "Fant bildefilter med URL: <code>&lt;$1 $2=\"$3\"&gt;</code> i den opplastede SVG-fila.",
-       "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
+       "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
        "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
        "uploadjava": "Filen er en ZIP-fil som inneholder en Java-fil av typen .class.\nDet er ikke tillatt å laste opp Java-filer, fordi de kan omgå sikkerhetsrestriksjoner.",
        "filerevert-submit": "Tilbakestill",
        "filerevert-success": "'''[[Media:$1|$1]]''' ble tilbakestilt til [$4 versjonen à $2, $3].",
        "filerevert-badversion": "Det er ingen tidligere lokal versjon av denne filen med det gitte tidstrykket.",
-       "filerevert-identical": "Den nåværende versjonen av fila er allerede identisk med den valgte.",
+       "filerevert-identical": "Den gjeldende versjonen av fila er allerede identisk med den valgte.",
        "filedelete": "Slett $1",
        "filedelete-legend": "Slett fil",
        "filedelete-intro": "Du er i ferd med å slette filen '''[[Media:$1|$1]]''' sammen med hele dens historikk.",
        "enotif_subject_restored": "{{SITENAME}}-siden $1 har blitt gjenopprettet av {{gender:$2|$2}}",
        "enotif_subject_changed": "{{SITENAME}}-siden $1 har blitt endret av {{gender:$2|$2}}",
        "enotif_body_intro_deleted": "{{SITENAME}}-siden $1 ble slettet $PAGEEDITDATE av {{gender:$2|$2}}; se $3.",
-       "enotif_body_intro_created": "{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
+       "enotif_body_intro_created": "{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{GENDER:$2|$2}}. Se $3 for den nåværende versjonen.",
        "enotif_body_intro_moved": "{{SITENAME}}-siden $1 ble flyttet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
        "enotif_body_intro_restored": "{{SITENAME}}-siden $1 ble gjenopprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
-       "enotif_body_intro_changed": "{{SITENAME}}-siden $1 ble endret $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.",
+       "enotif_body_intro_changed": "{{SITENAME}}-siden $1 ble endret $PAGEEDITDATE av {{GENDER:$2|$2}}. Se $3 for den nåværende versjonen.",
        "enotif_lastvisited": "Se $1 for alle endringer siden ditt forrige besøk.",
        "enotif_lastdiff": "Se $1 for å se denne endringen.",
        "enotif_anon_editor": "anonym bruker $1",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>",
        "revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]",
        "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Tilbakestilte endringer av $1; endret til siste versjon av $2.",
+       "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Tilbakestilte endringer av $1;\nendret tilbake til siste revisjon av $2. [$3 Vis endringer]",
        "sessionfailure-title": "Sesjonsfeil",
        "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
        "protect-unchain-permissions": "Lås opp flere beskyttelsesinnstillinger",
        "protect-text": "Du kan se og endre beskyttelsesnivået for siden '''$1''' her.",
        "protect-locked-blocked": "Du kan ikke endre beskyttelsesnivåer mens du er blokkert. Dette er de nåværende innstillingene for siden '''$1''':",
-       "protect-locked-dblock": "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de nåværende innstillingene for siden '''$1''':",
+       "protect-locked-dblock": "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de gjeldende innstillingene for siden '''$1''':",
        "protect-locked-access": "Kontoen din har ikke tillatelse til å endre sidebeskyttelsesnivå.\nDette er de nåværende innstillingene for siden '''$1''':",
        "protect-cascadeon": "Denne siden er for tiden beskyttet fordi den er transkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.\nDu kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.",
        "protect-default": "Tillat alle brukere",
        "allmessages": "Systemmeldinger",
        "allmessagesname": "Navn",
        "allmessagesdefault": "Standardtekst",
-       "allmessagescurrent": "Nåværende tekst",
+       "allmessagescurrent": "Gjeldende beskjedtekst",
        "allmessagestext": "Dette er en liste over tilgjengelige systemmeldinger i MediaWiki-navnerommet.\nBesøk [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Oversettelse] og [https://translatewiki.net translatewiki.net] om du ønsker å bidra med oversettelse av MediaWiki.",
        "allmessagesnotsupportedDB": "''{{ns:special}}:Allmessages'' kan ikke brukes fordi '''$wgUseDatabaseMessages''' er slått av.",
        "allmessages-filter-legend": "Filtrér",
        "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
-       "logentry-delete-delete_redir": "$1 {{GENDER:$2|sletta}} omdirigeringa $3 gjennom overskriving",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettet}} omdirigeringen $3 ved å overskrive",
        "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4",
        "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Legg til en kategori …",
+       "mw-widgets-usersmultiselect-placeholder": "Legg til flere ...",
        "sessionmanager-tie": "Kan ikke kombinere flere forespørselsautentiseringstyper: $1",
        "sessionprovider-generic": "$1 sesjoner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
index 96c4c7a..bc84842 100644 (file)
        "uploaddisabledtext": "फाइल उर्ध्वभरण अक्षम पारिएकोछ",
        "php-uploaddisabledtext": "PHP मा फाइल उर्ध्वभरण अक्षम गरिएकोछ।\nकृपया फाइल उर्ध्वभरण व्यवस्था(setting) जाँच्नुहोस्।",
        "uploadscripted": "यस फाइलमा एचटीएमयल वा स्क्रिप्ट कोड छ, जुन वेब ब्राउजरद्वारा गलत पढ्न सकिनेछ।",
-       "uploadscriptednamespace": "यो एसभिजी फाइलमा गैह्रकानुनी नेमस्पेस \"$1\" रहेको छ ।",
+       "uploadscriptednamespace": "यो एसभिजी फाइलमा गैह्रकानुनी नेमस्पेस \"<nowiki>$1</nowiki>\" रहेको छ ।",
        "uploadinvalidxml": "अपलोड गरिएको फाइलमा रहेको एक्सयमयल पार्स गर्न सकिंदैन।",
        "uploadvirus": "फाइलमा भाइरस छ!\nविवरण:$1",
        "uploadjava": "यो फाइल एक जिप फाइल हो जसमा एउटा जाभा .class फाइल छ।\nजाभा फाइलहरू अपलोड गर्नु बन्देज छ, किनकि यसको कारण सुरक्षा बाधाहरू पार गर्न सकिन्छ।",
index 834e1c7..ea443c5 100644 (file)
@@ -82,7 +82,9 @@
                        "MrLeopold",
                        "Hex",
                        "Xxmarijnw",
-                       "Mainframe98"
+                       "Mainframe98",
+                       "QZanden",
+                       "Huhbakker"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-nocaller": "Een aanroeper moet worden opgegeven",
        "passwordreset-nosuchcaller": "Aanroeper bestaat niet: $1",
-       "passwordreset-ignored": "Opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
+       "passwordreset-ignored": "Het opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
        "passwordreset-invalidemail": "Ongeldig e-mailadres",
        "passwordreset-nodata": "Er is geen gebruikersnaam of e-mailadres opgegeven",
        "changeemail": "E-mailadres wijzigen of verwijderen",
        "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar deze pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
        "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
-       "summary-preview": "Bewerkingssamenvatting nakijken:",
-       "subject-preview": "Onderwerp nakijken:",
+       "summary-preview": "Voorvertoning van de bewerkingssamenvatting:",
+       "subject-preview": "Voorvertoning van het onderwerp:",
        "previewerrortext": "Er is een fout opgetreden tijdens het weergeven van uw wijzigingen.",
        "blockedtitle": "Gebruiker is geblokkeerd",
        "blockedtext": "'''Uw gebruiker of IP-adres is geblokkeerd.'''\n\nDe blokkade is uitgevoerd door $1.\nDe opgegeven reden is ''$2''.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "search-interwiki-caption": "Zusterprojecten",
        "search-interwiki-default": "Resultaten van $1:",
        "search-interwiki-more": "(meer)",
+       "search-interwiki-more-results": "meer resultaten",
        "search-relatedarticle": "Gerelateerd",
        "searchrelated": "gerelateerd",
        "searchall": "alle",
        "editusergroup": "Gebruikersgroepen wijzigen",
        "editinguser": "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' $2",
        "viewinguserrights": "Gebruikersrechten bekijken van {{GENDER:$1|gebruiker}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Gebruikersgroepen wijzigen",
-       "userrights-viewusergroup": "Toon gebruikersgroepen",
+       "userrights-editusergroup": "{{GENDER:$1|Gebruikersgroepen}} wijzigen",
+       "userrights-viewusergroup": "Toon {{GENDER:$1|gebruikersgroepen}}",
        "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.",
+       "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-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-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-feedbacklink": "Geef feedback op de nieuwe (beta) filters",
+       "rcfilters-highlightbutton-title": "Resultaten markeren",
+       "rcfilters-highlightmenu-title": "Kies een kleur",
        "rcfilters-filterlist-noresults": "Geen filters gevonden",
        "rcfilters-filtergroup-registration": "Gebruikers-registratie",
        "rcfilters-filter-registered-label": "Geregistreerd",
        "rcfilters-filter-registered-description": "Ingelogde gebruikers.",
        "rcfilters-filter-unregistered-label": "Niet-geregistreerd",
        "rcfilters-filter-unregistered-description": "Gebruikers die niet zijn ingelogd.",
+       "rcfilters-filtergroup-authorship": "Bewerken auteurschap",
        "rcfilters-filter-editsbyself-label": "Uw eigen bewerkingen",
        "rcfilters-filter-editsbyself-description": "Bewerkingen door u.",
        "rcfilters-filter-editsbyother-label": "Bewerkingen door anderen",
        "rcfilters-filter-newpages-label": "Nieuwe pagina's",
        "rcfilters-filter-newpages-description": "Bewerkingen die een nieuwe pagina aanmaken.",
        "rcfilters-filter-categorization-label": "Categorie wijzigingen",
+       "rcfilters-filter-categorization-description": "Categorisatie van pagina's tonen",
        "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}}).",
        "uploaded-setting-handler-svg": "SVG-bestanden die de eigenschap \"handler\" instellen met remote, data of script worden geblokkeerd. <code>$1=\"$2\"</code> is aangetroffen in het geüploade SVG-bestand.",
        "uploaded-remote-url-svg": "SVG-bestanden die de style-eigenschap gebruiken met een remote URL worden geblokkeerd. <code>$1=\"$2\"</code> is aangetroffen in het geüploade SVG-bestand.",
        "uploaded-image-filter-svg": "Er is een afbeeldingsfilter met URL aangetroffen: <code>&lt;$1 $2=\"$3\"&gt;</code> in het geüploade SVG-bestand.",
-       "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte \"$1\".",
+       "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte <nowiki>\"$1\"</nowiki>.",
        "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden verwerkt.",
        "uploadvirus": "Het bestand bevat een virus! Details: $1",
        "uploadjava": "Het bestand is een ZIP-bestand dat een Java .class-bestand bevat.\nHet uploaden van Java-bestanden is niet toegestaan omdat hiermee beveiligingsinstellingen omzeild kunnen worden.",
        "apisandbox-loading-results": "API-resultaten ontvangen...",
        "apisandbox-results-error": "Er is een fout opgetreden tijdens het laden van het antwoord op het API-verzoek: $1.",
        "apisandbox-request-selectformat-label": "Toon resultaat als:",
+       "apisandbox-request-format-url-label": "URL query string",
        "apisandbox-request-url-label": "Verzoek-URL:",
+       "apisandbox-request-json-label": "Verzoek JSON:",
        "apisandbox-request-time": "Doorlooptijd verzoek: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Token corrigeren en opnieuw verzenden",
        "apisandbox-results-fixtoken-fail": "Het ophalen van het token van type \"$1\" is mislukt.",
        "editcomment": "De bewerkingssamenvatting was: <em>$1</em>.",
        "revertpage": "Wijzigingen door [[Special:Contributions/$2|$2]] ([[User talk:$2|Overleg]]) hersteld tot de laatste versie door [[User:$1|$1]]",
        "revertpage-nouser": "Wijzigingen door een verborgen gebruiker teruggedraaid naar de laatste versie door {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "De wijzigingen door $1 zijn teruggedraaid.\nDe laatste versie van $2 is hersteld.",
+       "rollback-success": "De wijzigingen door {{GENDER:$3|$1}} zijn teruggedraaid.\nDe laatste versie van {{GENDER:$4|$2}} is hersteld.",
        "rollback-success-notify": "De wijzigingen door $1 zijn teruggedraaid;\nde laatste versie van $2 is hersteld. [$3 Wijzigingen weergeven]",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nGa een pagina terug, laad die pagina opnieuw en probeer het nog eens.",
        "newimages-showbots": "Uploads door bots weergeven",
        "newimages-hidepatrolled": "Gecontroleerde uploads verbergen",
        "noimages": "Er is niets te zien.",
+       "gallery-slideshow-toggle": "Miniaturen schakelen",
        "ilsubmit": "Zoeken",
        "bydate": "op datum",
        "sp-newimages-showfrom": "Nieuwe bestanden bekijken vanaf $1 om $2.",
        "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
        "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Voeg een categorie toe...",
+       "mw-widgets-usersmultiselect-placeholder": "Meer toevoegen...",
        "sessionmanager-tie": "Het is niet mogelijk om meerdere authenticatietypen voor verzoeken te combineren: $1.",
        "sessionprovider-generic": "$1-sessies",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "op cookies gebaseerde sessies",
        "log-action-filter-suppress-reblock": "Verbergen van gebruiker tijdens wijzigen blokkade",
        "log-action-filter-upload-upload": "Nieuwe upload",
        "log-action-filter-upload-overwrite": "Herupload",
+       "authmanager-authn-not-in-progress": "Verificatie is niet in uitvoering of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
+       "authmanager-authn-no-primary": "De meegeleverde inloggegevens kunnen niet worden geverifieerd.",
+       "authmanager-authn-no-local-user": "De ingevoerde inloggegevens zijn niet geassocieerd met een gebruiker op deze wiki.",
+       "authmanager-authn-no-local-user-link": "De meegeleverde inloggegevens zijn geldig, maar zijn niet gekoppeld aan enige gebruiker op deze wiki. Log in op een andere manier, of creëer een nieuwe gebruiker, en u heeft een optie om uw eerdere inloggegevens van te koppelen.",
        "authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
+       "authmanager-change-not-supported": "De meegeleverde inloggegevens kunnen niet worden gewijzigd, omdat niets deze zou gebruiken.",
        "authmanager-create-disabled": "Het aanmaken van accounts is uitgeschakeld.",
        "authmanager-create-from-login": "Om een account aan te maken, gelieve de velden in te vullen.",
+       "authmanager-create-not-in-progress": "Het maken van een account is niet in uitvoering of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
+       "authmanager-create-no-primary": "De meegeleverde inloggegevens kunnen niet worden gebruikt voor het aanmaken van uw account.",
+       "authmanager-link-no-primary": "De meegeleverde inloggegevens kunnen niet worden gebruikt om een account te koppelen.",
+       "authmanager-link-not-in-progress": "Account koppelen is niet gestart of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
        "authmanager-authplugin-setpass-failed-title": "Wachtwoord wijzigen is mislukt",
+       "authmanager-authplugin-setpass-failed-message": "De verificatie-invoegtoepassing heeft het wijzigen van het wachtwoord geweigerd.",
+       "authmanager-authplugin-create-fail": "De verificatie-invoegtoepassing heeft geweigerd uw account aan te maken.",
+       "authmanager-authplugin-setpass-denied": "De verificatie-invoegtoepassing staat het wijzigen van wachtwoorden niet toe.",
        "authmanager-authplugin-setpass-bad-domain": "Ongeldig domein.",
        "authmanager-autocreate-noperm": "Het automatisch aanmaken van accounts is niet toegestaan.",
        "authmanager-autocreate-exception": "Het automatisch aanmaken van accounts is tijdelijk uitgeschakelijk vanwege eerdere fouten.",
        "authmanager-provider-password": "Op wachtwoord gebaseerde authenticatie",
        "authmanager-provider-password-domain": "Wachtwoord- en domeingebaseerde authentificatie",
        "authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
+       "authprovider-confirmlink-message": "Op basis van uw recente login pogingen, kan het volgende account worden gekoppeld aan uw wiki account. Het koppelen van stelt U in staat in te loggen via deze accounts. Gelieve te selecteren welk account moet worden gekoppeld.",
        "authprovider-confirmlink-request-label": "Accounts die aan elkaar moeten worden gekoppeld.",
        "authprovider-confirmlink-success-line": "$1: Succesvol gekoppeld.",
+       "authprovider-confirmlink-failed": "Account koppelen is niet volledig gelukt: $1",
+       "authprovider-confirmlink-ok-help": "Doorgaan na het weergeven van de storingsmeldingen over het koppelen.",
        "authprovider-resetpass-skip-label": "Overslaan",
        "authprovider-resetpass-skip-help": "Sla het resetten van het wachtwoord over.",
+       "authform-nosession-login": "De verificatie is geslaagd, maar uw browser heeft niet \"onthouden\" ingelogd te zijn.\n!\n$1",
+       "authform-nosession-signup": "Het account is aangemaakt, maar uw browser heeft niet \"onthouden\" om ingelogd te zijn.\n!\n$1",
        "authform-newtoken": "Ontbrekend token. $1",
        "authform-notoken": "Ontbrekend token",
        "authform-wrongtoken": "Verkeerd token",
        "specialpage-securitylevel-not-allowed-title": "Niet toegestaan",
+       "specialpage-securitylevel-not-allowed": "Sorry, het is u niet toegestaan gebruik te maken van deze pagina omdat uw identiteit niet kon worden geverifieerd.",
+       "authpage-cannot-login": "Niet in staat om te beginnen met aanmelden.",
+       "authpage-cannot-login-continue": "Niet mogelijk om in te loggen. Uw sessie is waarschijnlijk verlopen.",
        "authpage-cannot-create": "Kon het account aanmaken niet starten.",
+       "authpage-cannot-create-continue": "Kan niet doorgaan met het aanmaken van een account. Uw sessie is waarschijnlijk verlopen.",
+       "authpage-cannot-link": "Niet in staat om het account te kunnen koppelen.",
+       "authpage-cannot-link-continue": "Niet mogelijk het account te koppelen. Uw sessie is waarschijnlijk verlopen.",
        "cannotauth-not-allowed-title": "Geen toegang",
        "cannotauth-not-allowed": "U hebt geen toestemming om deze pagina te gebruiken",
        "changecredentials": "Authenticatiegegevens wijzigen",
        "linkaccounts-submit": "Accounts koppelen",
        "unlinkaccounts": "Accounts ontkoppelen",
        "unlinkaccounts-success": "Het account is ontkoppeld.",
+       "authenticationdatachange-ignored": "De wijziging van de authenticatie gegevens zijn niet afgehandeld. Misschien is er geen provider is geconfigureerd?",
        "userjsispublic": "Let op: JavaScript deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
        "usercssispublic": "Let op: CSS deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
        "restrictionsfield-badip": "Ongeldig IP-adres of range: $1",
index c50b09e..2f90dc6 100644 (file)
        "newwindow": "(vert opna i eit nytt vindauge)",
        "cancel": "Avbryt",
        "moredotdotdot": "Meir …",
-       "morenotlisted": "Lista er ikkje heil.",
+       "morenotlisted": "Lista er kanskje ikkje heil.",
        "mypage": "Sida mi",
        "mytalk": "Diskusjon",
        "anontalk": "Diskusjon",
        "tagline": "Frå {{SITENAME}}",
        "help": "Hjelp",
        "search": "Søk",
+       "search-ignored-headings": "#<!-- la denne lina vere som ho er --> <pre>\n# Overskrifter som skal ignorerast av søk.\n# Endringar til denne trer i kraft så snart sida med overskrifta blir indeksert.\n# Du kan tvinge gjenindeksering av sida ved å gjere ein null-redigering.\n# Syntaksen er som fylgjer:\n# * Alt frå eit «#»-teikn til slutten av lina er ein kommentar.\n# * Kvar ikkje-blank line er den eksakte tittelen som skal ignorerast, det vert òg skilt mellom store og små bokstavar\nLitteratur\nBakgrunnsstoff\nKjelder\nReferansar\n#</pre> <!-- la denne line vere som ho er -->",
        "searchbutton": "Søk",
        "go": "Vis",
        "searcharticle": "Vis",
        "history": "Sidehistorikk",
        "history_short": "Historikk",
+       "history_small": "historikk",
        "updatedmarker": "oppdatert etter førre vitjinga mi",
        "printableversion": "Utskriftsversjon",
        "permalink": "Fast lenkje",
        "jumptonavigation": "navigering",
        "jumptosearch": "søk",
        "view-pool-error": "Diverre er filtenarane nett no opptekne.\nFor mange brukarar prøver å sjå denne sida.\nVent ei lita stund, før du prøver å sjå på sida.\n\n$1",
+       "generic-pool-error": "Beklagar, tjenarane er overbelasta for augneblinken.\nFor mange brukarar prøver å sjå denne ressursen.\nVent litt før du prøver igjen.",
        "pool-timeout": "Tidsavbrot under venting på låsing.",
        "pool-queuefull": "Køen er full.",
        "pool-errorunknown": "Ukjend feil",
        "error": "Feil",
        "databaseerror": "Databasefeil",
        "databaseerror-text": "Ein spørjefeil mot databasen har oppstått.\nDette kan indikere ein feil i programvara.",
+       "databaseerror-textcl": "Ein databasespørringsfeil oppsto.",
        "databaseerror-query": "Spørjing: $1",
        "databaseerror-function": "Funksjon: $1",
        "databaseerror-error": "Feil: $1",
        "readonly_lag": "Databasen er mellombels skriveverna for at databasetenarane skal kunna synkronisere seg mot kvarandre",
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
+       "internalerror-fatal-exception": "Alvorleg unntak av typen «$1»",
        "filecopyerror": "Kunne ikkje kopiere fila frå «$1» til «$2».",
        "filerenameerror": "Kunne ikkje døype om fila frå «$1» til «$2».",
        "filedeleteerror": "Kunne ikkje slette fila «$1».",
        "cannotdelete": "Kunne ikkje slette sida eller fila «$1».\nHo kan allereie vere sletta av andre.",
        "cannotdelete-title": "Kan ikkje sletta sida «$1»",
        "delete-hook-aborted": "Slettinga vart avbroten av ein funksjon.\nFunksjonen oppgav inga årsak.",
+       "no-null-revision": "Kunne ikkje opprette ny nullrevisjon for sida «$1»",
        "badtitle": "Feil i tittelen",
        "badtitletext": "Den ønskte tittelen var ulovleg, tom eller feillenkja frå ein annan wiki. Kanskje inneheld han eitt eller fleire teikn som ikkje kan brukast i sidetitlar.",
+       "title-invalid-empty": "Den etterspurde sidetittelen er tom eller inneheld berre namnet til eit namnerom.",
+       "title-invalid-utf8": "Den etterspurde sidetittelen inneheld ein ugyldig UTF-8-sekvens.",
+       "title-invalid-interwiki": "Den etterspurde sidetittelen inneheld ei interwikilenkje som ikkje kan nyttast i titlar.",
+       "title-invalid-talk-namespace": "Den etterspurde sidetittilen refererer til ei diskusjonsside som ikkje kan eksistere.",
+       "title-invalid-characters": "Den etterspurde sidetittelen inneheld ugyldige teikn: «$1».",
+       "title-invalid-relative": "Tittelen har ein relativ sti. Relative stititlar (./, ../) er ugyldige, fordi dei ofte ikkje vil vere tilgjengelege for brukarens nettlesar.",
+       "title-invalid-magic-tilde": "Den etterspurde sidetittelen inneheld ein ugyldig sekvens med magiske tildar (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Den etterspurde sidetittelen er for lang. Den kan ikkje vere lengre enn $1 {{PLURAL:$1|byte}} i UTF-8-koding.",
+       "title-invalid-leading-colon": "Den etterspurde sidetittelen inneheld eit ugyldig kolon i byrjinga.",
        "perfcached": "Dei følgjande dataa er frå mellomlageret åt tenaren og er ikkje utan vidare oppdatert. Høgst {{PLURAL:$1|eitt resultat er tilgjengeleg|$1 resultat er tilgjengelege}} i mellomlageret.",
        "perfcachedts": "Desse dataa er mellomlagra, og vart sist oppdaterte $1. Høgst {{PLURAL:$4|eitt resultat er tilgjengeleg|$4 resultat er tilgjengelege}} i mellomlageret.",
        "querypage-no-updates": "Oppdatering av denne sida er slått av, og data her vil ikkje verte fornya.",
        "viewyourtext": "Du kan sjå og kopiera kjelda til <strong>endringane dine</strong> på sida.",
        "protectedinterface": "Denne sida inneheld tekst nytta av brukargrensesnittet for programvara på wikien, og er låst for å hindra hærverk.\nFor å leggja til eller endra omsetjingar for alle wikiar, gjer vel å nytta [https://translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
        "editinginterface": "'''Åtvaring:''' Du endrar på ei side som inneheld tekst nytta av brukargrensesnittet for programvara.\nEndringar på denne sida påverkar utsjånaden til brukargrensesnittet for dei andre brukarane av wikien.\nFor å leggja til eller endra omsetjingar, gjer vel å nytta [https://translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
-       "cascadeprotected": "Denne sida er verna mot endring fordi ho er inkludert i {{PLURAL:$1|den opplista sida|dei opplista sidene}} som har djupvern slått på:\n$2",
+       "translateinterface": "For å legge til eller endre omsetjingar for alle wikiar, nytt [https://translatewiki.net/ translatewiki.net], lokaliseringsprosjektet til MediaWiki.",
+       "cascadeprotected": "Denne sida er verna mot endring fordi ho er inkludert i fylgjande {{PLURAL:$1|side|sider}} som har djupvern slått på:\n$2",
        "namespaceprotected": "Du har ikkje tilgang til å endre sidene i '''$1'''-namnerommet.",
        "customcssprotected": "↓Du har ikkje tilgang til å endre denne sida, fordi ho inneheld ein annan brukar sine personlege innstillingar.",
        "customjsprotected": "↓Du har ikkje tilgang til å endra denne JavaScript-sida fordi ho inneheld ein annen brukar sine personlege innstillingar.",
        "invalidtitle-knownnamespace": "Ugyldig tittel med namnerommet «$2» og teksten «$3»",
        "invalidtitle-unknownnamespace": "Ugyldig tittel med ukjend namneromstal $1 og teksten «$2»",
        "exception-nologin": "Ikkje innlogga",
-       "exception-nologin-text": "Sida eller handlinga krev at du er innlogga på wikien.",
+       "exception-nologin-text": "Logg inn for å få tilgang til denne sida eller handlinga.",
+       "exception-nologin-text-manual": "Du må $1 for å få tilgang til denne sida eller handlinga.",
        "virus-badscanner": "Dårleg konfigurasjon: ukjend virusskanner: ''$1''",
        "virus-scanfailed": "skanning mislukkast (kode $1)",
        "virus-unknownscanner": "ukjend antivirusprogram:",
-       "logouttext": "'''Du er no utlogga.'''\n\nDu kan no halde fram å bruke {{SITENAME}} anonymt, eller du kan <span class='plainlinks'>[$1 logge inn att]</span>  med same kontoen eller ein annan brukar kan logge inn.\nVer merksam på at nokre sider framleis kan visast fram som om du er innlogga fram til du slettar mellomlageret til nettlesaren din.",
+       "logouttext": "<strong>Du er no utlogga.</strong>\n\nVer merksam på at nokre sider framleis kan visast fram som om du er innlogga fram til du slettar mellomlageret til nettlesaren din.",
+       "cannotlogoutnow-title": "Kan ikkje logga ut nå",
+       "cannotlogoutnow-text": "Utlogging er ikkje mogleg når du nyttar $1.",
        "welcomeuser": "Velkomen, $1!",
        "welcomecreation-msg": "Brukarkontoen din er oppretta.\nGløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].",
        "yourname": "Brukarnamn:",
        "createacct-yourpasswordagain-ph": "Skriv inn passordet på nytt",
        "userlogin-remembermypassword": "Hald meg innlogga",
        "userlogin-signwithsecure": "Nytt trygg kopling",
+       "cannotlogin-title": "Kan ikkje logga inn",
+       "cannotlogin-text": "Innlogging er ikkje mogleg.",
+       "cannotloginnow-title": "Kan ikkje logga inn no",
+       "cannotloginnow-text": "Innlogging er ikkje mogleg når du nyttar $1.",
+       "cannotcreateaccount-title": "Kan ikkje opprette kontoar",
+       "cannotcreateaccount-text": "Direkte kontooppretting er ikkje slått på på denne wikien.",
        "yourdomainname": "Domenet ditt",
        "password-change-forbidden": "Du kan ikkje endra passord på denne wikien.",
        "externaldberror": "Det var anten ein ekstern databasefeil i tilgjengekontrollen, eller du har ikkje løyve til å oppdatere den eksterne kontoen din.",
        "login": "Logg inn",
+       "login-security": "Stadfest identiteten din",
        "nav-login-createaccount": "Lag brukarkonto / logg inn",
        "userlogin": "Lag brukarkonto / logg inn",
        "userloginnocreate": "Logg inn",
        "userlogin-resetpassword-link": "Gløymt passordet ditt?",
        "userlogin-helplink2": "Hjelp med innlogging",
        "userlogin-loggedin": "Du er alt innlogga som {{GENDER:$1|$1}}.\nNytt skjemaet nedanfor for å logga inn som ein annan brukar.",
+       "userlogin-reauth": "Du må logga inn igjen for å stadfesta at du er {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Opprett ein annan konto",
        "createacct-emailrequired": "E-postadresse:",
        "createacct-emailoptional": "E-postadresse (valfritt)",
        "createacct-email-ph": "Skriv inn e-postadressa di",
        "createacct-another-email-ph": "Skriv inn e-postadresse",
        "createaccountmail": "Bruk eit mellombels tilfeldig passord og send det til den oppgjevne e-postadressa",
+       "createaccountmail-help": "Kan nyttast til å opprette konto for ein annan person utan å lære passordet deira.",
        "createacct-realname": "Sant namn (valfritt)",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Kvifor du lagar ein ny konto",
        "createacct-submit": "Opprett kontoen din",
-       "createacct-another-submit": "Opprett ein konto til",
+       "createacct-another-submit": "Opprett konto",
+       "createacct-continue-submit": "Hald fram med kontooppretting",
+       "createacct-another-continue-submit": "Hald fram med kontooppretting",
        "createacct-benefit-heading": "{{SITENAME}} er laga av folk som deg.",
        "createacct-benefit-body1": "{{PLURAL:$1|éi endring|$1 endringar}}",
        "createacct-benefit-body2": "{{PLURAL:$1|éi side|$1 sider}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nyleg bidragsytar|nylege bidragsytarar}}",
        "badretype": "Passorda du skreiv inn er ikkje like.",
+       "usernameinprogress": "Ei kontooppretting for dette brukarnamnet pågår allereie.\nVent.",
        "userexists": "Brukarnamnet er alt i bruk. Vel eit anna brukarnamn.",
        "loginerror": "Innloggingsfeil",
        "createacct-error": "Kontoopprettingsfeil",
        "nocookiesnew": "Brukarkontoen vart oppretta, men du er ikkje innlogga. {{SITENAME}} bruker informasjonskapslar for å logge inn brukarar,\nnettlesaren din er innstilt for ikkje å godta desse. Etter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar, kan du logge inn med det nye brukarnamnet og passordet ditt.",
        "nocookieslogin": "{{SITENAME}} bruker informasjonskapslar for å logge inn brukarar, nettlesaren din er innstilt for ikkje å godta desse.\nEtter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar kan du prøve å logge inn på nytt.",
        "nocookiesfornew": "Brukarkontoen blei ikkje oppretta ettersom kjelda ikkje kunne stadfestast.\nSjå etter om du tek imot informasjonskapslar (cookies), last ned sida ein gong til og prøv igjen.",
+       "createacct-loginerror": "Kontoen ble oppretta, men du kunne ikkje bli logga inn automatisk. Hald fram til [[Special:UserLogin|manuell innlogging]].",
        "noname": "Du har ikkje oppgjeve gyldig brukarnamn.",
-       "loginsuccesstitle": "Du er no innlogga",
+       "loginsuccesstitle": "Innlogga",
        "loginsuccess": "Du er no innlogga som «$1».",
-       "nosuchuser": "Det finst ikkje nokon brukar med brukarnamnet «$1».\nBrukarnamn skil mellom stor og liten bokstav. Sjekk at du har skrive brukarnamet rett eller [[Special:CreateAccount|opprett ein ny konto]].",
+       "nosuchuser": "Det finst ikkje nokon brukar med brukarnamnet «$1».\nBrukarnamn skil mellom stor og liten bokstav.\nSjekk at du har skrive brukarnamet rett eller [[Special:CreateAccount|opprett ein ny konto]].",
        "nosuchusershort": "Det finst ikkje nokon brukar med brukarnamnet «$1». Sjekk at du har skrive rett.",
        "nouserspecified": "Du må oppgje eit brukarnamn.",
        "login-userblocked": "Denne brukaren er blokkert. Innlogging er ikkje tillate.",
        "wrongpassword": "Du har oppgjeve eit ugyldig passord. Prøv om att.",
        "wrongpasswordempty": "Du oppgav ikkje noko passord. Ver venleg og prøv igjen.",
        "passwordtooshort": "Passord må innehalda minst {{PLURAL:$1|eitt teikn|$1 teikn}}.",
+       "passwordtoolong": "Passord kan ikkje vera lengre enn {{PLURAL:$1|eitt|$1}} teikn.",
+       "passwordtoopopular": "Alminneleg valde passord kan ikkje nyttast. Vel eit meir unikt passord.",
        "password-name-match": "Passordet ditt lyt vera noko anna enn brukarnamnet ditt.",
        "password-login-forbidden": "Bruk av dette brukarnamnet og passordet er vorte forbode.",
        "mailmypassword": "Attendestill passord",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
+       "deprecated-self-close-category": "Sider som nyttar ugyldige sjølvlukkande HTML-merke.",
        "duplicate-args-warning": "<strong>Åtvaring:</strong> [[:$1]] kallar [[:$2]] med meir enn éin verdi for argumentet «$3». Berre den sist oppgjevne verdien vert nytta.",
        "expensive-parserfunction-warning": "Åtvaring: Denne sida inneheld for mange prosesskrevande parserfunksjonar.\n\nDet burde vere færre enn {{PLURAL:$2|$2|$2}}, men er no {{PLURAL:$1|$1|$1}}.",
        "expensive-parserfunction-category": "Sider med for mange prosesskrevande parserfunksjonar",
        "lineno": "Line $1:",
        "compareselectedversions": "Samanlikn valde versjonar",
        "showhideselectedversions": "Vis/løyn valde versjonar",
-       "editundo": "angre",
+       "editundo": "fjern endringa",
        "diff-empty": "(Ingen skilnad)",
        "diff-multi-sameuser": "({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Éin mellomliggjande versjon|$1 mellomliggjande versjonar}} av {{PLURAL:$2|éin annan brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})",
        "restoreprefs": "Hent attende alle standardinnstillingane (i alle bolkane)",
        "prefs-editing": "Endring",
        "searchresultshead": "Søk",
-       "stub-threshold": "Grense (i byte) for at frø/spirer skal formaterast <a href=\"#\" class=\"stub\">slik</a>:",
+       "stub-threshold": "Grense for spireformatering ($1):",
        "stub-threshold-disabled": "Deaktivert",
        "recentchangesdays": "Tal på dagar som viser på siste endringar:",
        "recentchangesdays-max": "(høgst $1 {{PLURAL:$1|dag|dagar}})",
        "listfiles-delete": "slett",
        "listfiles-summary": "Spesialsida viser alle opplasta filer.\nNår ho er filtrert etter brukar, vert berre filene der brukaren lasta opp den siste versjonen viste.",
        "listfiles_search_for": "Søk etter filnamn:",
+       "listfiles-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "imgfile": "fil",
        "listfiles": "Filliste",
        "listfiles_thumb": "Miniatyrbilete",
        "mywatchlist": "Overvakingsliste",
        "watchlistfor2": "For $1 $2",
        "nowatchlist": "Du har ikkje noko i overvakingslista di.",
-       "watchlistanontext": "Du lyt $1 for å vise eller endre sider på overvakingslista di.",
+       "watchlistanontext": "Logg inn for å vise eller endre sider på overvakingslista di.",
        "watchnologin": "Ikkje innlogga",
        "addwatch": "↓Legg til i overvakingslista",
        "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførte der.",
        "modifiedarticleprotection": "endra nivået på vernet av «[[$1]]»",
        "unprotectedarticle": "fjerna vern av «[[$1]]»",
        "movedarticleprotection": "flytta verneinnstillingar frå «[[$2]]» til «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Fjerna}} vern av «[[$1]]»",
        "protect-title": "Vernar «$1»",
        "protect-title-notallowed": "Sjå vernenivået til «$1»",
        "prot_1movedto2": "«[[$1]]» flytt til «[[$2]]»",
        "mycontris": "Bidrag",
        "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "nocontribs": "Det vart ikkje funne nokon endringar gjorde av denne brukaren.",
        "uctop": "(gjeldande)",
        "month": "Månad:",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Vel ein",
        "logentry-delete-delete": "$1 {{GENDER:$2|sletta}} sida $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|sletta}} omdirigeringa $3 gjennom overskriving",
        "logentry-delete-restore": "$1 {{GENDER:$2|attoppretta}} sida $3",
        "logentry-delete-event": "$1 {{GENDER:$2|endra}} synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endra}} synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4",
        "logentry-newusers-create2": "Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1",
        "logentry-newusers-byemail": "Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1 og passord vart sendt med e-post",
        "logentry-newusers-autocreate": "Brukarkontoen $1 vart {{GENDER:$2|oppretta}} av seg sjølv",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|fjerna}} vern av $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|verna}} $3 $4",
        "logentry-rights-rights": "$1 {{GENDER:$2|endra}} gruppemedlemskap for $3 frå $4 til $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endra}} gruppemedlemskap for $3",
        "limitreport-cputime": "CPU-tidsbruk",
        "limitreport-cputime-value": "{{PLURAL:$1|eitt sekund|$1 sekund}}",
        "limitreport-walltime-value": "{{PLURAL:$1|eitt sekund|$1 sekund}}",
-       "limitreport-ppvisitednodes": "Tal på knutepunktsvitjingar av førhandsamar",
+       "limitreport-ppvisitednodes": "Nodar vitja av preprosessor",
+       "limitreport-ppgeneratednodes": "Nodar laga av preprosessor",
+       "limitreport-postexpandincludesize": "Inkluderingsstorleik etter utviding",
        "limitreport-postexpandincludesize-value": "$1/$2 byte",
        "limitreport-templateargumentsize": "Storleik på malargument",
        "limitreport-templateargumentsize-value": "$1/$2 byte",
        "mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "randomrootpage": "Tilfeldig rotsida",
+       "authmanager-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "userjsispublic": "Merk: JavaScript-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar.",
        "usercssispublic": "Merk: CSS-undersider bør ikkje innehalda konfidensielle data sidan dei er synlege for andre brukarar."
 }
index 30bcfde..1c27d45 100644 (file)
@@ -17,7 +17,8 @@
                        "Matma Rex",
                        "Xð",
                        "Nicolas Eynaud",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Vriullop"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
@@ -37,7 +38,7 @@
        "tog-watchdeletion": "Apondre las paginas e los fichièrs que suprimissi de ma lista de seguiment",
        "tog-watchuploads": "Apondre los novèls fichièrs qu’impòrti a ma lista de seguiment",
        "tog-watchrollback": "Apondre a ma lista de seguiment las paginas sus las qualas ai efectuat una revocacion",
-       "tog-minordefault": "Considerar mas modificacions coma menoras per defaut",
+       "tog-minordefault": "Considerar totas las modificacions coma menoras per defaut",
        "tog-previewontop": "Far veire la previsualizacion al dessús de la zòna de modificacion",
        "tog-previewonfirst": "Far veire la previsualizacion al moment de la primièra edicion",
        "tog-enotifwatchlistpages": "M’avertir per corrièr electronic quand una pagina o un fichièr de ma lista de seguiment es modificat",
        "october": "d'octobre",
        "november": "de novembre",
        "december": "de decembre",
-       "january-gen": "Genièr",
-       "february-gen": "Febrièr",
-       "march-gen": "Març",
+       "january-gen": "de genièr",
+       "february-gen": "de febrièr",
+       "march-gen": "de març",
        "april-gen": "Abril",
-       "may-gen": "Mai",
-       "june-gen": "Junh",
-       "july-gen": "Julhet",
+       "may-gen": "de mai",
+       "june-gen": "de junh",
+       "july-gen": "de julhet",
        "august-gen": "d'agost",
-       "september-gen": "Setembre",
+       "september-gen": "de setembre",
        "october-gen": "Octobre",
-       "november-gen": "Novembre",
-       "december-gen": "Decembre",
+       "november-gen": "de novembre",
+       "december-gen": "de decembre",
        "jan": "de gen",
        "feb": "de feb",
        "mar": "de març",
        "oct": "d'oct",
        "nov": "de nov",
        "dec": "de dec",
-       "january-date": "$1 de genièr",
-       "february-date": "$1 de febrièr",
-       "march-date": "$1 de març",
+       "january-date": "{{PLURAL:$1|1=1èr|$1}} de genièr",
+       "february-date": "{{PLURAL:$1|1=1èr|$1}} de febrièr",
+       "march-date": "{{PLURAL:$1|1=1èr|$1}} de març",
        "april-date": "$1 d'abril",
        "may-date": "$1 de mai",
        "june-date": "$1 de junh",
        "september-date": "$1 de setembre",
        "october-date": "$1 d'octobre",
        "november-date": "$1 de novembre",
-       "december-date": "$1 de decembre",
+       "december-date": "{{PLURAL:$1|1=1èr|$1}} de decembre",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
        "listingcontinuesabbrev": "(seguida)",
        "index-category": "Paginas indexadas",
        "noindex-category": "Paginas pas indexadas",
-       "broken-file-category": "Paginas amb ligams copats",
+       "broken-file-category": "Paginas amb ligams de fichièrs copats",
        "about": "A prepaus",
        "article": "Article",
        "newwindow": "(dobrís una fenèstra novèla)",
        "edit": "Modificar",
        "edit-local": "Modificar la descripcion locala",
        "create": "Crear",
-       "create-local": "apondre una descripcion locala",
+       "create-local": "Apondre una descripcion locala",
        "editthispage": "Modificar aquesta pagina",
        "create-this-page": "Crear aquesta pagina",
        "delete": "Suprimir",
        "currentevents-url": "Project:Actualitats",
        "disclaimers": "Avertiments",
        "disclaimerpage": "Project:Avertiments generals",
-       "edithelp": "Ajuda",
+       "edithelp": "Ajuda per l'edicion",
        "helppage-top-gethelp": "Ajuda",
        "mainpage": "Acuèlh",
        "mainpage-description": "Acuèlh",
        "internalerror_info": "Error intèrna: $1",
        "internalerror-fatal-exception": "Error fatala de tipe \"$1\"",
        "filecopyerror": "Impossible de copiar lo fichièr « $1 » cap a « $2 ».",
-       "filerenameerror": "Impossible de tornar nomenar lo fichièr « $1 » en « $2 ».",
+       "filerenameerror": "Impossible de renomenar lo fichièr « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de suprimir lo fichièr « $1 ».",
        "directorycreateerror": "Impossible de crear lo dorsièr « $1 ».",
        "directoryreadonlyerror": "Lo repertòri « $1 » es en lectura sola.",
        "no-null-revision": "Impossible de crear una novèla revision voida per la pagina « $1 »",
        "badtitle": "Títol marrit",
        "badtitletext": "Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.",
-       "title-invalid-talk-namespace": "La pagina de títol demandada fa referéncia a una pagina de discussion qu'existís pas.",
-       "title-invalid-characters": "La pagina de títol demandada contèn de caractèrs invalides : $1",
+       "title-invalid-talk-namespace": "Lo títol de la pagina demandada fa referéncia a una pagina de discussion que pòt pas existir.",
+       "title-invalid-characters": "Lo títol  de la pagina demandada conten de caractèrs invalids : « $1 ».",
        "perfcached": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "perfcachedts": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "querypage-no-updates": "Las mesas a jorn per aquesta pagina son actualamnt desactivadas. Las donadas çaijós son pas mesas a jorn.",
        "viewyourtext": "Podètz veire e copiar lo contengut de <strong>vòstras modificacions</strong> a aquesta pagina.",
        "protectedinterface": "Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.\nPer apondre o modificar de traduccions sus totes los wikis, utilizatz [https://translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.",
        "editinginterface": "<strong>Atencion :<strong> sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial.\nLos cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki.",
-       "cascadeprotected": "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :\n$2",
+       "cascadeprotected": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :\n$2",
        "namespaceprotected": "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
        "customcssprotected": "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
        "customjsprotected": "Avètz pas la permission d'editar aquesta pagina JavaScript perque conten de preferéncias d’autres utilizaires.",
        "myprivateinfoprotected": "Avètz pas los dreits per modificar vòstras informacions personalas.",
        "mypreferencesprotected": "Avètz pas los dreits per modificar vòstras preferéncias.",
        "ns-specialprotected": "Las paginas dins l’espaci de noms « {{ns:special}} » pòdon pas èsser modificadas",
-       "titleprotected": "Aqueste títol es estat protegit a la creacion per [[User:$1|$1]].\nLo motiu avançat es <em>$2</em>.",
+       "titleprotected": "Aqueste títol es estat protegit contra tota creacion per [[User:$1|$1]].\nLo motiu avançat es <em>$2</em>.",
        "filereadonlyerror": "Impossible de modificar lo fichièr « $1 » perque lo repertòri de fichièrs « $2 » es en lectura sola.\n\nL'administrator del sistèma que l'a verrolhat a provesit aqueste motiu : « $3 ».",
        "invalidtitle-knownnamespace": "Títol invalid amb l'espaci de noms « $2 » e l'intitulat « $3 »",
        "invalidtitle-unknownnamespace": "Títol invalid amb lo numèro d'espaci de noms $1 e l'intitulat « $2 » desconeguts",
        "createaccountreason": "Motiu :",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Perqué creatz un autre compte",
+       "createacct-reason-help": "Messatge afichat dins lo jornal de creacion de compte",
        "createacct-submit": "Creatz vòstre compte",
        "createacct-another-submit": "Crear un compte",
        "createacct-continue-submit": "Contunhar la creacion de compte",
        "nocookiesnew": "Lo compte d'utilizaire es estat creat, mas sètz pas connectat. {{SITENAME}} utiliza de cookies per la connexion mas los avètz desactivats. Activatz-los e reconnectatz-vos amb lo meteis nom e lo meteis senhal.",
        "nocookieslogin": "{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.",
        "nocookiesfornew": "Lo compte d'utilizaire es pas estat creat, perque avèm pas pogut identificar son origina.\nVerificatz qu'avètz activat los cookies, recargatz la pagina e tornatz ensajar.",
+       "createacct-loginerror": "Lo compte es estat creat corrèctament mas vos podètz pas connectar automaticament. [[Special:UserLogin|Connectatz-vos manualament]].",
        "noname": "Avètz pas picat de nom d'utilizaire valid.",
        "loginsuccesstitle": "Connectat",
-       "loginsuccess": "Sètz actualament connectat(ada) sus {{SITENAME}} en tant que « $1 ».",
+       "loginsuccess": "<strong>Sètz actualament connect{{GENDER:$1||at|ada}} a {{SITENAME}} en tant que « $1 ».</strong>",
        "nosuchuser": "L'utilizaire « $1 » existís pas.\nLo nom d'utilizaire es sensible a la cassa.\nVerificatz vòstra ortografia, o [[Special:CreateAccount|creatz-vos un compte novèl]].",
        "nosuchusershort": "I a pas de contributor amb lo nom « $1 ». Verificatz l’ortografia.",
        "nouserspecified": "Vos cal especificar vòstre nom d'utilizaire.",
        "noemail": "Cap d'adreça electronica es pas estada enregistrada per l'utilizaire « $1 ».",
        "noemailcreate": "Vos cal provesir una adreça de corrièl valida",
        "passwordsent": "Un senhal novèl es estat mandat a l'adreça electronica de l'utilizaire « $1 ».\nIdentificatz-vos tre que l'aurètz recebut.",
-       "blocked-mailpassword": "Vòstra adreça IP es blocada en edicion, la foncion de rapèl del senhal es doncas desactivada per evitar los abuses.",
+       "blocked-mailpassword": "Vòstra adreça IP es blocada en edicion. Per evitar los abuses, es pas autorizat d'utilizar la recuperacion de senhal a partir d'aquesta adreça IP.",
        "eauthentsent": "Un corrièr de confirmacion es estat mandat a l’adreça indicada.\nAbans qu’un autre corrièr sià mandat a aqueste compte, vos caldrà seguir las instruccions donadas dins lo messatge per confirmar que lo compte es plan vòstre.",
        "throttled-mailpassword": "Un corrièr electronic de reïnicializacion de vòstre senhal es ja estat mandat durant {{PLURAL:$1|la darrièra ora|las $1 darrièras oras}}. Per evitar los abuses, un sol corrièr de reïnicializacion de vòstre senhal serà pas mandat per {{PLURAL:$1|ora|interval de $1 oras}}.",
        "mailerror": "Error en mandant lo corrièr electronic : $1",
-       "acct_creation_throttle_hit": "De visitors d'aqueste wiki qu'utilizan vòstra adreça IP an creat $1 {{PLURAL:$1|compte|comptes}} lo jorn darrièr, aquò es lo limit maximum autorizat pendent aqueste periòde.\nAtal los visitors qu'utilizan aquesta adreça IP pòdon pas crear mai de compte novèl pel moment.",
+       "acct_creation_throttle_hit": "Los visitors d'aqueste wiki qu'utilizan vòstra adreça IP an creat {{PLURAL:$1|compte|comptes}} durant las darrièras $2, aquò es lo limit maximum autorizat pendent aqueste periòde.\nEn consequéncia, la creacion de compte pels visitors qu'utilizan aquesta adreça IP es temporàriament suspenduda.",
        "emailauthenticated": "Vòstra adreça de corrièr electronic es estada confirmada lo $2 a $3.",
        "emailnotauthenticated": "Vòstra adreça de corrièr electronic es pas encara confirmada. Cap de corrièr serà pas mandat per caduna de las foncions seguentas.",
        "noemailprefs": "Cap d'adreça electronica es pas estada indicada, las foncions seguentas seràn pas disponiblas.",
        "changepassword-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
        "botpasswords": "Senhals de robòts",
        "botpasswords-disabled": "Los senhals robòts son desactivats.",
-       "botpasswords-no-central-id": "Per intrar lo senhau d'un bot, devètz èsser connectat amb un còmpte globau.",
+       "botpasswords-no-central-id": "Per utilizar los senhals de robòts, vos cal èsser connectat a un compte centralizat.",
        "botpasswords-existing": "Senhals de robòts existents",
-       "botpasswords-createnew": "Crear un novèu senhau de bot",
-       "botpasswords-editexisting": "Editar un senhau de bot existent",
+       "botpasswords-createnew": "Crear un novèl senhal de robòts",
+       "botpasswords-editexisting": "Modificar un senhal de robòts existent",
        "botpasswords-label-appid": "Nom del robòt :",
        "botpasswords-label-create": "Crear",
        "botpasswords-label-update": "Metre a jorn",
        "botpasswords-label-grants": "Dreits aplicables :",
        "botpasswords-label-grants-column": "Acordat",
        "botpasswords-bad-appid": "Lo nom del robòt «$1» es pas valid.",
-       "botpasswords-created-title": "Senhau de bot creat",
-       "botpasswords-created-body": "Lo senhau dau bot per lo bot $1 de l'utilizaire $2 es estat creat",
-       "botpasswords-updated-title": "Senhau dau bot més a jorn",
-       "botpasswords-updated-body": "Lo senhau dau bot $1 de l'utilizaire $2 es estat més a jorn",
-       "botpasswords-deleted-title": "Senhau dau bot escafat",
-       "botpasswords-deleted-body": "Lo senhay dau bot $1 de l'utilizaire $2 es estat escafat",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible",
+       "botpasswords-insert-failed": "Fracàs de l’apondon del nom de robòt « $1 ». Es ja estat apondut ?",
+       "botpasswords-created-title": "Senhal de robòts creat",
+       "botpasswords-created-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat creat.",
+       "botpasswords-updated-title": "Senhal de robòts mes a jorn",
+       "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat mes a jorn.",
+       "botpasswords-deleted-title": "Senhal de robòts suprimit",
+       "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat suprimit.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible.",
        "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
-       "resetpass_forbidden-reason": "Lei senhaus pòdon pas èsser cambiats : $1",
+       "resetpass_forbidden-reason": "Los senhaus pòdon pas èsser cambiats : $1",
        "resetpass-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "resetpass-submit-loggedin": "Modificar lo senhal",
        "resetpass-submit-cancel": "Anullar",
        "passwordreset-emailtext-ip": "Qualqu'un (probablament vos, dempuèi l'adreça IP $1) a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que volètz pas mai lo modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailtext-user": "L'utilizaire $1 sus {{SITENAME}} a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que lo volètz pas mai modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailelement": "Utilizaire: \n$1\n\nSenhal temporari: \n$2",
-       "passwordreset-emailsentemail": "Se aquela adreiça de corrièr electrnic es associat ambé vòstre compte, un corrièr electronic de reïnicializacion de senhal es estat mandat.",
-       "passwordreset-emailsentusername": "Se una adreiça de corrier electronic es associada amb aqueu còmpte d'utilizaire, un senhau de reïnicializacion serà mandat.",
+       "passwordreset-emailsentemail": "Se aquesta adreça de corrièl es associada a vòstre compte, alara un corrièl de reïnicializacion de senhal serà mandat.",
+       "passwordreset-emailsentusername": "Se i a una adreça de corrièr electronic associada a aqueste nom d’utilizaire, alara un corrièl de reïnicializacion senhal serà mandat.",
        "passwordreset-nosuchcaller": "L’apelant existís pas : $1",
-       "passwordreset-invalidemail": "Adreiça electronica invalida",
+       "passwordreset-invalidemail": "Adreça de corrièr electronic invalida",
        "changeemail": "Cambiar o suprimir l'adreça electronica",
-       "changeemail-header": "Cambiar l'adreça electronica del compte",
+       "changeemail-header": "Completatz aqueste formulari per modificar vòstra adreça de corrièl. Se volètz suprimir l’associacion d’una adreça de corrièl amb vòstre compte, daissatz la novèla adreça de corrièl voida al moment de la somission del formulari.",
        "changeemail-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "changeemail-oldemail": "Adreça electronica actuala:",
        "changeemail-newemail": "Novela adreça electronica:",
        "changeemail-none": "(pas cap)",
        "changeemail-password": "Vòstre senhal sus {{SITENAME}} :",
-       "changeemail-submit": "Cambiar l'adreça electronica:",
+       "changeemail-submit": "Cambiar l'adreça electronica :",
        "changeemail-throttled": "Avètz fait tròp de temptativas de connexion.\nEsperatz $1 abans d’ensajar tornarmai.",
        "resettokens": "Reïnicializar los getons",
        "resettokens-text": "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.\n\nLo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
        "accmailtext": "Un senhal generat aleatòriament per [[User talk:$1|$1]] es estat mandat a $2.\nLo senhal per aqueste compte novèl pòt èsser cambiat sus la pagina ''[[Special:ChangePassword|Cambiament de senhal]]'' aprèp connexion.",
        "newarticle": "(Novèl)",
        "newarticletext": "Avètz seguit un ligam cap a una pagina qu’existís pas encara o qu'es estada [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} escafada].\nPer crear aquesta pagina, picatz vòstre tèxte dins la bóstia çaijós (podètz consultar [$1 la pagina d’ajuda] per mai d’entresenhas).\nSe sètz arribat(ada) aicí per error, clicatz sul boton '''retorn''' de vòstre navigador.",
-       "anontalkpagetext": "---- ''Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas.\nPer aquesta rason, devèm utilizar son adreça IP per l'identificar. Una adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire. Se sètz un utilizaire anonim e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.''",
+       "anontalkpagetext": "----\n<em>Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas<em>.\nPer aquesta rason, nos cal utilizar son adreça IP per l'identificar.\nUna adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire.\nSe sètz un{{GENDER:||a|}} utilizair{{GENDER:|e|a|e}} anonim{{GENDER:||a|}} e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.",
        "noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
        "noarticletext-nopermission": "Actualament i a pas cap de tèxte dins aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|far una recèrca sul títol de la pagina]] dins las autras paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins los jornals associats]</span>.",
        "missing-revision": "La revision n° $1 de la pagina intitulada « {{FULLPAGENAME}} » existís pas.\n\nAquò se produtz en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.\nPodètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "userpage-userdoesnotexist": "Lo compte d'utilizaire « <nowiki>$1</nowiki> » es pas enregistrat. Indicatz se volètz crear o editar aquesta pagina.",
        "userpage-userdoesnotexist-view": "Lo compte d'utilizaire « $1 » es pas enregistrat.",
        "blocked-notice-logextract": "Aqueste utilizaire es actualament blocat.\nLa darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
-       "clearyourcache": "'''Nòta :''' Aprèp aver enregistrat vòstras modificacions, es possible que vos calga forçar lo recargament complet de l'escondedor de vòstre navigador per veire los cambiaments : \n*'''Firefox / Safari :''' mantenètz la tòca ''Majuscula'' (''Shift'') en clicant lo boton ''Actualizar'' (''Reload,'') o quichatz sus ''Ctrl-F5'' o ''Ctrl-R''  (''⌘-R'' sus un Mac)\n* '''Google Chrome:''' Quichatz sus ''Ctrl-Shift-R'' (''⌘-Shift-R'' sus un Mac) \n* '''Internet Explorer:''' Mantenètz la tòca ''Ctrl'' en clicant sul boton ''Actualizar'', o quichatz ''Ctrl-F5'' \n* '''Opera:''' Voidatz l'escondedor dins ''Aisinas → Preferéncias''",
+       "clearyourcache": "<strong>Nòta</strong>: Aprèp aver enregistrat vòstras modificacions, es possible que vos calga forçar lo recargament complet de l'escondedor de vòstre navigador per veire los cambiaments : \n* <strong>Firefox / Safari :</strong> mantenètz la tòca <em>Maj</em> (<em>Shift</em>) en clicant lo boton <em>Actualizar</em> o quichatz sus <em>Ctrl-F5</em> o <em>Ctrl-R</em>  (<em>⌘-R</em> sus un Mac)\n* <strong>Google Chrome :</strong> Quichatz sus <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> sus un Mac) \n* <strong>Internet Explorer :</strong> Mantenètz la tòca <em>Ctrl</em> en clicant sul boton <em>Actualizar</em>, o quichatz <em>Ctrl-F5</em> \n* <strong>Opera :</strong> anatz dins <em>Menú → Settings</em> (<em>Opera → Preferéncias</em> sus un Mac) e puèi a <em>Confidencialitat & seguretat → Escafar las donadas d’exploracion → Imatges e fichièrs en cache</em>.",
        "usercssyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
        "userjsyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
        "usercsspreview": "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''\n'''Es pas estada encara enregistrada !'''",
        "permissionserrorstext": "Avètz pas la permission d’efectuar l’operacion demandada per {{PLURAL:$1|la rason seguenta|las rasons seguentas}} :",
        "permissionserrorstext-withaction": "Sètz pas autorizat(ada) a $2, per {{PLURAL:$1|la rason seguenta|las rasons seguentas}} :",
        "recreate-moveddeleted-warn": "'''Atencion : sètz a tornar crear una pagina qu'es estada suprimida precedentament.'''\n\nDemandatz-vos s'es vertadièrament apropriat de contunhar de l’editar.\nL’istoric de las supressions e dels cambiaments de nom es afichat çaijós :",
-       "moveddeleted-notice": "Aquesta pagina es estat suprimida.\nL'istoric de las supressions e dels cambiaments de nom es afichat çaijós coma referéncia.",
+       "moveddeleted-notice": "Aquesta pagina es estada suprimida.\nL'istoric de las supressions e dels cambiaments de nom es afichat çaijós coma referéncia.",
        "log-fulllog": "Veire lo jornal complet",
        "edit-hook-aborted": "Modificacion fracassada per croquet.\nCap d'explicacion pas balhada.",
        "edit-gone-missing": "A pas pogut metre a jorn la pagina.\nSembla que siá estada suprimida.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objècte void",
        "content-json-empty-array": "Tablèu void",
+       "duplicate-args-category": "Paginas utilizant d'arguments duplicats dins los apèls de modèl",
        "expensive-parserfunction-warning": "Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.\n\nI deurià aver mens de {{PLURAL:$2|ampèl|ampèls}}, e actualament {{PLURAL:$1|i a $1 ampèl|i a $1 ampèls}}..",
        "expensive-parserfunction-category": "Paginas amb tròp d’apèls dispendioses de foncions parsaires",
        "post-expand-template-inclusion-warning": "Atencion : Aquesta pagina conten tròp d'inclusions de modèls.\nD'unas inclusions seràn pas efectuadas.",
        "undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
        "undo-norev": "La modificacion a pas pogut èsser desfaita perque siá es inexistenta siá es estada suprimida.",
        "undo-nochange": "Sembla que la modificacion es ja estada anullada.",
-       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "undo-summary-username-hidden": "Anullar la revision $1 per un utilizaire amagat",
        "cantcreateaccount-text": "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].\n\nLa rason balhada per $3 èra ''$2''.",
        "cantcreateaccount-range-text": "La creacion de compte dempuèi las adreças IP dins la plaja <strong>$1</strong>, que compren vòstra agreça IP (<strong>$4</strong>) son estadas blocadas per [[User:$3|$3]].\n\nLo motiu provesit per $3 es <em>$2</em>",
        "search-interwiki-caption": "Projèctes fraires",
        "search-interwiki-default": "Resultats de $1 :",
        "search-interwiki-more": "(mai)",
+       "search-interwiki-more-results": "mai de resultats",
        "search-relatedarticle": "Relatat",
        "searchrelated": "relatat",
        "searchall": "Totes",
        "showingresultsinrange": "Afichar çaijós fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} dins la seria #<strong>$2</strong> a #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> demest <strong>$3</strong>|Resultats <strong>$1 a $2</strong> demest <strong>$3</strong>}}",
        "search-nonefound": "I a pas cap de resultat correspondent a la requèsta.",
+       "search-nonefound-thiswiki": "I a pas de resultats que correspondon a la requèsta sus aqueste site.",
        "powersearch-legend": "Recèrca avançada",
        "powersearch-ns": "Recercar dins los espacis de nom :",
        "powersearch-togglelabel": "Marcar :",
        "youremail": "Adreça de corrièr electronic :",
        "username": "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre|Membra}} {{PLURAL:$1|del grop|dels gropes}}:",
+       "group-membership-link-with-expiry": "$1 (fins a $2)",
        "prefs-registration": "Data de creacion del compte :",
        "yourrealname": "Nom vertadièr :",
        "yourlanguage": "Lenga de l'interfàcia :",
        "email": "Corrièr electronic",
        "prefs-help-realname": "Lo nom vertadièr es facultatiu.\nSe l'especificatz, serà utilizat per vos atribuir vòstras contribucions.",
        "prefs-help-email": "L’adreça de corrièr electronic es facultativa mas vos permet de reçaupre lo senhal se lo doblidatz.\nTanben podètz causir de permetre a d’autres de vos contactar per vòstra pagina d’utilizaire o la de discussion sens sofracha de desvelar vòstra idenditat.",
-       "prefs-help-email-others": "Tanben podètz causir de daissar los autres vos contactar sus vòstra pagina de discussion d'utilizaire sens que siá necessari de revelar vòstra identitat.",
+       "prefs-help-email-others": "Tanben podètz causir de daissar los autres vos contactar per corrièl via un ligam sus vòstra pagina de discussion d'utilizaire o pagina d'utilizaire.\nVòstra adreça de corrièr electronic es pas revelada quand los utilizaires vos contactan.",
        "prefs-help-email-required": "Una adreça de corrièr electronic es requesa.",
        "prefs-info": "Informacion de basa",
        "prefs-i18n": "Internationalizacion",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
        "editusergroup": "Cargar de gropes d’utilizaires",
        "editinguser": "Modificacion dels dreits de l’{{GENDER:$1|utilizaire|utilizaira}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificar los gropes de l’utilizaire",
-       "userrights-viewusergroup": "Veire lei grops d'utilizaires",
+       "userrights-editusergroup": "Modificar los gropes de l'utilizai{{GENDER:$1|e|a}}",
+       "userrights-viewusergroup": "Afichar los gropes de l'utilizair{{GENDER:$1|e|a}}",
        "saveusergroups": "Enregistrar los gropes de l’{{GENDER:$1|utilizaire|utilizaira}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicit de :",
-       "userrights-groups-help": "Podètz modificar los gropes alsquals aparten aqueste utilizaire.\n* Una casa marcada significa que l'utilizaire se tròba dins aqueste grop.\n* Una casa pas marcada significa, al contrari, que s’i tròba pas.\n* Una * indica que podretz pas levar aqueste grop un còp que l'auretz apondut e vice-versa.",
+       "userrights-groups-help": "Podètz modificar los gropes als quals aparten {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}.\n* Una casa marcada significa que l'utilizair{{GENDER:$1|e|a}} se tròba dins aqueste grop.\n* Una casa pas marcada significa, al contrari, que s’i tròba pas.\n* Un asterisc * indica que podètz pas levar aqueste grop un còp que l'avètz apondut e vice-versa.\n* Un dièsi (#) indica que podètz que ralongar lo delai d'expiracion del grop e non pas l'acorchir.",
        "userrights-reason": "Motiu :",
        "userrights-no-interwiki": "Sètz pas abilitat per modificar los dreits dels utilizaires sus d'autres wikis.",
        "userrights-nodatabase": "La basa de donadas « $1 » existís pas o es pas en local.",
        "userrights-changeable-col": "Los gropes que podètz cambiar",
        "userrights-unchangeable-col": "Los gropes que podètz pas cambiar",
+       "userrights-expiry-current": "Expira lo $1",
+       "userrights-expiry-none": "Expira pas",
+       "userrights-expiry": "Data d’expiracion :",
+       "userrights-expiry-existing": "Data d'expiracion existenta : $2 à $3",
+       "userrights-expiry-othertime": "Autre temps :",
+       "userrights-expiry-options": "1 jorn:1 day,1 setmana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 an:1 year",
        "userrights-conflict": "Conflicte de modificacion de dreits d'utilizaire ! Relegissètz e confirmatz vòstras modificacions.",
        "group": "Grop :",
        "group-user": "Utilizaires",
        "right-minoredit": "Marcar de cambiaments coma menors",
        "right-move": "Renomenar de paginas",
        "right-move-subpages": "Desplaçar de paginas amb lor sospaginas",
-       "right-move-rootuserpages": "Tornar nomenar las paginas de l’utilizaire de banca.",
+       "right-move-rootuserpages": "Renomenar la pagina principala d’un utilizaire",
        "right-move-categorypages": "Renomenar de paginas de categoria",
        "right-movefile": "Desplaçar los fichièrs",
        "right-suppressredirect": "Crear pas de redireccion dempuèi la pagina anciana en renomenant la pagina",
        "grant-group-file-interaction": "Interagir amb de mèdias",
        "grant-group-watchlist-interaction": "Interagir amb vòstra lista de seguiment",
        "grant-group-email": "Mandar un corrièr electronic",
+       "grant-group-customization": "Personalizacion e preferéncias",
+       "grant-group-administration": "Efectuar d'accions administrativas",
+       "grant-group-private-information": "Accedir a vòstras donadas privadas",
+       "grant-group-other": "Activitats divèrsas",
        "grant-blockusers": "Blocar e desblocar d'utilizaires",
        "grant-createaccount": "Crear de comptes",
        "grant-createeditmovepage": "Crear, modificar e desplaçar de paginas",
-       "grant-editpage": "Editar lei paginas existentas",
-       "grant-editprotected": "Editar lei paginas protegidas",
+       "grant-editmyoptions": "Modificar vòstras preferéncias d'utilizaire",
+       "grant-editpage": "Modificar de paginas existentas",
+       "grant-editprotected": "Modificar de paginas protegidas",
        "grant-patrol": "Verificar las modificacions de paginas",
-       "grant-uploadeditmovefile": "Telecargar, remplaçar e desplaçar de fichiers",
-       "grant-uploadfile": "Telecargar un novèu fichier",
+       "grant-privateinfo": "Accedir a las informacions privadas",
+       "grant-sendemail": "Mandar de corriers electronics als autres utilizaires",
+       "grant-uploadeditmovefile": "Telecargar, remplaçar e renomenar de fichièrs",
+       "grant-uploadfile": "Importar de fichièrs novèls",
        "grant-basic": "Dreits de basa",
-       "grant-viewdeleted": "Veire lei fichiers e lei paginas escafats",
+       "grant-viewdeleted": "Afichar los fichièrs e paginas suprimits",
        "grant-viewmywatchlist": "Afichar vòstra lista de seguiment",
        "newuserlogpage": "Istoric de las creacions de comptes",
        "newuserlogpagetext": "Jornal de las creacions de comptes d'utilizaires.",
        "action-history": "afichar l’istoric d'aquesta pagina",
        "action-minoredit": "marcar aqueste cambiament coma menor",
        "action-move": "renomenar aquesta pagina",
-       "action-move-subpages": "tornar nomenar aquesta pagina e sas sospaginas",
+       "action-move-subpages": "renomenar aquesta pagina e sas sospaginas",
        "action-move-rootuserpages": "renomenar las paginas de l’utilizaire de basa.",
        "action-move-categorypages": "Renomenar de paginas de categoria",
        "action-movefile": "renomenar aqueste fichièr",
        "action-writeapi": "utilizar l‘API d’escritura",
        "action-delete": "suprimir aquesta pagina",
        "action-deleterevision": "suprimir las revisions",
-       "action-deletelogentry": "Escafar lo jornau deis intradas",
+       "action-deletelogentry": "suprimir las entradas del jornal",
        "action-deletedhistory": "veire l’istoric suprimit d'una pagina",
        "action-browsearchive": "recercar de paginas suprimidas",
        "action-undelete": "restablir de paginas",
        "action-userrights-interwiki": "modificar los dreits d’utilizaire e los sus d’autres wikis",
        "action-siteadmin": "verrolhar o desverrolhar la basa de donadas",
        "action-sendemail": "mandar corrièrs electronics",
-       "action-editmyoptions": "Editar vòstrei preferéncias",
+       "action-editmyoptions": "modificar vòstras preferéncias",
        "action-editmywatchlist": "modificar vòstra lista de seguiment",
        "action-viewmywatchlist": "afichar vòstra pròpria lista de seguiment",
        "action-viewmyprivateinfo": "veire vòstras informacions personalas",
        "action-editmyprivateinfo": "modificar vòstras informacions personalas",
-       "action-purge": "Purgar la pagina",
+       "action-purge": "purgar aquesta pagina",
        "nchanges": "$1 {{PLURAL:$1|cambiament|cambiaments}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dempuèi la darrièra visita}}",
        "enhancedrc-history": "istoric",
        "rcfilters-filtergroup-automated": "Contribucions automatizadas",
        "rcfilters-filter-bots-label": "Robòt",
        "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
+       "rcfilters-filter-humans-description": "Modificacions faitas per d'editors umans.",
        "rcfilters-filtergroup-significance": "Significacion",
        "rcfilters-filter-minor-label": "Cambiaments menors",
+       "rcfilters-filter-minor-description": "Modificacions que l'autor a marcadas coma menoras.",
        "rcfilters-filter-major-label": "Modificacions pas menoras",
+       "rcfilters-filter-major-description": "Modificacions pas marcadas coma menoras.",
        "rcfilters-filtergroup-changetype": "Tipe de cambiament",
        "rcfilters-filter-pageedits-label": "Modificacions de pagina",
+       "rcfilters-filter-pageedits-description": "Modificacions del contengut del wiki, de las discussions, de las descripcions de las categorias...",
        "rcfilters-filter-newpages-label": "Creacions de pagina",
+       "rcfilters-filter-newpages-description": "Modificacions a l'origina de paginas novèlas.",
        "rcfilters-filter-categorization-label": "Cambiaments de categoria",
        "rcfilters-filter-logactions-label": "Accions traçadas",
+       "rcfilters-filter-logactions-description": "Accions dels administrators, creacions de comptes, supressions de paginas, telecargaments...",
        "rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "recentchangeslinked-page": "Nom de la pagina :",
        "recentchangeslinked-to": "Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada",
        "recentchanges-page-added-to-category": "[[:$1]] apondut a la categoria",
-       "recentchanges-page-removed-from-category": "[[:$1]] retirat de la categoria",
-       "autochange-username": "Cambiament automatic MediaWiki",
+       "recentchanges-page-removed-from-category": "[[:$1]] suprimit de la categoria",
+       "autochange-username": "Cambiament automatic de MediaWiki",
        "upload": "Importar un fichièr",
        "uploadbtn": "Importar un fichièr",
        "reuploaddesc": "Anullar lo cargament e tornar al formulari.",
        "file-thumbnail-no": "Lo nom del fichièr comença per <strong>$1</strong>.\nEs possible que s’agisca d’una version reducha ''(miniatura)''.\nSe dispausatz del fichièr en resolucion nauta, importatz-lo, si que non cambiatz lo nom del fichièr.",
        "fileexists-forbidden": "Un fichièr amb aqueste nom existís ja e pòt pas èsser espotit.\nSe volètz totjorn importar aquel fichièr, mercé de tornar en arrièr e d'utilizar un nom novèl. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Un fichièr amb lo meteis nom existís ja dins la basa de donadas comuna.\nS'o volètz importar tornamai, tornatz en rèire e importatz-lo jos un autre nom. [[File:$1|thumb|center|$1]]",
-       "fileexists-no-change": "Lo telecargament es un doblon de <strong>[[:$1]]</strong>.",
-       "fileexists-duplicate-version": "Lo telecargament es un doblon de {{PLURAL:$2|an older version|older versions}} de <strong>[[:$1]]</strong>.",
+       "fileexists-no-change": "Lo fichièr telecargat es una còpia exacta de la version actuala de <strong>[[:$1]]</strong>",
+       "fileexists-duplicate-version": "Lo fichièr mandat es una còpia exacta {{PLURAL:$2|d'una version precedenta|de versions precedentas}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Aqueste fichièr es un doble {{PLURAL:$1|del fichièr seguent|dels fichièrs seguents}} :",
        "file-deleted-duplicate": "Un fichièr identic a aqueste ([[:$1]]) ja es estat suprimit. Vos caldriá verificar lo jornal de las supressions d'aqueste fichièr abans de la tornar telecargar.",
        "file-deleted-duplicate-notitle": "Un fichièr identic a aqueste fichièr es ja estat suprimit amai lo títol. \nVos caldriá demandar a qualqu'un la possibilitat de verificar lo jornal d'aqueste fichièr suprimit per tal d'examinar la situacion  abans de l'importar tornarmai.",
        "uploaddisabledtext": "L'impòrt de fichièrs cap al servidor es desactivat.",
        "php-uploaddisabledtext": "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
        "uploadscripted": "Aqueste fichièr conten de còdi HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
-       "uploadscriptednamespace": "Aqueste fichièr SVG conten un espaci de noms '$1' pas autorizat.",
+       "uploadscriptednamespace": "Aqueste fichièr SVG conten un espaci de noms '<nowiki>$1</nowiki>' pas autorizat.",
        "uploadinvalidxml": "Lo XML dins lo fichièr importat a pas pogut èsser analisat.",
        "uploadvirus": "Aqueste fichièr conten un virús ! Per mai de detalhs, consultatz : $1",
        "uploadjava": "Es un fichièr ZIP que conten un fichièr Java .class.\nLo telecargament de fichièrs Java es pas autorizat, perque pòdon contornar de restriccions de seguretat.",
        "upload-form-label-own-work": "Soi l'autor d'aquesta òbra",
        "upload-form-label-infoform-categories": "Categorias",
        "upload-form-label-infoform-date": "Data",
-       "upload-form-label-own-work-message-generic-foreign": "Compreni que siáu a telecargar aquest fichier vèrs un estocatge partejat. Confiermi que siáu a lo faire segon lei reglas d'utilizacion e de licéncia en vigor.",
-       "upload-form-label-not-own-work-message-generic-foreign": "Se siatz pas capable de telecargar aqust fichir segon lei reglas d'aquest estocatge partejat, mercé de sarrar aquest boita de dialògue a d'assaiar un autre metòde.",
+       "upload-form-label-not-own-work-local-generic-local": "Tanben podètz ensajar [[Special:Upload|la pagina de telecargament per defaut]].",
+       "upload-form-label-own-work-message-generic-foreign": "Compreni que mandi aqueste fichièr cap a un depaus partejat. Confirmi qu'agissi en acòrd amb las condicions d'utilizacion e las règlas relativas a las licéncias en vigor.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Se sètz pas en capacitat de mandar aqueste fichièr segon las règlas d'aqueste depaus partejat, mercé de tampar aquesta bóstia de dialòg a d'ensajar un autre metòde.",
        "backend-fail-stream": "Impossible de legir lo fichièr $1.",
        "backend-fail-backup": "Impossible de salvar lo fichièr $1.",
        "backend-fail-notexists": "Lo fichièr $1 existís pas.",
        "zip-bad": "Lo fichièr es un archiu ZIP corromput o illegible.\nPòt pas èsser verificat corrèctament per la seguretat.",
        "zip-unsupported": "Lo fichièr es un archiu ZIP qu'utiliza de caracteristicas pas suportadas per MediaWiki. \nSa seguretat pòt pas èsser verificada corrèctament.",
        "uploadstash": "Cache d'impòrt",
-       "uploadstash-summary": "La pagina dona accès ai fichiers que son telecargats o en cors de telecargament, mai pas encara publicats sus lo wiki. Aquelei fichiers son unicament visibles per l'utilizaire a l'origina dau telecargament.",
+       "uploadstash-summary": "Aquesta pagina dona accès als fichièrs que son importats (o en cors d'importacion), mas son pas encara publicats dins lo wiki. Aqueles fichièrs son pas encara visibles, levat per l'utilizaire a l'origina de l'importacion.",
        "uploadstash-clear": "Escafar los fichièrs en cache",
        "uploadstash-nofiles": "Avètz pas de fichièrs en cache d'impòrt.",
        "uploadstash-errclear": "La supression dels fichièrs a fracassat.",
        "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
-       "listfiles-userdoesnotexist": "L'utilizaire \"$1\" es pas enregistrat.",
+       "listfiles-userdoesnotexist": "Lo compte d'utilizaire « $1 » es pas enregistrat.",
        "imgfile": "fichièr",
        "listfiles": "Lista dels imatges",
        "listfiles_thumb": "Apercebut",
        "uploadnewversion-linktext": "Importar una version novèla d'aqueste fichièr",
        "shared-repo-from": "de $1",
        "shared-repo": "un depaus partejat",
+       "shared-repo-name-wikimediacommons": "Wikimèdia Commons",
        "upload-disallowed-here": "Podètz pas remplaçar aqueste fichièr.",
        "filerevert": "Revocar $1",
        "filerevert-legend": "Revocar lo fichièr",
        "filerevert-submit": "Revocar",
        "filerevert-success": "'''[[Media:$1|$1]]''' es estat revocat fins a [$4 la version del $2 a $3].",
        "filerevert-badversion": "I a pas de version mai anciana del fichièr amb lo Timestamp donat.",
-       "filerevert-identical": "La version actuala d'aqueu fichier es ja identica an aquela qu'es seleccionada.",
+       "filerevert-identical": "La version actuala del fichièr es ja identica a aquela qu'es seleccionada.",
        "filedelete": "Suprimir $1",
        "filedelete-legend": "Suprimir lo fichièr",
        "filedelete-intro": "Sètz a suprimir '''[[Media:$1|$1]]''' amb tot son istoric.",
        "withoutinterwiki-summary": "Las paginas seguentas an pas de ligams cap a las versions dins d'autras lengas.",
        "withoutinterwiki-legend": "Prefix",
        "withoutinterwiki-submit": "Afichar",
-       "fewestrevisions": "Articles mens modificats",
+       "fewestrevisions": "Paginas las mens modificadas",
        "nbytes": "$1 {{PLURAL:$1|octet|octets}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
        "unusedimages": "Imatges orfanèls",
        "wantedcategories": "Categorias mai demandadas",
        "wantedpages": "Paginas mai demandadas",
-       "wantedpages-summary": "Aquesta pagina compta totes los ligams, encluses los inserits via de modèls de navigacion. Per una lista dels articles mai demandats, vejatz articles mai demandats, que comptabiliza pas que las referéncias que provenon de l'espaci de nom dels articles. Vejatz tanben lo '''articles mai demandats'''.",
+       "wantedpages-summary": "Lista de las paginas inexistentas qu'an lo mai de ligams cap a elas, en excluent las paginas qu'an pas que de redireccions puntant cap a elas. Per aver una lista de las paginas inexistentas qu'an de redireccions puntant cap a elas, vejatz [[{{#special:BrokenRedirects}}|la lista de las redireccions copadas]].",
        "wantedpages-badtitle": "Títol invalid dins los resultats : $1",
        "wantedfiles": "Fichièrs desirats",
        "wantedfiletext-cat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fait, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>. Amai, las paginas qu'intègran de fichièrs qu'existisson pas son repertoriadas dins [[:$1]].",
        "mostlinked": "Paginas mai ligadas",
        "mostlinkedcategories": "Categorias mai utilizadas",
        "mostlinkedtemplates": "Paginas las mai inclusas",
-       "mostcategories": "Articles utilizant mai de categorias",
+       "mostcategories": "Articles utilizant lo mai de categorias",
        "mostimages": "Fichièrs mai utilizats",
        "mostinterwikis": "Paginas amb lo mai d'interwikis",
-       "mostrevisions": "Articles mai modificats",
+       "mostrevisions": "Paginas las mai modificadas",
        "prefixindex": "Totas las paginas que començan per…",
        "prefixindex-namespace": "Totas las paginas amb prefix (espaci de noms $1)",
        "prefixindex-submit": "Afichar",
        "protectedpages-unknown-timestamp": "Desconegut",
        "protectedpages-unknown-performer": "Utilizaire desconegut",
        "protectedtitles": "Títols protegits",
-       "protectedtitles-summary": "Aquò es una lista dei títols de pagina que son a l'ora d'ara protegits còntra la creacion. Per una lista dei paginas existentas que son protegidas, veire [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "Aquò es una lista dels títols de pagina que son a l'ora d'ara protegits contra la creacion. Per una lista de las paginas existentas que son protegidas, veire [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Cap de títol es pas actualament protegit amb aquestes paramètres.",
        "protectedtitles-submit": "Afichar los títols",
        "listusers": "Lista dels participants",
        "apisandbox-submit": "Far la demanda",
        "apisandbox-reset": "Escafar",
        "apisandbox-retry": "Ensajar tornarmai",
+       "apisandbox-load-error": "Una error s'es produita pendent lo cargament de las informacions del modul \"$1\" de l'API : $2",
+       "apisandbox-no-parameters": "Aqueste modul API a pas cap de paramètre.",
        "apisandbox-helpurls": "Ligams d'ajuda",
        "apisandbox-examples": "Exemples",
        "apisandbox-dynamic-parameters": "Paramètres suplementaris",
        "apisandbox-dynamic-parameters-add-label": "Apondon del paramètre",
        "apisandbox-dynamic-parameters-add-placeholder": "Nom del paramètre",
+       "apisandbox-dynamic-error-exists": "Existís ja un paramètre nomenat \"$1\"",
        "apisandbox-deprecated-parameters": "Paramètres obsolèts",
-       "apisandbox-submit-invalid-fields-title": "De camps son invalides",
+       "apisandbox-fetch-token": "Auto-emplenatge del geton",
+       "apisandbox-submit-invalid-fields-title": "Certans camps son invalids",
+       "apisandbox-submit-invalid-fields-message": "Corregissètz los camps indicats e ensajatz tornamai.",
        "apisandbox-results": "Resultats",
        "apisandbox-sending-request": "Mandadís de la requèsta a l'API...",
+       "apisandbox-loading-results": "Recepcion dels resultats de l'API...",
+       "apisandbox-request-selectformat-label": "Afichar las donadas de la requèsta coma :",
+       "apisandbox-request-format-url-label": "Cadena de requèsta de l'URL",
        "apisandbox-request-url-label": "Requèsta URL :",
+       "apisandbox-request-json-label": "Demandar de JSON :",
        "apisandbox-request-time": "Durada de la demanda : {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-page": "Los camps d'aquesta pagina son pas valids.",
+       "apisandbox-alert-field": "La valor d'aqueste camp es pas valida.",
        "apisandbox-continue": "Contunhar",
        "apisandbox-continue-clear": "Escafar",
+       "apisandbox-param-limit": "Entrar <kbd>max</kbd> per utilizar lo limit maximal.",
        "apisandbox-multivalue-all-namespaces": "$1 (totes los espacis de noms)",
        "apisandbox-multivalue-all-values": "$1 (totas las valors)",
        "booksources": "Obratges de referéncia",
        "booksources-search": "Recercar",
        "booksources-text": "Vaquí una lista de ligams cap a d’autres sites que vendon de libres nòus e d’ocasion e suls quals trobaretz benlèu d'entresenhas suls obratges que cercatz. {{SITENAME}} es pas ligada a cap d'aquestas societats, a pas l’intencion de ne far la promocion.",
        "booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fait una error al moment de la còpia dempuèi la font.",
+       "magiclink-tracking-rfc": "Paginas utilizant de ligams magics RFC",
+       "magiclink-tracking-pmid": "Paginas utilizant de ligams magics PMID",
+       "magiclink-tracking-isbn": "Paginas utilizant de ligams magics ISBN",
        "specialloguserlabel": "Autor :",
        "speciallogtitlelabel": "Cibla (títol o {{ns:user}}:nom d'utilizaire) :",
        "log": "Jornals",
        "allpagesfrom": "Afichar las paginas a partir de :",
        "allpagesto": "Afichar las paginas fins a :",
        "allarticles": "Totas las paginas",
-       "allinnamespace": "Totas las paginas (espaci de noms $1)",
+       "allinnamespace": "Totas las paginas (dins l'espaci de noms $1)",
        "allpagessubmit": "Validar",
        "allpagesprefix": "Afichar las paginas que començan pel prefix :",
        "allpagesbadtitle": "Lo títol rensenhat per la pagina es incorrècte o possedís un prefix reservat. Conten segurament un o mantun caractèr especial que pòt pas èsser utilizats dins los títols.",
        "activeusers-count": "$1 {{PLURAL:$1|accion|accions}} al moment {{PLURAL:$3|del darrièr jorn|dels $3 darrièrs jorns}}",
        "activeusers-from": "Afichar los utilizaires dempuèi :",
        "activeusers-noresult": "Cap d'utilizaire pas trobat.",
-       "activeusers-submit": "Mostrar leis utilizaires actius",
+       "activeusers-submit": "Afichar los utilizaires actius",
        "listgrouprights": "Dreits dels gropes d'utilizaires",
        "listgrouprights-summary": "Aquesta pagina conten una lista de gropes definits sus aqueste wiki e mai los dreits d'accès qu'i son associats.\nI pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàrias]] a prepaus dels dreits.",
        "listgrouprights-key": "Legenda :\n*<span class=\"listgrouprights-granted\">Dreit autrejat</span>\n*<span class=\"listgrouprights-revoked\">Dreit revocat</span>",
        "trackingcategories-msg": "Categoria de seguiment",
        "trackingcategories-name": "Nom del messatge",
        "trackingcategories-desc": "Critèri d’inclusion de la categoria",
+       "restricted-displaytitle-ignored": "Paginas amb de títols d'afichatge ignorats",
        "trackingcategories-nodesc": "Cap de descripcion pas disponibla.",
        "trackingcategories-disabled": "La categoria es desactivada",
        "mailnologin": "Pas d'adreça",
        "emailusername": "Nom d'utilizaire :",
        "emailusernamesubmit": "Sometre",
        "email-legend": "Mandar un corrièr electronic a un autre utilizaire de {{SITENAME}}",
-       "emailfrom": "Expeditor :",
+       "emailfrom": "De :",
        "emailto": "Destinatari :",
        "emailsubject": "Subjècte :",
        "emailmessage": "Messatge :",
        "emailccsubject": "Còpia de vòstre messatge a $1 : $2",
        "emailsent": "Messatge mandat",
        "emailsenttext": "Vòstre messatge es estat mandat.",
-       "emailuserfooter": "Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « {{int:emailuser}} » sus {{SITENAME}}.",
+       "emailuserfooter": "Aqueste corrièr electronic es {{GENDER:$1|estat mandat}} per « $1 » a « {{GENDER:$2|$2}} » per la foncion « {{int:emailuser}} » sus {{SITENAME}}. Se {{GENDER:$2|respondètz}} a aqueste corrièl, {{GENDER:$2|vòstre}} corrièl serà mandat dirèctament a l’{{GENDER:$1|emeteire inicial}}, en {{GENDER:$1|li}} mencionant {{GENDER:$2|vòstra}} adreça de courrièl .",
        "usermessage-summary": "A daissat un messatge de sistèma.",
        "usermessage-editor": "Messatgièr del sistèma",
        "watchlist": "Lista de seguiment",
        "changecontentmodel-model-label": "Novèl modèl de contengut",
        "changecontentmodel-reason-label": "Motiu :",
        "changecontentmodel-submit": "Modificar",
+       "changecontentmodel-emptymodels-title": "Cap de modèl de contengut pas disponible",
        "logentry-contentmodel-change-revertlink": "restablir",
        "logentry-contentmodel-change-revert": "restablir",
        "protectlogpage": "Istoric de las proteccions",
        "modifiedarticleprotection": "a modificat lo nivèl de proteccion de « [[$1]] »",
        "unprotectedarticle": "a suprimit la proteccion de « [[$1]] »",
        "movedarticleprotection": "a desplaçat los paramètres de proteccion dempuèi « [[$2]] » cap a « [[$1]] »",
+       "protectedarticle-comment": "{{GENDER:$2|A protegit}} « [[$1]] »",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|A cambiat lo nivèl de proteccion}} per « [[$1]] »",
+       "unprotectedarticle-comment": "{{GENDER:$2|A suprimit la proteccion}} de « [[$1]] »",
        "protect-title": "Cambiar lo nivèl de proteccion de « $1 »",
        "protect-title-notallowed": "Veire lo nivèl de proteccion de « $1 »",
        "prot_1movedto2": "a renomenat [[$1]] en [[$2]]",
        "protect-locked-blocked": "Podètz pas modificar los nivèls de proteccion tant que sètz bloca{{GENDER:||t|ada}}.. Vaquí los reglatges actuals de la pagina <strong>$1</strong> :",
        "protect-locked-dblock": "Lo nivèl de proteccion pòt pas èsser modificat perque la basa de donadas es verrolhada.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
        "protect-locked-access": "Avètz pas los dreits necessaris per modificar los nivèls de proteccion de las paginas.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
-       "protect-cascadeon": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}}, amb l’opcion « proteccion en cascada » activada. Podètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
+       "protect-cascadeon": "Aquesta pagina es protegida perque es transclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}}, amb l’opcion « proteccion en cascada » d'activada.\nPodètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
        "protect-default": "Autorizar totes los utilizaires",
        "protect-fallback": "Autorizar unicament los utilizaires amb lo dreit « $1 »",
        "protect-level-autoconfirmed": "Autorizar unicament los utilizaires autoconfirmats",
        "unblock": "Desblocar un utilizaire",
        "blockip": "Blocar l’{{GENDER:$1|utilizaire|utilizaira}}",
        "blockip-legend": "Blocar en escritura",
-       "blockiptext": "Utilizatz lo formulari çaijós per blocar l'accès a las modificacions a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deu pas èsser presa pas que per empachar lo vandalisme e en acòrdi amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).",
+       "blockiptext": "Utilizatz lo formulari çaijós per blocar las temptativas de modificacion a partir d'una adreça IP especifica o d'un nom d'utilizaire.\nUna tala mesura deuriá pas èsser presa pas que per empachar lo vandalisme e en acòrd amb las [[{{MediaWiki:Policy-url}}|règlas intèrnas]].\nDonatz çaijós un motiu precís (per exemple en citant las paginas que son estadas vandalizadas).\nPodètz blocar de plajas d’adreças IP en utilizant la sintaxi [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] ; la mai granda plaja autorizada es /$1 per IP v4 e /$2 per IP v6.",
        "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipbexpiry": "Durada del blocatge :",
        "ipbreason": "Motiu :",
        "databasenotlocked": "La basa de donadas es pas verrolhada.",
        "lockedbyandtime": "(per $1 lo $2 a $3)",
        "move-page": "Renomenar $1",
-       "move-page-legend": "Tornar nomenar una pagina",
-       "movepagetext": "Utilizatz lo formulari çaijós per tornar nomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl. Podètz metre a jorn automaticament las redireccions actualas que puntan cap al títol original. Se causissètz de lo far pas, asseguratz-vos de verificar tota [[Special:DoubleRedirects|redireccion dobla]] o [[Special:BrokenRedirects|redireccion copada]]. Avètz la responsabilitat de vos assegurar que los ligams contunhen de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà '''pas''' renomada s'existís ja una pagina amb lo novèl títol, levat se aquesta darrièra a un istoric de modificacions verge e es una simpla redireccion. Aquò permet de renomenar una pagina cap a sa posicion d'origina se lo desplaçament s'avera erronèu.\n\n'''ATENCION !'''\nAquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament ; asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
-       "movepagetalktext": "La pagina de discussion associada, se presenta, serà automaticament desplaçada amb ''' levat se :'''\n*Desplaçatz una pagina cap a un autre espaci,\n*Una pagina de discussion ja existís amb lo nom novèl, o\n*Avètz deseleccionat lo boton çaijós.\n\nDins aqueste cas, vos caldrà desplaçar o fusionar la pagina manualament se o volètz.",
+       "move-page-legend": "Renomenar una pagina",
+       "movepagetext": "Utilizatz lo formulari çaijós per renomenar una pagina, en desplaçant tot son istoric cap al nom novèl. Lo títol ancian vendrà una pagina de redireccion cap al títol novèl.\nPodètz metre a jorn automaticament las redireccions actualas que puntan cap al títol original.\nSe causissètz de lo far pas, asseguratz-vos de verificar tota [[Special:DoubleRedirects|redireccion dobla]] o [[Special:BrokenRedirects|redireccion copada]]. Avètz la responsabilitat de vos assegurar que los ligams contunhan de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà <strong>pas</strong>  renomada s'existís ja una pagina amb lo novèl títol, levat se aquesta darrièra a un istoric de modificacions verge e es una simpla redireccion. \nAquò significa que podètz renomenar una pagina cap a sa posicion d'origina se vos sètz enganat e que podètz pas espotir una pagina existenta.\n\n<strong>Atencion !</strong>\nAquò pòt provocar un cambiament radical e imprevist per una pagina consultada frequentament ; asseguratz-vos qu'avètz comprés las consequéncias de vòstra accion abans de contunhar.",
+       "movepagetext-noredirectfixer": "Utilizatz lo formulari çaijós per renomenar una pagina, en desplaçant tot son istoric cap al nom novèl.\nL’ancian títol vendrà una pagina de redireccion cap al novèl títol.\nVerificatz plan las [[Special:DoubleRedirects|doblas redireccions]] o las [[Special:BrokenRedirects|redireccions copadas]].\nAvètz la responsabilitat de vos assegurar que los ligams contuhan de puntar cap a lor destinacion supausada.\n\nNotatz que la pagina serà <strong>pas</strong> desplaçada se existís ja una pagina amb lo títol novèl, levat se aquesta darrièra a un istoric de modificacions verge e es siá void, siá una simpla redireccion. Aquò permet de renomenar una pagina cap a sa posicion d’origina se lo desplaçament s’avèra erronèu, e es impossible d’espotir una pagina existenta.\n\n<strong>Atencion !</strong>\nAquò pòt provocar un cambiament radical e imprevist per una pagina sovent consultada ; asseguratz-vos de n'aver comprés las consequéncias abans de contunhar.",
+       "movepagetalktext": "Se marcatz aquesta casa, la pagina de discussion associada serà automaticament renomenada levat se una pagina de discussion, non voida, existís ja amb aqueste nom novèl.\n\nDins aqueste cas, vos caldrà renomenar o fusionar la pagina manualament se o volètz.",
        "moveuserpage-warning": "'''Atencion :''' Sètz a mand de tornar nomenar una pagina d’utilizaire. Notatz que sola la pagina serà renomenada e que l’utilizaire '''ne''' serà '''pas''' renomenat.",
        "movenologintext": "Per poder renomenar una pagina, vos cal èsser [[Special:UserLogin|indentific{{GENDER:||t|da)}}]]\nen tant qu'utilizaire enregistrat amb pro d'ancianetat.",
        "movenotallowed": "Avètz pas la permission de renomenar de paginas.",
        "cant-move-user-page": "Avètz pas la permission de renomenar las paginas principalas d'utilizaires.",
        "cant-move-to-user-page": "Avètz pas la permission de tornar nomenar una pagina cap a una pagina d'utilizaire (a l'excepcion d'una sospagina).",
        "cant-move-category-page": "Avètz pas la permission de renomenar las paginas de categorias.",
-       "cant-move-to-category-page": "Avètz pas lei drechs necessaris per desplaçar una pagina vèrs una categoria",
-       "cant-move-subpages": "Avètz pas lei drechs necessaris per desplaçar de sota-paginas.",
-       "namespace-nosubpages": "Lo nom d'espaci $1 autoriza pas lei sota-paginas.",
+       "cant-move-to-category-page": "Avètz pas lo dreit de renomenar una pagina cap a una pagina de categoria.",
+       "cant-move-subpages": "Avètz pas lo dreit de renomenar de sospaginas.",
+       "namespace-nosubpages": "L’espaci de noms « $1 » autoriza pas las sospaginas.",
        "newtitle": "Títol novèl :",
        "move-watch": "Seguir aquesta pagina",
        "movepagebtn": "Renomenar l'article",
        "articleexists": "Existís ja un article que pòrta aqueste títol, o lo títol qu'avètz causit es pas valid.\nCausissètz-ne un autre.",
        "cantmove-titleprotected": "Avètz pas la possibilitat de desplaçar una pagina cap a aqueste emplaçament perque lo títol es estat protegit a la creacion.",
        "movetalk": "Renomenar tanben la pagina de discussion associada",
-       "move-subpages": "Tornar nomenar las sospaginas (fins a $1 paginas)",
-       "move-talk-subpages": "Tornar nomenar las sospaginas de la pagina de discussion (fins a $1 paginas)",
+       "move-subpages": "Renomenar las sospaginas (maximum $1)",
+       "move-talk-subpages": "Renomenar las sospaginas de la pagina de discussion (maximum $1 paginas)",
        "movepage-page-exists": "La pagina $1 existís ja e pòt pas èsser espotida automaticament.",
        "movepage-page-moved": "La pagina $1 es estada renomenada en $2.",
        "movepage-page-unmoved": "La pagina $1 pòt èsser renomenada en $2.",
        "movepage-max-pages": "Lo maximum de $1 {{PLURAL:$1|pagina es estada renomenada|paginas son estadas renomenadas}} e cap d'autra o poirà pas èsser automaticament.",
        "movelogpage": "Istoric dels cambiaments de nom",
        "movelogpagetext": "Vaquí la lista de las darrièras paginas renomenadas.",
-       "movesubpage": "{{PLURAL:$1|Sospagina|Sospaginas}}",
+       "movesubpage": "Sospagina{{PLURAL:$1||s}}",
        "movesubpagetext": "Aquesta pagina a $1 {{PLURAL:$1|sospagina afichada|sospaginas afichadas}} çaijós.",
        "movenosubpage": "Aquesta pagina a pas cap de sospagina.",
        "movereason": "Motiu :",
        "delete_and_move_confirm": "Òc, accèpti de suprimir la pagina de destinacion per permetre lo cambiament de nom.",
        "delete_and_move_reason": "Pagina suprimida per permetre lo cambiament de nom dempuèi « [[$1]] »",
        "selfmove": "Los títols d’origina e de destinacion son los meteisses : impossible de tornar nomenar una pagina sus ela-meteissa.",
-       "immobile-source-namespace": "Podètz pas tornar nomenar de paginas dins l'espaci de noms « $1 »",
+       "immobile-source-namespace": "Podètz pas renomenar las paginas dins l'espaci de noms « $1 »",
        "immobile-target-namespace": "Podètz pas desplaçar de paginas cap a l'espaci de noms « $1 »",
        "immobile-target-namespace-iw": "Los ligams interwikis son pas una cibla valida pels cambiaments de nom.",
-       "immobile-source-page": "Aquesta pagina se pòt pas tornar nomenar.",
+       "immobile-source-page": "Aquesta pagina se pòt pas renomenar.",
        "immobile-target-page": "Es pas possible de desplaçar la pagina cap a aqueste títol.",
        "imagenocrossnamespace": "Pòt pas desplaçar un imatge cap a un espaci de nomenatge que siá pas un imatge.",
        "nonfile-cannot-move-to-file": "Impossible de renomenar quicòm mai qu'un fichièr cap a l'espaci de noms fichièr.",
        "move-leave-redirect": "Daissar una redireccion darrièr",
        "protectedpagemovewarning": "'''ATENCION:''' Aquesta pagina es estada protegida per que sonque los utilizaires qu'an los dreits d'administrators la pòscan renomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
        "semiprotectedpagemovewarning": "'''Nòta :''' Aquesta pagina es estada blocada per que sonque los utilizaires enregistrats la pòscan tornar nomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
-       "move-over-sharedrepo": "== Lo fichièr existís ==\n[[:$1]] existís ja sus un depaus partejat. Tornar nomenar aqueste fichièr farà lo fichièr sul depaus partatge inaccessible.",
+       "move-over-sharedrepo": "[[:$1]] existís ja sus un depaus partejat. Renomenar aqueste fichièr rendrà lo fichièr sul depaus partejat inaccessible.",
        "file-exists-sharedrepo": "Lo nom causit es ja utilizat per un fichièr sus un depaus partejat.\nCausissètz un autre nom.",
        "export": "Exportar de paginas",
        "exporttext": "Podètz exportar en XML lo tèxte e l’istoric d’una pagina o d’un ensemble de paginas; lo resultat pòt alara èsser importat dins un autre wiki que fonciona amb lo logicial MediaWiki.\n\nPer exportar de paginas, entratz lors títols dins la bóstia de tèxte çaijós, un títol per linha, e seleccionatz s'o desiratz o pas la version actuala amb totas las versions ancianas, amb la pagina d’istoric, o simplament la pagina actuala amb d'informacions sus la darrièra modificacion.\n\nDins aqueste darrièr cas, podètz tanben utilizar un ligam, coma [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per la pagina [[{{MediaWiki:Mainpage}}]].",
        "export-download": "Salvar en tant que fichièr",
        "export-templates": "Enclure los modèls",
        "export-pagelinks": "Enclure las paginas ligadas a una prigondor de :",
-       "export-manual": "Ajustar de paginas manualament :",
+       "export-manual": "Apondre de paginas manualament :",
        "allmessages": "Lista dels messatges del sistèma",
        "allmessagesname": "Nom del camp",
        "allmessagesdefault": "Messatge per defaut",
        "thumbnail_image-missing": "Lo fichièr seguent es introbable : $1",
        "import": "Importar de paginas",
        "importinterwiki": "Importar a partir d'un autre wiki",
-       "import-interwiki-text": "Seleccionatz un wiki e un títol de pagina d'importar.\nLas datas de las versions e los noms dels editors seràn preservats.\nTotas las accions d’importacion interwiki son conservadas dins lo [[Special:Log/import|jornal d’impòrt]].",
+       "import-interwiki-text": "Seleccionatz un wiki e un títol de pagina d'importar.\nLas datas de las versions e los noms dels contributors seràn preservats.\nTotas las accions d’importacion a partir d'autres wikis son conservadas dins l' [[Special:Log/import|istoric de las importacions]].",
        "import-interwiki-sourcewiki": "Wiki font :",
        "import-interwiki-sourcepage": "Pagina font :",
        "import-interwiki-history": "Copiar totas las versions de l'istoric d'aquesta pagina",
-       "import-interwiki-templates": "Enclure totes los modèls",
+       "import-interwiki-templates": "Inclure totes los modèls",
        "import-interwiki-submit": "Importar",
        "import-mapping-default": "Importar als emplaçaments per defaut",
        "import-mapping-namespace": "Importar cap a un espaci de noms :",
        "importcantopen": "Impossible de dobrir lo fichièr d'importar",
        "importbadinterwiki": "Ligam interwiki marrit",
        "importsuccess": "L'impòrt a capitat !",
-       "importnosources": "Cap de font interwiki es pas estada definida e la còpia dirècta d’istoric es desactivada.",
+       "importnosources": "Cap de font wiki es pas estada definida e l'impòrt dirècte d’istorics es desactivat.",
        "importnofile": "Cap de fichièr es pas estat importat.",
        "importuploaderrorsize": "Lo telecargament del fichièr d'importar a pas capitat. Sa talha es mai granda que la autorizada.",
        "importuploaderrorpartial": "Lo telecargament del fichièr d'importar a pas capitat. Aqueste o es pas estat que parcialament.",
        "tooltip-p-logo": "Pagina principala",
        "tooltip-n-mainpage": "Visitatz la pagina principala",
        "tooltip-n-mainpage-description": "Anar a l’acuèlh",
-       "tooltip-n-portal": "A prepaus del projècte",
+       "tooltip-n-portal": "A prepaus del projècte, çò que podètz far, ont trobar d'informacions",
        "tooltip-n-currentevents": "Trobar d'entresenhas suls eveniments actuals",
        "tooltip-n-recentchanges": "Lista dels darrièrs cambiaments sul wiki",
        "tooltip-n-randompage": "Afichar una pagina a l'azard",
        "spambot_username": "Netejatge de spam de MediaWiki",
        "spam_reverting": "Restabliment de la darrièra version que conten pas de ligam cap a $1",
        "spam_blanking": "Totas las versions que contenon de ligams cap a $1 son blanquidas",
-       "spam_deleting": "Totas las versions contenonián de ligams cap a $1, supression",
+       "spam_deleting": "Totas las versions contenián de ligams cap a $1, supression",
        "simpleantispam-label": "Verificacion antispam.\nInscriviscatz '''PAS RES''' dedins !",
        "pageinfo-title": "Informacions per « $1 »",
        "pageinfo-not-current": "O planhèm, impossible de provesir aquesta informacion per las ancianas revisions.",
        "pageinfo-edits": "Nombre total de modificacions",
        "pageinfo-authors": "Nombre total d'autors distinctes",
        "pageinfo-recent-edits": "Nombre de modificacions recentas (dins los darrièrs $1)",
-       "pageinfo-recent-authors": "Nombre d'autors distinctes recents",
+       "pageinfo-recent-authors": "Nombre d'autors distintes recents",
        "pageinfo-magic-words": "{{PLURAL:$1|Mot magic|Mots magics}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria amagada|Categorias amagadas}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèl inclús|Modèls incluses}} ($1)",
        "scarytranscludefailed-httpstatus": "[Fracàs de la recuperacion del modèl per  $1 : HTTP  $2 ]",
        "scarytranscludetoolong": "[L’URL es tròp longa]",
        "deletedwhileediting": "'''Atencion''' : aquesta pagina es estada suprimida aprèp qu'avètz començat de la modificar !",
-       "confirmrecreate": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|talk]]) a suprimit aquesta pagina, alara que l'aviatz començat d'editar, pel motiu seguent:\n: ''$2''\nConfirmatz que desiratz tornar crear aqueste article.",
-       "confirmrecreate-noreason": "L'utilizaire [[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de la modificar. Confirmatz que desiratz tornar crear aquesta pagina.",
+       "confirmrecreate": "L'utilizair{{GENDER:$1|e|a}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de l'editar, pel motiu seguent:\n: <em>$2</em>\nConfirmatz que sètz segur que volètz tornar crear aquesta pagina.",
+       "confirmrecreate-noreason": "L'utilizair{{GENDER:$1|e|a}}[[User:$1|$1]] ([[User talk:$1|Discussion]]) a suprimit aquesta pagina, mentre qu'aviatz començat de la modificar. Confirmatz que sètz segur que volètz tornar crear aquesta pagina.",
        "recreate": "Tornar crear",
        "confirm_purge_button": "Confirmar",
        "confirm-purge-top": "Volètz refrescar aquesta pagina (purgar l'escondedor) ?",
        "htmlform-datetime-placeholder": "AAAA-MM-JJ HH:MM:SS",
        "htmlform-title-not-exists": "$1 existís pas.",
        "htmlform-user-not-exists": "<strong>$1</strong> existís pas.",
-       "htmlform-user-not-valid": "<strong>$1</strong> es pas un nom d'utilizaire valide.",
+       "htmlform-user-not-valid": "<strong>$1</strong> es pas un nom d'utilizaire valid.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a suprimit}} la pagina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|suprimit}} redirigit cap a $3 per espotiment.",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restablit}} la pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modificat}} la visibilitat {{PLURAL:$5|d'un eveniment del jornal|de $5 eveniments del jornal}} sus $3 : $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a modificat}} la visibilitat {{PLURAL:$5|d'una revision|de $5 revisions}} sus la pagina $3 : $4",
        "logentry-managetags-activate": "$1 {{GENDER:$2|a activat}} la balisa \"$4\" per l’usatge dels utilizaires e dels robòts",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|a desactivat}} la balisa « $4 » per l’usatge dels utilizaires e dels robòts",
        "log-name-tag": "Jornal de las balisas",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|a mes a jorn}} las balisas de la revision $4 de la pagina $3 ($6 {{PLURAL:$7|aponduda|apondudas}} ; $8 {{PLURAL:$9|suprimida|suprimidas}})",
        "rightsnone": "(cap)",
        "revdelete-summary": "modificar lo somari",
        "feedback-adding": "Apondon de vòstres comentaris a la pagina...",
        "pagelang-use-default": "Utilizar la lenga per defaut",
        "pagelang-select-lang": "Seleccionar la lenga",
        "pagelang-reason": "Motiu",
-       "pagelang-submit": "Validar",
+       "pagelang-submit": "Mandar",
        "pagelang-nonexistent-page": "La pagina $1 existís pas.",
        "right-pagelang": "Cambiar la lenga de la pagina",
        "action-pagelang": "cambiar la lenga de la pagina",
        "special-characters-title-minus": "signe mens",
        "mw-widgets-dateinput-no-date": "Cap de data pas seleccionada",
        "mw-widgets-mediasearch-input-placeholder": "Recercar de mèdias",
-       "mw-widgets-mediasearch-noresults": "Ges de resultat trobat",
-       "mw-widgets-categoryselector-add-category-placeholder": "Ajustar una categoria...",
-       "sessionprovider-generic": "$1 sessions",
+       "mw-widgets-mediasearch-noresults": "Cap de resultat pas trobat.",
+       "mw-widgets-categoryselector-add-category-placeholder": "Apondre una categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Apondre mai...",
+       "sessionprovider-generic": "sessions $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basadas sus de cookies",
-       "sessionprovider-nocookies": "Lei cookies son benlèu desactivats. Verificatz que lei cookies siegan ben activat e tornatz assaiar.",
+       "sessionprovider-nocookies": "Es possible que los testimònis (''cookies'') sián desactivats. Asseguratz-vos qu'avètz activat los testimònis e recomençatz.",
        "randomrootpage": "Pagina raiç aleatòria",
-       "log-action-filter-block": "Tipe d'accion :",
-       "log-action-filter-delete": "Tipe d'accion :",
+       "log-action-filter-block": "Tipe de blocatge :",
+       "log-action-filter-delete": "Tipe de supression :",
        "log-action-filter-import": "Tipe d'importacion :",
-       "log-action-filter-managetags": "Tipe d'accion :",
+       "log-action-filter-managetags": "Tipe d'accion de gestion de las etiquetas :",
        "log-action-filter-move": "Tipe de desplaçament :",
-       "log-action-filter-newusers": "Tipe de creacion :",
+       "log-action-filter-newusers": "Tipe de creacion de compte :",
        "log-action-filter-patrol": "Tipe de patrolha :",
-       "log-action-filter-protect": "Tipe d'accion :",
+       "log-action-filter-protect": "Tipe de proteccion :",
        "log-action-filter-rights": "Tipe de cambiament de dreits :",
        "log-action-filter-suppress": "Tipe de supression :",
-       "log-action-filter-upload": "Tipe de telecargament :",
+       "log-action-filter-upload": "Tipe de mandadís :",
        "log-action-filter-all": "Tot",
        "log-action-filter-block-block": "Blocatge",
        "log-action-filter-block-reblock": "Modificacion de blocatge",
        "log-action-filter-block-unblock": "Desblocar",
-       "log-action-filter-delete-delete": "Escafament de pagina",
-       "log-action-filter-delete-restore": "Restauracion de pagina",
+       "log-action-filter-delete-delete": "Supression de paginas",
+       "log-action-filter-delete-restore": "Restabliment de pagina",
        "log-action-filter-import-interwiki": "Impòrt transwiki",
-       "log-action-filter-managetags-create": "Creacion d'etiqueta",
-       "log-action-filter-managetags-delete": "Supression d'etiqueta",
-       "log-action-filter-managetags-activate": "Activacion d'etiqueta",
-       "log-action-filter-managetags-deactivate": "Desactivacion d'etiqueta",
+       "log-action-filter-managetags-create": "Creacion de balisa",
+       "log-action-filter-managetags-delete": "Supression de balisa",
+       "log-action-filter-managetags-activate": "Activacion de l'etiqueta",
+       "log-action-filter-managetags-deactivate": "Desactivacion de l'etiqueta",
        "log-action-filter-newusers-create": "Creacion per un utilizaire anonim",
        "log-action-filter-newusers-create2": "Creacion per un utilizaire enregistrat",
        "log-action-filter-newusers-autocreate": "Creacion automatica",
-       "log-action-filter-newusers-byemail": "Creacion amb un senhau mandat per corrier electronic",
+       "log-action-filter-newusers-byemail": "Creacion amb un senhal mandat per corrièr electronic",
        "log-action-filter-patrol-patrol": "Patrolha manuala",
        "log-action-filter-patrol-autopatrol": "Patrolha automatica",
        "log-action-filter-protect-protect": "Proteccion",
-       "log-action-filter-protect-modify": "Modificacion de proteccion",
+       "log-action-filter-protect-modify": "Modificacion de la proteccion",
        "log-action-filter-protect-unprotect": "Desproteccion",
        "log-action-filter-protect-move_prot": "Proteccion de renomenatge",
-       "log-action-filter-rights-rights": "Cambiament manuau",
+       "log-action-filter-rights-rights": "Cambiament manual",
        "log-action-filter-rights-autopromote": "Cambiament automatic",
        "log-action-filter-suppress-event": "Supression de jornal",
        "log-action-filter-suppress-revision": "Supression de revision",
        "log-action-filter-suppress-delete": "Supression de pagina",
-       "log-action-filter-upload-upload": "Telecargament novèu",
-       "log-action-filter-upload-overwrite": "Retelecargament",
-       "authmanager-create-disabled": "La creacion de còmptes es blocada.",
-       "authmanager-authplugin-setpass-bad-domain": "Domeni invalide",
-       "authmanager-autocreate-noperm": "La creacion automatica de còmptes es blocada.",
-       "authmanager-password-help": "Senhau per autentificacion.",
-       "authmanager-domain-help": "Domeni per autentificacion extèrna.",
-       "authmanager-retype-help": "Mercé de confiermar vòstre senhau.",
+       "log-action-filter-upload-upload": "Mandadís novèl",
+       "log-action-filter-upload-overwrite": "Tornar mandar",
+       "authmanager-authn-autocreate-failed": "La creacion automatica d’un compte local a fracassat : $1",
+       "authmanager-create-disabled": "La creacion de compte es desactivada.",
+       "authmanager-authplugin-setpass-bad-domain": "Domeni invalid.",
+       "authmanager-autocreate-noperm": "La creacion automatica de compte es pas autorizada.",
+       "authmanager-password-help": "Senhal per l'autentificacion.",
+       "authmanager-domain-help": "Domeni per l'autentificacion extèrna.",
+       "authmanager-retype-help": "Senhal un còp de mai per confirmacion.",
        "authmanager-email-label": "Corrièr electronic",
        "authmanager-email-help": "Adreça de corrièr electronic",
        "authmanager-realname-label": "Nom vertadièr",
        "authmanager-realname-help": "Nom real de l'utilizaire",
-       "authmanager-provider-password": "Autentificacion ambé senhau",
-       "authmanager-provider-temporarypassword": "Senhau provisòri",
-       "authprovider-confirmlink-message": "Segon lei vòstreis assais recents de connexion, lei còmptes seguents pòdon èsser liats vèrs lo vòstre còmpte wiki. Lei liar permet de se connectar amb aqueleis còmptes. Mercé de seleccionar lei còmptes de liar.",
-       "authprovider-confirmlink-request-label": "Còmptes de liar",
-       "authprovider-confirmlink-success-line": "$1 : operacion capitada, lei còmptes son estats liats.",
-       "authprovider-confirmlink-failed": "La temptativa de liar lei còmptes a pas capitat : $1",
+       "authmanager-provider-password": "Autentificacion amb senhal",
+       "authmanager-provider-temporarypassword": "Senhal provisòri",
+       "authprovider-confirmlink-message": "D’aprèp vòstras darrièras temtativas de connexion, los comptes seguents pòson èsser ligats a vòstre compte wiki. Los ligar vos permetrà de vos connectar via aquestes comptes. Seleccionatz los que devon èsser ligats.",
+       "authprovider-confirmlink-request-label": "Comptes que devon èsser ligats",
+       "authprovider-confirmlink-success-line": "$1 : Ligats amb succès.",
+       "authprovider-confirmlink-failed": "La ligason del compte a pas plan capitat : $1",
        "authprovider-resetpass-skip-label": "Sautar",
        "authform-newtoken": "Geton mancant. $1",
        "authform-notoken": "Geton mancant",
        "authform-wrongtoken": "Marrit geton",
-       "specialpage-securitylevel-not-allowed-title": "Pas autorizat",
+       "specialpage-securitylevel-not-allowed-title": "Interdit",
        "changecredentials": "Modificar las informacions d’identificacion",
+       "removecredentials": "Suprimir las informacions d'identificacion",
+       "removecredentials-submit": "Suprimir las informacions d'identificacion",
+       "credentialsform-provider": "Tipe d’informacion d’identificacion :",
        "credentialsform-account": "Nom de compte :",
-       "linkaccounts": "Liar lei còmptes",
-       "linkaccounts-success-text": "Lo còmpte èra estat liat.",
-       "linkaccounts-submit": "Liar lei còmptes",
-       "revid": "Revision $1",
-       "pageid": "Pagina ID $1"
+       "cannotlink-no-provider-title": "I a pas de comptes que pòdon èsser ligats",
+       "cannotlink-no-provider": "I a pas de compte que pòsca èsser ligat.",
+       "linkaccounts": "Ligar los comptes",
+       "linkaccounts-success-text": "Lo compte es estat ligat.",
+       "linkaccounts-submit": "Ligar los comptes",
+       "restrictionsfield-badip": "Adreça IP o plaja invalida : $1",
+       "revid": "version $1",
+       "pageid": "ID de pagina $1"
 }
index 545ff62..19e7e17 100644 (file)
                        "아라",
                        "Macofe",
                        "Nistha.aslp",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Susant purohit"
                ]
        },
-       "tog-underline": "ଲିଙ୍କତଳେଗାର ଟାଣିବା:",
+       "tog-underline": "ଲିଙ୍କତଳେ ଗାର ଟାଣିବା:",
        "tog-hideminor": "ନିକଟରେ ହୋଇଥିବା ଛୋଟ ବଦଳସବୁକୁ ଲୁଚାଇବେ",
        "tog-hidepatrolled": "ନଗଦ ବଦଳରେ ନିରିକ୍ଷଣ କରାଯାଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
        "tog-newpageshidepatrolled": "ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ପରଖା ହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ",
@@ -58,7 +59,7 @@
        "tog-showhiddencats": "ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ",
        "tog-norollbackdiff": "ପଛକୁ ଫେରାଇଲାପରେ ତୁଳନା ଦେଖାନ୍ତୁ ନାହିଁ",
        "tog-useeditwarning": "ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ",
-       "tog-prefershttps": "ଲà¬\97 à¬\87ନ à¬\95ଲାପରà­\87 à¬¸à¬°à­\8dବଦା à¬¸à­\81ରà¬\95à­\8dଷିତ à¬\95ନà­\87à¬\95à­\8dସନ ବ୍ୟବହାର କରିବେ",
+       "tog-prefershttps": "ଲà¬\97 à¬\87ନ à¬¹à­\87ଲା à¬ªà¬°à­\87  à¬¸à¬°à­\8dବଦା à¬¸à­\81ରà¬\95à­\8dଷିତ à¬¸à¬\82ଯà­\8bà¬\97  ବ୍ୟବହାର କରିବେ",
        "underline-always": "ସବୁବେଳେ",
        "underline-never": "କେବେନୁହେଁ",
        "underline-default": "ବ୍ରାଉଜର କିମ୍ବା ସ୍କିନରେ ଆଗରୁ ଥିବା ସୁବିଧା",
        "newwindow": "(ଏହା ନୂଆ ଉଇଣ୍ଡୋରେ ଖୋଲିବ)",
        "cancel": "ନାକଚ",
        "moredotdotdot": "ଅଧିକ...",
-       "morenotlisted": "à¬\8fହି à¬¤à¬¾à¬²à¬¿à¬\95ା à¬ªà­\82ରା à¬¹à­\8bà¬\87 à¬¨à¬¾à¬¹à¬¿à¬\81",
+       "morenotlisted": "ହà­\81à¬\8fତ à¬\8fହି à¬¤à¬¾à¬²à¬¿à¬\95ା à¬\85ସମà­\8dପà­\82ରà­\8dଣ.",
        "mypage": "ପୃଷ୍ଠା",
        "mytalk": "ଆଲୋଚନା",
        "anontalk": "ଆଲୋଚନା",
        "searcharticle": "ଯାଆନ୍ତୁ",
        "history": "ଫାଇଲ ଇତିହାସ",
        "history_short": "ଇତିହାସ",
+       "history_small": "ଇତିହାସ",
        "updatedmarker": "ମୋ ଶେଷ ଆସିବା ପରେ ଅପଡେଟ କରାଯାଇଅଛି",
        "printableversion": "ଛପାହୋଇପାରିବା ପୃଷ୍ଠା",
        "permalink": "ସବୁଦିନିଆ ଲିଙ୍କ",
        "talk": "ଆଲୋଚନା",
        "views": "ଦେଖା",
        "toolbox": "ଉପକରଣ",
+       "tool-link-emailuser": "{{GENDER:$1|user}}ଙ୍କୁ ଇ-ମେଲ କରନ୍ତୁ",
        "userpage": "ବ୍ୟବହାରକାରୀଙ୍କ ପୃଷ୍ଠା ଦେଖନ୍ତୁ",
        "projectpage": "ପ୍ରକଳ୍ପ ପୃଷ୍ଠାଟି ଦେଖାଇବା",
        "imagepage": "ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ",
        "badtitletext": "ଆପଣ ଅନୁରୋଧ କରିଥିବା ପୃଷ୍ଠାଟି ଭୁଲ, ଖାଲି ଅଛି ବା ବାକି ଭାଷା ସାଙ୍ଗରେ ଭୁଲରେ ଯୋଡ଼ା ଯାଇଛି ବା ଭୁଲ ଇଣ୍ଟର ଉଇକି ନାମ ଦିଆଯାଇଛି ।\nଏଥିରେ ଥିବା ଗୋଟିଏ ବା ଦୁଇଟି ଅକ୍ଷର ଶିରୋନାମା ଭାବରେ ବ୍ୟବହାର କରାଯାଇ ପାରିବ ନାହିଁ ।",
        "title-invalid-empty": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠାର ଶର୍ଷକଟି ଖାଲି ଅଛି କିମ୍ବା ନେମସ୍ପସର ନାମ ଅଛି ।",
        "title-invalid-utf8": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠାର ଶର୍ଷକରେ ଅବୈଧ UTF-8 ଧାରା ଅଛି ।",
+       "title-invalid-interwiki": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠା ଶିରୋନାମା ରେ ଇଣ୍ଟରଉଇକି ଲିଙ୍କ ରହିଥିବାରୁ ଏହି ଶିରୋନାମା ରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ।",
+       "title-invalid-talk-namespace": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠା ଶିରୋନାମା ଏକ ଟକ ପୃଷ୍ଠା କୁ ଆଧାର କରେ ଯାହା ଉପଲବ୍ଧ ନୁହେଁ।",
+       "title-invalid-characters": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠା ଶିରୋନାମା ଏକ ଅଗ୍ରହଣୀୟ ଚରିତ୍ର \"$1\" ରହିଛି।",
+       "title-invalid-magic-tilde": "ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷା ଶିରୋନାମା ରେ ଅଗ୍ରହଣୀୟ ମେଜିକ ଟିଲଡ଼େ ଅନୁକ୍ରମ (<nowiki>~~~</nowiki>)ରହିଛି।",
+       "title-invalid-leading-colon": "ଅନୁରୋଧ କରାଯାଇଥିବା ପ୍ରୁଷ୍ଠା ଶିରୋନାମାର ଆରମ୍ଭ  ରେ ଏକ ଅଗ୍ରହଣୀୟ କୋଲନ ରହିଛି।",
        "perfcached": "ତଳଲିଖିତ ତଥ୍ୟଗୁଡିକୁ ଅସ୍ଥାୟୀ ଭାବେ ରଖାଗଲା ଏବଂ ଏହା ଅପଡେଟ ନ ହୋଇପାରେ । ଅତିବେଶିରେ {{PLURAL:$1|ଫଳ|$1ଫଳଗୁଡିକ }} ଅସ୍ଥାୟୀ ରୂପେ ରହି ପାରିବ ।",
        "perfcachedts": "ତଳଲିଖିତ ତଥ୍ୟଗୁଡିକୁ ଅସ୍ଥାୟୀ ଭାବେ ରଖାଗଲା ଏବଂ  $1ରେ ଶେଷଥର ଅପଡେଟ ହୋଇଥିଲା । ଅତିବେଶିରେ {{PLURAL:$1|ଫଳ|$1ଫଳଗୁଡିକ }} ଅସ୍ଥାୟୀ ରୂପେ ରହି ପାରିବ ।",
        "querypage-no-updates": "ଏହି ପୃଷ୍ଠାଟି ପାଇଁ ଅପଡେଟସବୁ ଏବେ ଅଚଳ କରାଯାଇଅଛି ।\nଏଠାରେ ଥିବା ତଥ୍ୟ ସବୁ ଏବେ ସତେଜ ହୋଇପାରିବ ନାହିଁ ।",
        "createacct-yourpasswordagain-ph": "ଆଉଥରେ ପାସୱାର୍ଡ଼ ଦିଅନ୍ତୁ",
        "userlogin-remembermypassword": "ମୋତେ ଲଗ-ଇନ କରି ରଖିଥାନ୍ତୁ",
        "userlogin-signwithsecure": "ନିରାପଦ କନେକସନ ବ୍ୟବ‌ହାର କରନ୍ତୁ",
+       "cannotlogin-title": "ଲଗ ଇନ ହୋଇପାରିବ ନାହିଁ",
+       "cannotlogin-text": "ଲଗିଂ ଇନ ସମ୍ଭବ ନୁହେଁ।",
        "cannotloginnow-title": "ଏବେ ଲଗ ଇନ ହୋଇପାରିବ ନାହିଁ",
        "cannotloginnow-text": "$1ବ୍ୟବହାର କରୁଥିବା ବେଳେ ଲଗ ଇନ ହେଇପାରିବ ନାହିଁ ।",
+       "cannotcreateaccount-title": "ଖାତା ତିଆରି କରାଯାଇପାରିବ ନାହିଁ",
+       "cannotcreateaccount-text": "ସିଧାସଳଖ ଖାତା ଖୋଲିବା ଏହି ଉଇକି ରେ ସମର୍ଥ କରାଯାଇ ନାହିଁ।",
        "yourdomainname": "ଆପଣଙ୍କ ଡୋମେନ:",
        "password-change-forbidden": "ଆପଣ ଏହି ଉଇକିରେ ପାସୱାର୍ଡ ବଦଳାଇ ପାରିବେ ନାହିଁ ।",
        "externaldberror": "ବୋଧ ହୁଏ ଚିହ୍ନଟ ଡାଟାବେସ ଭୁଲଟିଏ ହୋଇଥିଲା ବା ଆପଣଙ୍କୁ ନିଜର ବାହାର ଖାତା ଅପଡେଟ କରିବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।",
        "login": "ଲଗ-ଇନ (Log in)",
+       "login-security": "ଆପଣଙ୍କ ପରିଚୟ ଯାଞ୍ଚ କରନ୍ତୁ",
        "nav-login-createaccount": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
        "userlogin": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
        "userloginnocreate": "ଲଗ-ଇନ (Log in)",
        "userlogin-resetpassword-link": "ପାସୱାର୍ଡ଼ ମନେପଡୁନାହିଁ?",
        "userlogin-helplink2": "ଲଗ ଇନ ପାଇଁ ସହଯୋଗ କରନ୍ତୁ",
        "userlogin-loggedin": "ଆପଣ {{GENDER:$1|$1}} ନାମରେ ଲଗ ଇନ କରିଛନ୍ତି । ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରି ଆଉ ଜଣେ ସଭ୍ୟ ଭାବେ ଲଗ ଇନ କରନ୍ତୁ ।",
+       "userlogin-reauth": "ଆପଣ {{GENDER:$1|$1}} ବୋଲି ଯାଞ୍ଚ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଆଉଥରେ ଲଗ ଇନ କରିବାକୁ ହେବ।",
        "userlogin-createanother": "ଆଉ ଏକ ଖାତା ତିଆରି କରନ୍ତୁ",
        "createacct-emailrequired": "ଇମେଲ ଠିକଣା",
        "createacct-emailoptional": "ଇମେଲ ଠିକଣା (ଇଚ୍ଛାଧୀନ)",
        "createacct-email-ph": "ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ଦିଅନ୍ତୁ",
        "createacct-another-email-ph": "ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ",
        "createaccountmail": "ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ ଏହାକୁ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ପଠାଇଦିଅନ୍ତୁ",
+       "createaccountmail-help": "ପାସୱାର୍ଡ ନ ଜାଣି ମଧ୍ୟ ଆଉ ଜଣେ ବ୍ୟକ୍ତି ଙ୍କ ପାଇଁ ଖାତା ଖୋଲିବାକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ।",
        "createacct-realname": "ପ୍ରକୃତ ନାମ (ଇଚ୍ଛାଧୀନ)",
        "createaccountreason": "କାରଣ:",
        "createacct-reason": "କାରଣ",
        "createacct-reason-ph": "ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି",
+       "createacct-reason-help": "ଖାତା ଖୋଲିବା ଲଗ ରେ ବାର୍ତା ଦେଖାଯାଇଛି",
        "createacct-submit": "ନିଜର ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "createacct-another-submit": "ଆଉ ଏକ ଖାତା ଖୋଲନ୍ତୁ",
+       "createacct-continue-submit": "ଖାତା ଖୋଲିବା ଜାରି ରଖନ୍ତୁ",
+       "createacct-another-continue-submit": "ଖାତା ଖୋଲିବା ଜାରି ରଖନ୍ତୁ",
        "createacct-benefit-heading": "{{SITENAME}} ଆପଣଙ୍କ ଭଳି ଲୋକମାନଙ୍କ ଦ୍ୱାରା ଗଢ଼ା ।",
        "createacct-benefit-body1": "{{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାମାନ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠାମାନ}}",
        "nocookiesnew": "ଇଉଜର ନାମଟି ତିଆରି କରିଦିଆଗଲା, ହେଲେ ଆପଣ ଲଗ ଇନ କରିନାହାନ୍ତି ।\n{{SITENAME}} ସଭ୍ୟମାନଙ୍କୁ ଲଗ ଇନ କରିବା ନିମନ୍ତେ କୁକି ବ୍ୟବହାର କରିଥାଏ । ଆପଣଙ୍କ କୁକି ଅଚଳ କରାଯାଇଅଛି ।\nଦୟାକରି ତାହାକୁ ସଚଳ କରନ୍ତୁ ଓ ତାହା ପରେ ଆପଣଙ୍କ ନୂଆ ଇଉଜର ନାମ ଓ ପାସୱାର୍ଡ଼ ସହିତ ଲଗ ଇନ କରନ୍ତୁ ।",
        "nocookieslogin": "{{SITENAME}} ସଭ୍ୟ ମାନଙ୍କୁ ଲଗ ଇନ କରାଇବା ପାଇଁ କୁକି ବ୍ୟବହାର କରିଥାଏ ।\nଆପଣଙ୍କର କୁକି ଅଚଳ ହୋଇଅଛି ।\nଦୟାକରି ତାହାକୁ ସଚଳ କରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "nocookiesfornew": "ଯେହେତୁ ଆମ୍ଭେ ଏହାର ମୂଳାଧାର ଜାଣିପାରିଲୁ ନାହିଁ ଏହି ଇଉଜର ଖାତାଟି ତିଆରି କରାଗଲା ନାହିଁ ।\nଥୟ କରନ୍ତୁ କି ଆପଣ କୁକି ସଚଳ କରିଅଛନ୍ତି, ପୃଷ୍ଠାଟିକୁ ଆଉଥରେ ଲୋଡ଼ କରି ଚେଷ୍ଟା କରନ୍ତୁ ।",
+       "createacct-loginerror": "ଖାତା ସଫଳ ଭାବରେ ଖୋଲା ଗଲା କିନ୍ତୁ ଆପଣଙ୍କୁ ସ୍ଵତଃ ଲଗ ଇନ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି [[Special:UserLogin|manual login]] କୁ ଦେଖନ୍ତୁ।",
        "noname": "ଆପଣ ଗୋଟିଏ ବୈଧ ଇଉଜର ନାମ ଦେଇନାହାନ୍ତି ।",
        "loginsuccesstitle": "ଠିକଭାବେ ଲଗ-ଇନ ହେଲା",
        "loginsuccess": "'''ଆପଣ {{SITENAME}}ରେ \"$1\" ନାମରେ ଲଗ-ଇନ କରିଛନ୍ତି ।'''",
        "wrongpasswordempty": "ଦିଆଯାଇଥିବା ପାସବାର୍ଡ଼ଟି ଖାଲି ଛଡ଼ାଯାଇଛି ।\nଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "passwordtooshort": "ପାସୱାର୍ଡ଼ଟି ଅତି କମରେ {{PLURAL:$1|ଗୋଟିଏ ଅକ୍ଷର|$1ଟି ଅକ୍ଷର}}ର ହୋଇଥିବା ଲୋଡ଼ା ।",
        "passwordtoolong": "ପସସ୍ୱାର୍ଡଟି {{PLURAL:$1|1 ଅକ୍ଷର|$1 ଅକ୍ଷରଗୁଡିକ}}ଠାରୁ ଅଧିକ ହୋଇ ପାରିବ ନାହିଁ ।",
+       "passwordtoopopular": "ସାଧାରଣ ଭାବରେ ବଛାଯାଇଥିବା ପାସୱାର୍ଡ ବ୍ୟବହାର କରିହେବ ନାହିଁ। ଦୟାକରି ଏକ ଅଦ୍ଵିତୀୟ ପାସୱାର୍ଡ ବାଛନ୍ତୁ।",
        "password-name-match": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ଆପଣଙ୍କ ଇଉଜର ନାମ ଠାରୁ ଅଲଗା ହେବା ଉଚିତ ।",
        "password-login-forbidden": "ଏହି ଇଉଜର ନାମ ଓ ପାସୱାର୍ଡ଼ର ବ୍ୟବହାରକୁ ବାରଣ କରାଯାଇଅଛି ।",
        "mailmypassword": "ପାସୱାର୍ଡ଼ଟି ରିସେଟ କରିବେ",
        "eauthentsent": "ଆପଣ ଦେଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ମେଲଟିଏ ପଠାଗଲା ।\nଆହୁରି ଅଧିକ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ, ଏହି ଖାତାଟି ନିଜର ବୋଲି ଥୟ କରିବା ପାଇଁ ପଠାଯାଇଥିବା ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସାରେ କାମ କରନ୍ତୁ ।",
        "throttled-mailpassword": "ଗତ {{PLURAL:$1|ଏକ ଘଣ୍ଟାରେ|$1 ଘଣ୍ଟାରେ}} ଆପଣଙ୍କୁ ଏକ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଯାଇଛି ।\nଅବ୍ୟବହାରକୁ ରୋକିବା ନିମନ୍ତେ, {{PLURAL:$1|ଏକ ଘଣ୍ଟାରେ|$1 ଘଣ୍ଟାରେ}} କେବଳ ଗୋଟିଏ ଇମେଲ ହିଁ ପଠାହେବ ।",
        "mailerror": "ମେଲ ପଠାଇବାରେ ଭୁଲ : $1",
-       "acct_creation_throttle_hit": "ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ ଦିନରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।\nତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।",
+       "acct_creation_throttle_hit": "ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ $2 ରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।\nତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।",
        "emailauthenticated": "$2 ତାରିଖ $3 ଘଟିକା ସମୟରେ ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାଟି ଥୟ ହେଲା ।",
        "emailnotauthenticated": "ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାଟି ଏ ଯାଏ ଥୟ ହୋଇନାହିଁ ।\nଏହି ସବୁ ସୁବିଧାକୁ ନେଇ ଆପଣଙ୍କୁ କୌଣସି ଇ-ମେଲ ପଠାଯିବ ନାହିଁ ।",
        "noemailprefs": "ଆପଣଙ୍କ ପସନ୍ଦ ଭିତରେ ଏକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ ଯାହା ଏହି ସବୁ ସୁବିଧାକୁ ସଚଳ କରାଇବ ।",
        "createacct-another-realname-tip": "ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।\nଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।",
        "pt-login": "ଲଗ-ଇନ",
        "pt-login-button": "ଲଗ-ଇନ",
+       "pt-login-continue-button": "ଲଗଇନ ଜାରି ରଖନ୍ତୁ",
        "pt-createaccount": "ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "pt-userlogout": "ଲଗ-ଆଉଟ",
        "php-mail-error-unknown": "PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସୁବିଧା ।",
        "changepassword-success": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ସଫଳତା ପୂର୍ବକ ବଦଳାଇ ଦିଆଗଲା !",
        "changepassword-throttled": "ଆପଣ ନିକଟରେ ଖୁବ ଅଧିକ ଥର ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରିଛନ୍ତି ।\nଆଉ ଅଧିକ ଥର ଚେଷ୍ଟା କରିବା ଆଗରୁ ଦୟାକରି $1 ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "botpasswords": "ବଟ ପାସୱାର୍ଡ଼",
+       "botpasswords-disabled": "Bot ପାସୱାର୍ଡ ଅକାମି କରାଯାଇଛି।",
+       "botpasswords-no-central-id": "Bot ପାସୱାର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଆପଣ ନିଶ୍ଚୟ ଏକ କେନ୍ଦ୍ରୀକୃତ ଖାତା ରେ ଲଗ ଇନ ହେଇଥିବାକୁ ହେବ।",
        "botpasswords-label-appid": "ବଟ ନାମ:",
        "botpasswords-label-create": "ତିଆରି କରିବେ",
        "botpasswords-label-update": "ଅପଡେଟ କରିବେ",
        "botpasswords-label-cancel": "ବାତିଲ",
        "botpasswords-label-delete": "ଲିଭାଇବେ",
        "botpasswords-label-resetpassword": "ପାସୱାର୍ଡ଼ଟି ରିସେଟ କରିବେ",
+       "botpasswords-bad-appid": "Bot ନାମ \"$1\"ବୈଧ ନୁହେଁ।",
+       "botpasswords-insert-failed": "Bot ନାମ \"$1\" ଯୋଗ କରାଯାଇ ପାରିଲା ନାହିଁ। ଏହା ଆଗରୁ ଯୋଗ ହେଇଥିଲା କି?",
+       "botpasswords-update-failed": "ବୋଟ ନାମ \"$1\" ଅଧୁନାତନ ହେଇପାରିଲା ନାହିଁ। ଏହା ଲିଭାଇ ଦିଆଯାଇଥିଲା କି ?",
+       "botpasswords-created-title": "Bot ପାସୱାର୍ଡ ତିଆରି ହେଲା",
+       "botpasswords-deleted-title": "Bot ପାସୱାର୍ଡ ଲିଭାଇ ଦିଆଗଲା",
+       "botpasswords-deleted-body": "ବ୍ୟବହାରକାରୀ \"$2\" ଙ୍କ bot ନାମ \"$1\"ରେ ଥିବା ପାସୱାର୍ଡ କୁ ଲିଭାଇ ଦିଆଗଲା।",
+       "botpasswords-not-exist": "ବ୍ୟବହାରକାରୀ \"$1\" ଙ୍କ \"$2\" ନାମକ bot ପାସୱାର୍ଡ ନାହିଁ।",
        "resetpass_forbidden": "ପାସୱାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ",
+       "resetpass_forbidden-reason": " ପାସୱାର୍ଡମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ:$1",
        "resetpass-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "resetpass-submit-loggedin": "ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ",
        "resetpass-submit-cancel": "ନାକଚ",
        "passwordreset-emailtext-user": "$1 ନାମକ ସଭ୍ୟଜଣକ {{SITENAME}}ରେ {{SITENAME}} ($4) ପାଇଁ ଆପଣଙ୍କ ପାସ ୱାର୍ଡ଼ ରିସେଟ କରିବାର ଅନୁରୋଧ କରିଛନ୍ତି । ତଳ {{PLURAL:$3|ଖାତାଟି|ଖାତାମାନ}} ଉକ୍ତ ଇମେଲ ସହିତ ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧଟି କରିଥାନ୍ତି କିମ୍ବା ଆପଣଙ୍କର ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଗଲା ତେବେ ଆପଣଙ୍କୁ ଆଉ ପାସୱାର୍ଡ଼ ବଦଳାଇବାର ଆବଶ୍ୟକତା ନାହିଁ । ଆପଣ ଏହି ମେସେଜଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରୁଥାନ୍ତୁ ।",
        "passwordreset-emailelement": "ଇଉଜର ନାମ: \n$1\n\nଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼: \n$2",
        "passwordreset-emailsentemail": "ଏକ ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲ ପଠାଇଦିଆଯାଇଅଛି ।",
+       "passwordreset-emailsentusername": "ଯଦି ଏହି ବ୍ୟବହାରକାରୀନାମ ସହିତ ଇମେଲ ଠିକଣା ସଂଯୁକ୍ତ ଥାଏ, ତେବେ ଏକ ପାସୱାର୍ଡ ପୁନଃସ୍ଥାପନ ଇମେଲ ପଠାଯିବ।",
+       "passwordreset-invalidemail": "ଅଯୋଗ୍ୟ ଇମେଲ ଠିକଣା",
+       "passwordreset-nodata": "ବ୍ୟବହାରକାରୀନାମ ବା ଏକ ଇମେଲ ଦିଆ ଯାଇନଥିଲା",
        "changeemail": "ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ କିମ୍ବା କାଢିବେ",
-       "changeemail-header": "à¬\96ାତା à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬¬à¬¦à¬³à¬¾à¬\87ବà­\87",
+       "changeemail-header": "à¬\87ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬¬à¬¦à¬³à¬¾à¬\87ବା à¬ªà¬¾à¬\87à¬\81 à¬\8fହି à¬«à¬°à­\8dମ à¬­à¬°à¬¨à­\8dତà­\81। à¬¯à¬¦à¬¿ à¬\86ପଣ à¬¨à¬¿à¬\9cର à¬\96ାତା à¬°à­\81 à¬\95à­\8cଣଶି à¬\87ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬° à¬¸à¬\82ଯà­\8bà¬\97  à¬¹à¬\9fାà¬\87ବାà¬\95à­\81 à¬\9aାହିà¬\81ବà­\87,ଫରà­\8dମ à¬¦à¬¾à¬\96ଲ à¬\95ଲାବà­\87ଳà­\87 à¬¨à­\82ତନ à¬\87ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬\95à­\81 à¬\96ାଲି à¬°à¬\96ନà­\8dତà­\81।",
        "changeemail-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "changeemail-oldemail": "ଏବେର ଇ-ମେଲ ଠିକଣା:",
        "changeemail-newemail": "ନୂଆ ଇ-ମେଲ ଠିକଣା:",
        "sig_tip": "ସମୟ ସହ ଆପଣଙ୍କ ସନ୍ତକ",
        "hr_tip": "ସମାନ୍ତରାଳ ରେଖା (ବେଳେବେଳେ ବ୍ୟବହାର କରିବେ)",
        "summary": "ସାରକଥା:",
-       "subject": "ବିଷୟ/ଶିରୋନାମା",
+       "subject": "ବିଷୟ:",
        "minoredit": "ଏହା ଏକ ସାମାନ୍ୟ ସମ୍ପାଦନା",
        "watchthis": "ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ",
        "savearticle": "ସାଇତିବେ [Save]",
        "savechanges": "ସାଇତିବେ [Save]",
+       "publishpage": "ପୃଷ୍ଠା ପ୍ରକାଶ କରନ୍ତୁ",
+       "publishchanges": "ବଦଳଗୁଡିକ ପ୍ରକାଶ କରନ୍ତୁ",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
        "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "uploaddisabledtext": "ଫାଇଲ ଅପଲୋଡ଼  ଅଚଳ କରାଯାଇଅଛି ।",
        "php-uploaddisabledtext": "PHPରେ ଫାଇଲ ଅପଲୋଡ଼କୁ ଅଚଳ କରାଯାଇଅଛି ।\nଦୟାକରି ଫାଇଲ_ଅପଲୋଡ଼ ସଜାଣିକୁ ପରଖି ନିଅନ୍ତୁ ।",
        "uploadscripted": "ଏହି ଫାଇଲଟିରେ HTML ବା ସ୍କ୍ରିପ୍ଟ କୋଡ଼ ଥିବାରୁ ଏକ ବେବ ବ୍ରାଉଜରରେ ଅଲଗା ରଖିବେ ।",
-       "uploadscriptednamespace": "ଏହି SVG ଫାଇଲରେ ଏକ ଅନୀତିକର ନେମସ୍ପେସ \"$1\" ରହିଛି ।",
+       "uploadscriptednamespace": "ଏହି SVG ଫାଇଲରେ ଏକ ଅନୀତିକର ନେମସ୍ପେସ \"<nowiki>$1</nowiki>\" ରହିଛି ।",
        "uploadinvalidxml": "ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲରେ XML ପାର୍ସ ହୋଇପାରିବ ନାହିଁ ।",
        "uploadvirus": "ଏହି ଫାଇଲଟିରେ ଏକ ଭାଇରସ ରହିଅଛି!\nସବିଶେଷ: $1",
        "uploadjava": "ଏହି ଫାଇଲଟି ଏକ ZIP ଫାଇଲ ଯେଉଁଥିରେ Java .class ଫାଇଲ ଅଛି ।\nJava ଫାଇଲ ଅପଲୋଡ଼ କରିବା ଅନୁମୋଦିତ ନୁହେଁ କାରଣ ସେସବୁ ସୁରକ୍ଷା ବଳୟକୁ ନଷ୍ଟ କରିଦିଅନ୍ତି ।",
        "feedback-thanks-title": "ସାଧୁବାଦ!",
        "searchsuggest-search": "ଖୋଜନ୍ତୁ",
        "searchsuggest-containing": "ଖୋଜୁଛି...",
-       "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
        "api-error-badtoken": "ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।",
-       "api-error-copyuploaddisabled": "URL ଦେଇ ଅପଲୋଡ଼ କରିବା ଏହି ସର୍ଭରରେ ଅଚଳ କରାଯାଇଅଛି ।",
-       "api-error-duplicate": "ଏହି ସାଇଟରେ ସେହି ଏକା ତଥ୍ୟ ଥିବା {{PLURAL:$1| ଆଉ ଏକ ଫାଇଲ ରହିଅଛି|ଆଉ କିଛି ଫାଇଲ ରହି ଅଛନ୍ତି}} ।",
-       "api-error-duplicate-archive": "ସେହି ସାଇଟରେ ସେହି ଏକା ଭିତର ଭାଗ ସହିତ ଆଗରୁ {{PLURAL:$1|ଆଉ ଫାଇଲଟିଏ ଥିଲା|ଆଉ କେତେକ ଫାଇଲ ଥିଲା}}, କିନ୍ତୁ {{PLURAL:$1|ତାହାକୁ|ସେସବୁକୁ}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।",
-       "api-error-empty-file": "ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ଖାଲି ଅଟେ ।",
        "api-error-emptypage": "ନୂଆ, ଖାଲି ପୃଷ୍ଠ ତିଆରି କରିବାର ଅନୁମତି ନାହି ।",
-       "api-error-fetchfileerror": "ଭିତର ଅସୁବିଧା: ଏହି ଫାଇଲଟି ପାଖରେ ପହଞ୍ଚିବା ବେଳେ କିଛି ଅସୁବିଧା ହେଲା ।",
-       "api-error-fileexists-forbidden": "\"$1\" ନାମରେ ଗୋଟିଏ ଫାଇଲ ଆଗରୁ ଅଛି, ଏବଂ ଏହା ଉପରେ ଲେଖି ହେବନି ।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" ନାମରେ ଗୋଟିଏ ଫାଇଲ ବଣ୍ଟାଯାଇଥିବା ସାଇତାଗୃହରେ ଅଛି, ଏବଂ ଏହା ବାଲାଯାଇପାରିବ ନାହିଁ ।",
-       "api-error-file-too-large": "ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ବିରାଟ ଅଟେ ।",
-       "api-error-filename-tooshort": "ଫାଇଲ ନାମଟି ଖୁବ ଛୋଟ ।",
-       "api-error-filetype-banned": "ଏହି ପ୍ରକାରର ଫାଇଲ ବାରଣ କରାଯାଇଅଛି ।",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ଏକ ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର ନୁହେଁ|ମାନ ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର ନୁହଁନ୍ତି}} ।\nଅନୁମୋଦିତ {{PLURAL:$3|ଫାଇଲ ପ୍ରକାର ହେଲା|ଫାଇଲଗୁଡିକର ପ୍ରକାର ହେଲା}} $2 ।",
-       "api-error-filetype-missing": "ଫାଇଲଟିର ଏକ୍ସଟେନସନ ନାହିଁ ।",
-       "api-error-hookaborted": "ଏକ ଏକ୍ସଟେନସନ ହୁକ ଦେଇ ଆପଣ କରୁଥିବା ବଦଳଟି ବନ୍ଦ କରିଦିଆଗଲା ।",
-       "api-error-http": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ସହ ଯୋଡ଼ି ହେଉନାହିଁ ।",
-       "api-error-illegal-filename": "ଏହି ଫାଇଲ ନାମଟି ଅନୁମୋଦିତ ନୁହେଁ ।",
-       "api-error-internal-error": "ଆଭ୍ୟନ୍ତରୀଣ ଅସୁବିଧା: ଏହି ଉଇକିରେ ଆପଣଙ୍କ ଅପଲୋଡ଼ କରିବା କାଳରେ କିଛି ଅସୁବିଧା ଘଟିଲା ।",
-       "api-error-invalid-file-key": "ଭିତର ଅସୁବିଧା: ଫାଇଲଟି ଅସ୍ଥାୟୀ ସାଇତାଘର ଭିତରୁ ମିଳିଲାନାହିଁ ।",
-       "api-error-missingparam": "ଭିତର ଅସୁବିଧା: ହଜିଯାଇଥିବା ପାରାମିଟର ସବୁକୁ ଅନୁରୋଧ କ୍ରମେ ଦେଖାଇଦିଆଗଲା ।",
-       "api-error-missingresult": "ଭିତର ଅସୁବିଧା: ନକଲ କରିବା ଠିକରେ ହେଲାକି ନାହିଁ  ଜାଣି ପାରିଲା ନାହିଁ ।",
-       "api-error-mustbeloggedin": "ଫାଇଲ ଅପଲୋଡ଼ କରିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
-       "api-error-mustbeposted": "ଭିତର ଅସୁବିଧା: କରାଯାଇଥିବା ଅନୁରୋଧ ପାଇଁ HTTP POST ଦରକାର ।",
-       "api-error-noimageinfo": "ଅପଲୋଡ଼ ସଫଳ ହେଲା, କିନ୍ତୁ ସର୍ଭରଟି ଆମ୍ଭଙ୍କୁ ଫାଇଲଟୀ ବାବଦରେ କିଛି ବିବରଣୀ ଦେଲା ନାହିଁ ।",
-       "api-error-nomodule": "ଭିତର ଅସୁବିଧା: ଅପଲୋଡ଼ ମୋଡୁଲ ଠିକ କରାଯାଇନାହିଁ ।",
-       "api-error-ok-but-empty": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଠାରୁ କିଛି ଖବର ନାହିଁ ।",
-       "api-error-overwrite": "ଆଗରୁଥିବା ଏକ ଫାଇଲ ଉପରେ ମଡ଼ାଇବା ଅନୁମୋଦିତ ନୁହେଁ ।",
-       "api-error-stashfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ସାଇତି ପାରିଲା ନାହିଁ ।",
        "api-error-publishfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ପ୍ରକାଶ କରିପାରିଲା ନାହିଁ ।",
-       "api-error-stasherror": "ଫାଇଲଟିକୁ ଷ୍ଟାସରେ ଅପଲୋଡ଼ କଲାବେଳେ ତ୍ରୁଟିଟିଏ ପରିଲକ୍ଷିତ ହେଲା ।",
-       "api-error-timeout": "ସର୍ଭର ଏକ ସୀମିତ କାଳ ଭିତରେ ଉତ୍ତର ଦେଲାନାହିଁ ।",
-       "api-error-unclassified": "ଏକ ଅଜଣା ଅସୁବିଧା ଘଟିଲା ।",
-       "api-error-unknown-code": "ଅଜଣା ତୃଟି: \"$1\"",
-       "api-error-unknown-error": "ଆଭ୍ୟନ୍ତରୀଣ ଅସୁବିଧା: ଫାଇଲଟି ଅପଲୋଡ଼ କରିବା କାଳରେ କିଛି ଅସୁବିଧା ଘଟିଲା ।",
+       "api-error-stashfailed": "ଭିତର ଅସୁବିଧା: ସର୍ଭର ଅସ୍ଥାୟୀ ଫାଇଲକୁ ସାଇତି ପାରିଲା ନାହିଁ ।",
        "api-error-unknown-warning": "ଅଜଣା ଚେତାବନୀ: $1",
        "api-error-unknownerror": "ଅଜଣା ତୃଟି: \"$1\"",
-       "api-error-uploaddisabled": "ଉଇକିରେ ଅପଲୋଡ଼ କରିବା ଅଚଳ କରାଯାଇଅଛି ।",
-       "api-error-verification-error": "ଏହି ଫାଇଲଟି ବୋଧ ହୁଏ ନଷ୍ଟ ହୋଇଯାଇଅଛି କିମ୍ବା ଭୁଲ ଏକ୍ସଟେନସନ ଦିଆଯାଇଅଛି ।",
        "duration-seconds": "$1 {{PLURAL:$1|ସେକଣ୍ଡ|ସେକେଣ୍ଡ}}",
        "duration-minutes": "$1 {{PLURAL:$1|ମିନିଟ|ମିନିଟ}}",
        "duration-hours": "$1 {{PLURAL:$1|ଘଣ୍ଟା|ଘଣ୍ଟା}}",
index 9c135cb..7171bae 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Macofe",
                        "ਪ੍ਰਚਾਰਕ",
-                       "Tow"
+                       "Tow",
+                       "Sony dandiwal"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
        "sort-descending": "ਘਟਦਾ ਕ੍ਰਮ",
        "sort-ascending": "ਵਧਦਾ ਕ੍ਰਮ",
        "nstab-main": "ਸਫ਼ਾ",
-       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨µà¨°à¨\95ਾ",
+       "nstab-user": "ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¸à¨«à¨¼ਾ",
        "nstab-media": "ਮੀਡੀਆ ਸਫ਼ਾ",
        "nstab-special": "ਖ਼ਾਸ ਸਫ਼ਾ",
        "nstab-project": "ਪਰੋਜੈਕਟ ਸਫ਼ਾ",
        "savechanges": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ",
        "preview": "ਝਲਕ",
        "showpreview": "ਝਲਕ ਵਿਖਾਓ",
-       "showdiff": "ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\89",
+       "showdiff": "ਤਬਦà©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\93",
        "anoneditwarning": "'''ਖ਼ਬਰਦਾਰ:''' ਤੁਸੀਂ ਦਾਖ਼ਲ ਨਹੀਂ ਹੋ। ਕੋਈ ਵੀ ਸੋਧ ਕਰਨ 'ਤੇ ਤੁਹਾਡਾ ਆਈ.ਪੀ. ਪਤਾ ਲੋਕਾਂ ਨੂੰ ਵਿਖਾਈ ਦੇਵੇਗਾ। ਜੇਕਰ ਤੁਸੀਂ <strong>[$1 ਦਾਖ਼ਲ ਹੁੰਦੇ ਹੋ]</strong> ਜਾਂ <strong>[$2 ਖਾਤਾ ਬਣਾਉਂਦੇ ਹੋ]</strong> ਤਾਂ ਤੁਹਾਡੀਆਂ ਸੋਧਾਂ ਦਾ ਸਿਹਰਾ, ਹੋਰ ਫ਼ਾਇਦਿਆਂ ਸਮੇਤ, ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਸਿਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।",
        "anonpreviewwarning": "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
        "missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
        "nosuchsectiontitle": "ਭਾਗ ਲੱਭ ਨਹੀਂ ਰਿਹਾ",
        "nosuchsectiontext": "ਤੁਸੀਂ ਨਾ-ਮੌਜੂਦ ਭਾਗ ਨੂੰ ਸੋਧਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੈ।\nਸ਼ਾਇਦ ਤੁਹਾਡੇ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੇ ਦੌਰਾਨ ਇਹ ਮਿਟਾਇਆ ਜਾਂ ਇਸਦਾ ਸਿਰਲੇਖ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।",
        "loginreqtitle": "ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ",
-       "loginreqlink": "ਦਾਖਲ",
+       "loginreqlink": "ਦਾà¨\96਼ਲ",
        "loginreqpagetext": "ਹੋਰ ਸਫ਼ੇ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।",
        "accmailtitle": "ਪਾਸਵਰਡ ਭੇਜਿਆ।",
        "accmailtext": "[[User talk:$1|$1]] ਲਈ ਰਲ਼ਵੇਂ ਤੌਰ ’ਤੇ ਬਣਿਆ ਪਾਸਵਰਡ $2 ਨੂੰ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।\nਇਸ ਨਵੇਂ ਖਾਤੇ ਲਈ ਲਾਗਇਨ ਕਰਨ ਤੋਂ ਬਾਅਦ ''[[Special:ChangePassword|ਪਾਸਵਰਡ ਬਦਲੋ]]'' ’ਤੇ ਜਾ ਕੇ ਪਾਸਵਰਡ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
        "saveprefs": "ਸੰਭਾਲੋ",
        "restoreprefs": "ਸਾਰੀਆਂ ਮੂਲ ਸੈਟਿੰਗਾਂ ਬਹਾਲ ਕਰੋ (ਸਾਰੇ ਹਿੱਸਿਆਂ ਵਿੱਚ)",
        "prefs-editing": "ਸੋਧ ਜਾਰੀ",
-       "rows": "ਕਤਾਰਾਂ:",
-       "columns": "ਕਾਲਮ:",
        "searchresultshead": "ਖੋਜ",
        "stub-threshold-sample-link": "ਨਮੂਨਾ",
        "stub-threshold-disabled": "ਬੰਦ ਹੈ",
        "right-upload_by_url": "URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ",
        "right-autoconfirmed": "ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ",
        "right-bot": "ਇੱਕ ਸਵੈ-ਚਾਲਤ ਅਮਲ ਵਜੋਂ ਗਿਣਿਆ ਜਾਣਾ",
-       "right-writeapi": "ਲਿਖਾਈ ਏਪੀਆਈ ਦੀ ਵਰਤੋੰ",
+       "right-writeapi": "ਲਿਖਾਈ API ਵਰਤੋ",
        "right-delete": "ਸਫ਼ੇ ਹਟਾਓ",
        "right-bigdelete": "ਵੱਡੇ ਅਤੀਤ ਵਾਲੇ ਪੰਨੇ ਮਿਟਾਉਣੇ",
        "right-browsearchive": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ",
        "recentchanges-legend-plusminus": "(''±੧੨੩'')",
        "recentchanges-submit": "ਦਿਖਾਓ",
        "rcnotefrom": "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੇ) ਬਦਲਾਵ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
-       "rclistfrom": "$3 $2 ਤੋਂ ਸ਼ੁਰੂ ਕਰਕੇ ਨਵੀਆਂ ਸੋਧਾਂ ਵਖਾਓ",
+       "rclistfrom": "$3 $2 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨µà¨¿à¨\96ਾà¨\93",
        "rcshowhideminor": "ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ $1",
        "rcshowhideminor-show": "ਵੇਖੋ",
        "rcshowhideminor-hide": "ਓਹਲੇ",
        "rcshowhidemine-hide": "ਓਹਲੇ",
        "rcshowhidecategorization-show": "ਦਿਖਾਓ",
        "rcshowhidecategorization-hide": "ਲੁਕਾਉ",
-       "rclinks": "ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿੱਚ ਹੋਈਆਂ $1 ਤਬਦੀਲੀਆਂ ਵਖਾਓ<br /> $3",
+       "rclinks": "ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 $1 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\93<br /> $3",
        "diff": "ਫ਼ਰਕ",
        "hist": "ਅਤੀਤ",
        "hide": "ਲੁਕਾਓ",
        "uploaddisabled": "ਅੱਪਲੋਡ ਆਯੋਗ ਹੈ",
        "copyuploaddisabled": "URL ਰਾਹੀਂ ਅੱਪਲੋਡ ਰੋਕੇ ਹੋਏ ਹਨ।",
        "uploaddisabledtext": "ਫ਼ਾਈਲਾਂ ਦੇ ਅੱਪਲੋਡ ਰੋਕੇ ਹੋਏ ਹਨ।",
-       "uploadscriptednamespace": "ਇਸ ਐੱਸ.ਵੀ.ਜੀ. ਫ਼ਾਈਲ ਵਿੱਚ ਇੱਕ ਗ਼ੈਰ-ਕਨੂੰਨੀ ਨਾਂ-ਥਾਂ \"$1\" ਹੈ।",
+       "uploadscriptednamespace": "ਇਸ ਐੱਸ.ਵੀ.ਜੀ. ਫ਼ਾਈਲ ਵਿੱਚ ਇੱਕ ਗ਼ੈਰ-ਕਨੂੰਨੀ ਨਾਂ-ਥਾਂ \"<nowiki>$1</nowiki>\" ਹੈ।",
        "uploadvirus": "ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1",
        "upload-source": "ਸਰੋਤ ਫਾਇਲ",
        "sourcefilename": "ਸੋਰਸ ਫਾਇਲ ਨਾਂ:",
        "tooltip-ca-talk": "ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ",
        "tooltip-ca-edit": "ਇਹ ਸਫ਼ਾ ਸੋਧੋ",
        "tooltip-ca-addsection": "ਨਵਾਂ ਭਾਗ ਸ਼ੁਰੂ ਕਰੋ",
-       "tooltip-ca-viewsource": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¸à©\81ਰੱà¨\96ਿà¨\85ਤ à¨¹à©\88।\nਤà©\81ਸà©\80à¨\82 à¨\87ਹਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।",
+       "tooltip-ca-viewsource": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¸à©\81ਰੱà¨\96ਿà¨\85ਤ à¨¹à©\88।\nਤà©\81ਸà©\80à¨\82 à¨\87ਸਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।",
        "tooltip-ca-history": "ਇਸ ਸਫ਼ੇ ਦੇ ਪਿਛਲੇ ਰੀਵਿਜਨ",
        "tooltip-ca-protect": "ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਕਰੋ",
        "tooltip-ca-unprotect": "ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ",
        "tooltip-minoredit": "ਇਸ ’ਤੇ ਬਤੌਰ ਛੋਟੀ ਤਬਦੀਲੀ ਨਿਸ਼ਾਨ ਲਾਓ",
        "tooltip-save": "ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ",
        "tooltip-preview": "ਆਪਣੀ ਤਬਦੀਲੀ ਦੀ ਝਲਕ ਵੇਖੋ, ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ!",
-       "tooltip-diff": "ਤੁਹਾਡੇ ਵੱਲੋਂ ਲਿਖਤ ਵਿੱਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਵਖਾਉਂਦਾ ਹੈ",
+       "tooltip-diff": "ਤà©\81ਹਾਡà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨²à¨¿à¨\96ਤ à¨µà¨¿à©±à¨\9a à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à¨\96ਾà¨\89à¨\82ਦਾ à¨¹à©\88",
        "tooltip-compareselectedversions": "ਇਸ ਸਫ਼ੇ ਦੀਆਂ ਦੋ ਚੁਣੀਆਂ ਹੋਈਆਂ ਸੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਵੇਖੋ",
        "tooltip-watch": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ",
        "tooltip-watchlistedit-normal-submit": "ਸਿਰਲੇਖ ਹਟਾਓ",
        "file-info-size": "$1 × $2 ਪਿਕਸਲ, ਫ਼ਾਈਲ ਅਕਾਰ: $3, MIME ਕਿਸਮ: $4",
        "file-nohires": "ਇਸ ਤੋਂ ਵੱਡੀ ਤਸਵੀਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "svg-long-desc": "SVG ਫ਼ਾਈਲ, ਆਮ ਤੌਰ ’ਤੇ $1 × $2 ਪਿਕਸਲ, ਫ਼ਾਈਲ ਦਾ ਅਕਾਰ: $3",
-       "show-big-image": "ਅਸਲ ਫਾਈਲ",
+       "show-big-image": "à¨\85ਸਲ à¨«à¨¼à¨¾à¨\88ਲ",
        "show-big-image-preview": "ਇਸ ਝਾਤ ਦਾ ਅਕਾਰ: $1.",
        "show-big-image-other": "ਹੋਰ {{PLURAL:$2|ਰੈਜ਼ੋਲਿਊਸ਼ਨ|ਰੈਜ਼ੋਲਿਊਸ਼ਨਜ਼}}: $1.",
        "show-big-image-size": "$1 × $2 ਪਿਕਸਲ",
        "feedback-thanks-title": "ਧੰਨਵਾਦ!",
        "feedback-useragent": "ਉਪਭੋਗੀ ਏਜੰਟ:",
        "searchsuggest-search": "ਖੋਜ {{SITENAME}}",
-       "api-error-badaccess-groups": "ਤੁਹਾਨੂੰ ਇਸ ਵਿਕੀ ਉੱਤੇ ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "api-error-badtoken": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਗ਼ਲਤ ਟੋਕਨ",
-       "api-error-empty-file": "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੀ ਫ਼ਾਈਲ ਖ਼ਾਲੀ ਸੀ।",
        "api-error-emptypage": "ਨਵੇਂ, ਖ਼ਾਲੀ ਸਫ਼ੇ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
-       "api-error-file-too-large": "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੀ ਫ਼ਾਈਲ ਬਹੁਤ ਵੱਡੀ ਸੀ।",
-       "api-error-filename-tooshort": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ ਬਹੁਤ ਛੋਟਾ ਹੈ।",
-       "api-error-filetype-banned": "ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਦੀ ਮਨਾਹੀ ਹੈ।",
-       "api-error-filetype-missing": "ਇਸ ਫ਼ਾਈਲ ਨਾਂ ਵਿਚ ਐਕਸਟੈਂਸ਼ਨ ਨਹੀਂ ਹੈ।",
-       "api-error-http": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਸਰਵਰ ਨਾਲ਼ ਰਾਬਤਾ ਨਹੀਂ ਹੋ ਰਿਹਾ",
-       "api-error-illegal-filename": "ਇਸ ਫ਼ਾਈਲ-ਨਾਂ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
-       "api-error-mustbeloggedin": "ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਤੁਹਾਡਾ ਦਾਖ਼ਲ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।",
-       "api-error-mustbeposted": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਬੇਨਤੀ ਲਈ HTTP POST ਲੋੜੀਂਦੀ ਹੈ।",
-       "api-error-noimageinfo": "ਅੱਪਲੋਡ ਸਫਲ਼ ਹੋਇਆ ਪਰ ਸਰਵਰ ਨੇ ਇਸ ਫ਼ਾਈਲ ਬਾਰੇ ਸਾਨੂੰ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦਿੱਤੀ।",
-       "api-error-nomodule": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਕੋਈ ਅੱਪਲੋਡ ਮਾਪਦੰਡ ਨਹੀਂ ਰੱਖਿਆ ਗਿਆ।",
-       "api-error-ok-but-empty": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਸਰਵਰ ਵੱਲੋਂ ਕੋਈ ਜੁਆਬ ਨਹੀਂ।",
-       "api-error-stashfailed": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਸਰਵਰ ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਦਾ ਨੂੰ ਸਾਂਭ ਨਾ ਸਕਿਆ।",
        "api-error-publishfailed": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਸਰਵਰ ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਦਾ ਪ੍ਰਕਾਸ਼ਨ ਨਾ ਕਰ ਸਕਿਆ।",
-       "api-error-timeout": "ਸਰਵਰ ਨੇ ਉਮੀਦ ਦੇ ਸਮੇਂ ਦੇ ਵਿਚ-ਵਿਚ ਕੋਈ ਜੁਆਬ ਨਹੀਂ ਦਿੱਤਾ।",
-       "api-error-unclassified": "ਅਣਪਛਾਤਾ ਦੋਸ਼ ਆਇਆ ਹੈ।",
-       "api-error-unknown-code": "ਅਣਪਛਾਤਾ ਦੋਸ਼: \"$1\"",
-       "api-error-unknown-error": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਤੁਹਾਡੀ ਫ਼ਾਈਲ ਅੱਪਲੋਡ ਕਰਦੇ ਵਕਤ ਕੁਝ ਗੜਬੜ ਹੋ ਗਈ।",
+       "api-error-stashfailed": "ਅੰਦਰੂਨੀ ਦੋਸ਼:ਸਰਵਰ ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਦਾ ਨੂੰ ਸਾਂਭ ਨਾ ਸਕਿਆ।",
        "api-error-unknown-warning": "ਅਣਪਛਾਤੀ ਚਿਤਾਵਨੀ: \"$1\".",
        "api-error-unknownerror": "ਅਣਪਛਾਤਾ ਦੋਸ਼: \"$1\".",
-       "api-error-uploaddisabled": "ਇਸ ਵਿਕੀ ਉੱਤੇ ਅੱਪਲੋਡ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।",
-       "api-error-verification-error": "ਸ਼ਾਇਦ ਇਹ ਫ਼ਾਈਲ ਖ਼ਰਾਬ ਹੈ ਜਾਂ ਇਹਦੀ ਐਕਸਟੈਂਸ਼ਨ ਗ਼ਲਤ ਹੈ।",
        "duration-seconds": "$1 {{PLURAL:$1|ਸਕਿੰਟ}}",
        "duration-minutes": "$1 {{PLURAL:$1|ਮਿੰਟ}}",
        "duration-hours": "$1 {{PLURAL:$1|ਘੰਟਾ |ਘੰਟੇ }}",
index 4016aac..9d164db 100644 (file)
@@ -85,7 +85,8 @@
                        "Mateuszek045",
                        "Sethakill",
                        "Mateon1",
-                       "Jdx"
+                       "Jdx",
+                       "Kirsan"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "policy-url": "Project:Zasady",
        "portal": "Portal społeczności",
        "portal-url": "Project:Portal społeczności",
-       "privacy": "Zasady zachowania poufności",
-       "privacypage": "Project:Zasady zachowania poufności",
+       "privacy": "Polityka ochrony prywatności",
+       "privacypage": "Project:Polityka ochrony prywatności",
        "badaccess": "Błąd uprawnień",
        "badaccess-group0": "Nie masz uprawnień wymaganych do wykonania tej operacji.",
        "badaccess-groups": "Wykonywanie tej operacji zostało ograniczone do użytkowników w {{PLURAL:$2|grupie|jednej z grup:}} $1.",
        "botpasswords-label-delete": "Usuń",
        "botpasswords-label-resetpassword": "Zresetuj hasło",
        "botpasswords-label-grants": "Zastosowane uprawnienia:",
+       "botpasswords-help-grants": "Nadawane uprawnienia upoważniają do działań, które możesz już obecnie wykonywać. Wyrażenie zgody tutaj nie daje dostępu do nowych uprawnień. Zobacz [[Special:ListGrants|tabelę uprawnień]], aby uzyskać więcej informacji.",
        "botpasswords-label-grants-column": "Przyznane",
        "botpasswords-bad-appid": "Nazwa bota \"$1\" nie jest prawidłowa.",
        "botpasswords-insert-failed": "Nie udało się dodać robota o nazwie \"$1\". Czy był już wcześniej dodany?",
        "passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-nocaller": "Musi być podany wywołujący",
        "passwordreset-nosuchcaller": "Wywołujący nie istnieje: $1",
+       "passwordreset-ignored": "Zresetowanie hasła nie powiodło się. Może żaden dostawca nie został skonfigurowany?",
        "passwordreset-invalidemail": "Nieprawidłowy adres e-mail",
        "passwordreset-nodata": "Nie podano ani nazwy użytkownika, ani adresu e-mail",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
        "selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „{{int:savearticle}}”, przekierowanie zostanie utworzone.",
        "missingcommenttext": "Wprowadź komentarz poniżej.",
        "missingcommentheader": "<strong>Uwaga:</strong> treść tytułu komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}”, zmiany zostaną zapisane bez niego.",
-       "summary-preview": "Podgląd opisu:",
+       "summary-preview": "Podgląd opisu zmian:",
        "subject-preview": "Podgląd tematu:",
        "previewerrortext": "Wystąpił błąd podczas próby podglądu Twoich zmian.",
        "blockedtitle": "Użytkownik jest zablokowany",
        "mergehistory-fail-no-change": "Łączenie historii nie połączyło żadnych wersji. Proszę ponownie sprawdzić stronę i parametry czasowe.",
        "mergehistory-fail-permission": "Brak uprawnień, aby połączyć historię.",
        "mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.",
+       "mergehistory-fail-timestamps-overlap": "Wersje źródłowe pokrywają się lub są późniejsze niż wersja docelowa.",
        "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
        "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
        "mergehistory-no-destination": "Strona docelowa $1 nie istnieje.",
        "search-interwiki-caption": "Projekty siostrzane",
        "search-interwiki-default": "Wyniki od $1:",
        "search-interwiki-more": "(więcej)",
+       "search-interwiki-more-results": "Więcej wyników",
        "search-relatedarticle": "Pokrewne",
        "searchrelated": "pokrewne",
        "searchall": "wszystkie",
        "youremail": "Twój adres e‐mail:",
        "username": "{{GENDER:$1|Nazwa użytkownika}}:",
        "prefs-memberingroups": "{{GENDER:$2|Członek}} {{PLURAL:$1|grupy|grup}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Data rejestracji:",
        "yourrealname": "Imię i nazwisko:",
        "yourlanguage": "Język interfejsu:",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
        "editusergroup": "Wczytaj grupy użytkownika",
        "editinguser": "Zmiana uprawnień {{GENDER:$1|użytkownika|użytkowniczki}} <strong>[[User:$1|$1]]</strong> $2",
-       "viewinguserrights": "Przeglądanie grup do których należy {{GENDER:$1|użytkownik|użytkowniczka}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Edytuj grupy użytkownika",
+       "viewinguserrights": "Przeglądanie grup, do których należy {{GENDER:$1|użytkownik|użytkowniczka}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edytuj grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "userrights-viewusergroup": "Przeglądanie grup {{GENDER:$1|użytkownika|użytkowniczki}}",
        "saveusergroups": "Zapisz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "userrights-groupsmember": "Należy do:",
        "userrights-nodatabase": "Baza danych $1 nie istnieje lub nie jest lokalna.",
        "userrights-changeable-col": "Grupy, które możesz wybrać",
        "userrights-unchangeable-col": "Grupy, których nie możesz wybrać",
+       "userrights-expiry-current": "wygasa $1",
+       "userrights-expiry-none": "Bezterminowo",
+       "userrights-expiry": "Czas wygaśnięcia:",
+       "userrights-expiry-existing": "Obecny czas wygaśnięcia: $2 o $3",
+       "userrights-expiry-othertime": "Inny termin:",
+       "userrights-expiry-options": "1 dzień:1 day,1 tydzień:1 week,1 miesiąc:1 month,3 miesiące:3 months,6 miesięcy:6 months,1 rok:1 year",
+       "userrights-invalid-expiry": "Termin przynależności do grupy „$1“ jest nieprawidłowy.",
+       "userrights-expiry-in-past": "Termin przynależności do grupy „$1“ jest z przeszłości.",
        "userrights-conflict": "Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.",
        "group": "Grupa:",
        "group-user": "Użytkownicy",
        "right-applychangetags": "Wprowadzanie [[Special:Tags|znaczników]] wraz z własnymi zmianami",
        "right-changetags": "Dodawanie i usuwanie dowolnych [[Special:Tags|znaczników]] z poszczególnych wersji i wpisów w rejestrze",
        "right-deletechangetags": "Usuwanie [[Special:Tags|znaczników]] z bazy danych",
+       "grant-generic": "zestaw uprawnień „$1“",
        "grant-group-page-interaction": "Interakcja ze stronami",
        "grant-group-file-interaction": "Interakcja z plikami multimedialnymi",
        "grant-group-watchlist-interaction": "Interakcja z listą obserwowanych",
        "grant-basic": "Podstawowe uprawnienia",
        "grant-viewdeleted": "Wyświetlanie usuniętych plików i stron",
        "grant-viewmywatchlist": "Zobacz swoją listę obserwowanych",
+       "grant-viewrestrictedlogs": "Przeglądanie zastrzeżonych wpisów w rejestrach",
        "newuserlogpage": "Nowi użytkownicy",
        "newuserlogpagetext": "To jest rejestr ostatnio utworzonych kont użytkowników",
        "rightslog": "Uprawnienia",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
        "rcfilters-activefilters": "Aktywne filtry",
+       "rcfilters-restore-default-filters": "Przywrócić 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-feedbacklink": "Podziel się swoją opinią na temat tych nowych (beta) filtrów",
+       "rcfilters-highlightbutton-title": "Podświetl wyniki",
+       "rcfilters-highlightmenu-title": "Wybierz kolor",
        "rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
        "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-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 niż Ty.",
+       "rcfilters-filter-editsbyother-description": "Edycje wykonane przez innych (nie Twoje).",
        "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko dla zarejestrowanych użytkowników)",
        "rcfilters-filter-userExpLevel-newcomer-label": "Początkujący",
        "rcfilters-filter-userExpLevel-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.",
        "rcfilters-filter-userExpLevel-learner-description": "Więcej dni aktywności i edycji niż „Nowicjusze”, ale mniej niż „Doświadczeni użytkownicy”.",
        "rcfilters-filter-userExpLevel-experienced-label": "Doświadczeni użytkownicy",
        "rcfilters-filter-userExpLevel-experienced-description": "Ponad 30 dni aktywności i 500 edycji.",
+       "rcfilters-filtergroup-automated": "Zmiany zautomatyzowane",
        "rcfilters-filter-bots-label": "Bot",
+       "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-significance": "Znaczenie",
        "rcfilters-filter-minor-label": "Drobne zmiany",
+       "rcfilters-filter-minor-description": "Zmiany, które autor oznaczył jako drobne.",
+       "rcfilters-filter-major-label": "Zmiany nie oznaczone jako drobne",
+       "rcfilters-filter-major-description": "Zmiany nie oznaczone jako drobne.",
+       "rcfilters-filtergroup-changetype": "Rodzaj zmiany",
        "rcfilters-filter-pageedits-label": "Edycje strony",
+       "rcfilters-filter-pageedits-description": "Edycje treści, stron dyskusji, opisów kategorii...",
+       "rcfilters-filter-newpages-label": "Tworzenie stron",
+       "rcfilters-filter-newpages-description": "Zmiany prowadzące do utworzenia nowych stron.",
+       "rcfilters-filter-categorization-label": "Zmiany kategorii",
+       "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...",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "uploaded-setting-handler-svg": "SVG ustawiające atrybut \"handler\" z zdalnymi elementami/danymi/skryptami są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
        "uploaded-remote-url-svg": "SVG, które ustawiają w dowolnym atrybucie stylu zdalne URL, są blokowane. Znaleziono <code>$1=\"$2\"</code> w przesyłanym pliku SVG.",
        "uploaded-image-filter-svg": "Znaleziono filtr obrazu zawierający URL: <code>&lt;$1 $2=\"$3\"&gt;</code> w przesyłanym pliku SVG.",
-       "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw '$1'",
+       "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw „<nowiki>$1</nowiki>”.",
        "uploadinvalidxml": "Nie udało się przeanalizować XML w załadowanym pliku.",
        "uploadvirus": "W pliku jest wirus! Szczegóły: $1",
        "uploadjava": "Ten plik zawiera deklarację klasy Java skompresowaną ZIP.\nPrzesyłanie plików Java nie jest dozwolone, ponieważ mogłoby zostać użyte do obchodzenia zabezpieczeń.",
        "zip-file-open-error": "Wystąpił błąd podczas otwierania pliku ZIP, aby go sprawdzić.",
        "zip-wrong-format": "Wybrany plik nie jest w formacie ZIP.",
        "zip-bad": "Plik ZIP jest uszkodzony lub w inny sposób niemożliwy do odczytania. \nNie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.",
-       "zip-unsupported": "Plik jest w formacie ZIP ale wykorzystuje funkcje, które nie są obsługiwane przez MediaWiki.\nPlik nie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.",
+       "zip-unsupported": "Plik jest w formacie ZIP, ale wykorzystuje funkcje, które nie są obsługiwane przez MediaWiki.\nPlik nie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.",
        "uploadstash": "Schowek z przesłanymi plikami",
        "uploadstash-summary": "Ta strona umożliwia dostęp do przesłanych lub właśnie przesyłanych plików, ale jeszcze nie opublikowanych na wiki. Pliki widzi wyłącznie użytkownik, które je przesłał.",
        "uploadstash-clear": "Wyczyść schowek z plikami",
        "uploadstash-errclear": "Czyszczenie plików nie powiodło się.",
        "uploadstash-refresh": "Odśwież listę plików",
        "uploadstash-thumbnail": "pokaż miniaturkę",
+       "uploadstash-exception": "Nie udało się zapisać przesyłanego pliku w magazynie tymczasowym ($1): „$2”.",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "img-auth-accessdenied": "Odmowa dostępu",
        "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "apisandbox-sending-request": "Wysyłanie zapytania API…",
        "apisandbox-loading-results": "Pobieranie wyników API...",
        "apisandbox-results-error": "Wystąpił błąd podczas pobierania odpowiedzi na zapytanie API: $1.",
+       "apisandbox-request-selectformat-label": "Pokaż dane z zapytania jako:",
+       "apisandbox-request-format-url-label": "zapytanie w adresie URL",
        "apisandbox-request-url-label": "URL zapytania:",
+       "apisandbox-request-json-label": "Zapytanie JSON:",
        "apisandbox-request-time": "Czas przetwarzania zapytania: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Popraw token i wyślij ponownie",
        "apisandbox-results-fixtoken-fail": "Nie udało się pobrać tokena „$1”.",
        "emailccsubject": "Kopia Twojej wiadomości do $1: $2",
        "emailsent": "Wiadomość została wysłana",
        "emailsenttext": "Twoja wiadomość została wysłana.",
-       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”. Jeśli {{GENDER:$2|Twoja}} odpowiedź na ten e-mail zostanie wysłana do {{GENDER:$1|oryginalnego nadawcy}}, wówczas {{GENDER:$2|Twój}} adres e-mail zostanie {{GENDER:$1|mu|jej}} ujawniony.",
+       "emailuserfooter": "Ten e-mail został {{GENDER:$1|wysłany}} z {{GRAMMAR:D.lp|{{SITENAME}}}} do {{GENDER:$2|$2}} przez $1 przy użyciu funkcji „{{int:emailuser}}”. Jeśli wyślesz odpowiedź na ten e-mail do {{GENDER:$1|oryginalnego nadawcy}}, wówczas {{GENDER:$2|Twój}} adres e-mail zostanie {{GENDER:$1|mu|jej}} ujawniony.",
        "usermessage-summary": "Pozostawianie komunikatu systemowego.",
        "usermessage-editor": "Nadawca komunikatów systemowych",
        "watchlist": "Obserwowane",
        "editcomment": "Edycję opisał: <em>$1</em>.",
        "revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].",
        "revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.",
-       "rollback-success": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2.",
+       "rollback-success": "Wycofano edycje {{GENDER:$3|użytkownika|użytkowniczki}} $1;\nprzywrócono ostatnią wersję autorstwa {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
        "sessionfailure-title": "Błąd sesji",
        "sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
        "tooltip-p-logo": "Strona główna",
        "tooltip-n-mainpage": "Zobacz stronę główną",
        "tooltip-n-mainpage-description": "Przejdź na stronę główną",
-       "tooltip-n-portal": "O projekcie, co możesz zrobić, gdzie możesz znaleźć informacje",
+       "tooltip-n-portal": "O projekcie - co możesz zrobić, gdzie możesz znaleźć informacje",
        "tooltip-n-currentevents": "Informacje o aktualnych wydarzeniach",
-       "tooltip-n-recentchanges": "Lista ostatnich zmian na {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
+       "tooltip-n-recentchanges": "Lista ostatnich zmian w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "tooltip-n-randompage": "Załaduj losową stronę",
-       "tooltip-n-help": "Tutaj możesz się dowiedzieć wielu rzeczy.",
+       "tooltip-n-help": "Tutaj możesz dowiedzieć się wielu rzeczy.",
        "tooltip-t-whatlinkshere": "Pokaż listę wszystkich stron linkujących do tej strony",
        "tooltip-t-recentchangeslinked": "Ostatnie zmiany w stronach, do których ta strona linkuje",
        "tooltip-feed-rss": "Kanał RSS dla tej strony",
        "confirmemail_invalidated": "Potwierdzenie adresu e‐mail zostało anulowane",
        "invalidateemail": "Anulowanie potwierdzenia adresu e‐mail",
        "notificationemail_subject_changed": "Został zmieniony zarejestrowany adres e-mail na {{SITENAME}}",
+       "notificationemail_subject_removed": "Zarejestrowany adres e-mail w {{GRAMMAR:MS.lp|SITENAME}} został usunięty",
+       "notificationemail_body_changed": "Ktoś, najprawdopodobniej Ty, z adresu IP $1,\nzmienił adres e-mail przypisany do konta „$2” na „$3” w {{GRAMMAR:MS.lp|{{SITENAME}}}}.\n\nJeżeli nie zostało to zrobione przez Ciebie, skontaktuj się niezwłocznie z administratorem.",
+       "notificationemail_body_removed": "Ktoś, najprawdopodobniej Ty, z adresu IP $1,\nusunął adres e-mail przypisany do konta „$2” w {{GRAMMAR:MS.lp|{{SITENAME}}}}.\n\nJeżeli nie zostało to zrobione przez Ciebie, skontaktuj się niezwłocznie z administratorem.",
        "scarytranscludedisabled": "[Transkluzja przez interwiki jest wyłączona]",
        "scarytranscludefailed": "[Pobranie szablonu dla $1 nie powiodło się]",
        "scarytranscludefailed-httpstatus": "[Pobranie szablonu dla $1 nie powiodło się: HTTP $2]",
        "version-software": "Zainstalowane oprogramowanie",
        "version-software-product": "Nazwa",
        "version-software-version": "Wersja",
-       "version-entrypoints": "Adres URL punktu wejścia",
+       "version-entrypoints": "Adresy URL punktów wejścia",
        "version-entrypoints-header-entrypoint": "Punkt wejścia",
        "version-entrypoints-header-url": "URL",
        "version-libraries": "Zainstalowane biblioteki",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|zmienił|zmieniła}} znaczniki we wpisie w rejestrze $5 strony $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|usunięto}} $8)",
        "rightsnone": "brak",
        "revdelete-summary": "opis zmian",
+       "rightslogentry-temporary-group": "$1 (tymczasowo, do $2)",
        "feedback-adding": "Dodawanie opinii do strony...",
        "feedback-back": "Wstecz",
        "feedback-bugcheck": "Świetnie! Tylko sprawdź, czy nie jest to jeden z już [$1 znanych błędów].",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorię...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj więcej...",
        "sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
        "sessionprovider-generic": "sesje $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesje na podstawie cookie",
        "authform-newtoken": "Brakujący token. $1",
        "authform-notoken": "Brakujący token",
        "authform-wrongtoken": "Nieprawidłowy token",
+       "specialpage-securitylevel-not-allowed-title": "Brak dostępu",
        "specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
        "authpage-cannot-login": "Nie można uruchomić logowania.",
        "authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
        "authpage-cannot-create": "Nie można rozpocząć tworzenie konta.",
        "authpage-cannot-create-continue": "Nie można kontynuować tworzenia konta. Twoja sesja najprawdopodobniej wygasła.",
+       "authpage-cannot-link": "Nie udało się rozpocząć dowiązania konta.",
        "cannotauth-not-allowed-title": "Brak dostępu",
        "cannotauth-not-allowed": "Nie masz uprawnień, aby skorzystać z tej strony",
        "changecredentials": "Zmiana poświadczeń",
        "changecredentials-submit": "Zmień poświadczenie",
+       "changecredentials-invalidsubpage": "$1 nie jest prawidłowym typem uwierzytelnienia.",
+       "changecredentials-success": "Twoje dane zostały zmienione.",
        "removecredentials": "Usuwanie poświadczeń",
        "removecredentials-submit": "Usuń poświadczenie",
+       "removecredentials-invalidsubpage": "$1 nie jest prawidłowym typem danych logowania.",
+       "removecredentials-success": "Twoje dane zostały usunięte.",
        "credentialsform-provider": "Rodzaj poświadczeń:",
        "credentialsform-account": "Nazwa konta:",
+       "cannotlink-no-provider-title": "Brak kont możliwych do przyłączenia",
+       "cannotlink-no-provider": "Brak kont możliwych do przyłączenia.",
        "linkaccounts": "Połącz konta",
        "linkaccounts-success-text": "Konto zostało połączone.",
        "linkaccounts-submit": "Połącz konta",
index fe7db17..5ac7c99 100644 (file)
        "passwordreset-emaildisabled": "Le fonsionalità ëd pòsta eletrònica a son ëstàite disativà su sta wiki.",
        "passwordreset-username": "Stranòm:",
        "passwordreset-domain": "Domini:",
-       "passwordreset-capture": "Vëdde ël mëssagi arzultant?",
-       "passwordreset-capture-help": "S'a marca costa casela, ël mëssagi ëd pòsta eletrònica (con la ciav provisòria) a-j sarà smonù e ant l'istess temp a sarà mandà a l'utent.",
        "passwordreset-email": "Adrëssa ëd pòsta eletrònica:",
        "passwordreset-emailtitle": "Detaj dël cont ansima a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quaidun (a l'é bel fé ch'a sia chiel, da l'adrëssa IP $1) a l'ha ciamà na riampostassion ëd soa ciav për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} \nassocià a st'adrëssa ëd pòsta eletrònica:\n\n$2\n\n{{PLURAL:$3|Costa ciav provisòria|Coste ciav provisòrie}} a scadran da-sì {{PLURAL:$5|un di|$5 di}}.\nA dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peule ignoré ës mëssagi e continué a dovré soa veja ciav.",
        "saveprefs": "Salvé ij sò gust",
        "restoreprefs": "Buté torna j'ampostassion dë stàndard (an tute le session)",
        "prefs-editing": "Quàder ëd modìfica dël test",
-       "rows": "Righe:",
-       "columns": "Colòne:",
        "searchresultshead": "Specifiché soe preferense d'arserca",
        "stub-threshold": "Valor mìnim për buté an forma j'anliure dë sbòss ($1):",
        "stub-threshold-sample-link": "esempi",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "A l'ha pa ij përmess dont a fa da manca për podèj cambieje ij drit a dj'utent ansima a dj'àutre wiki.",
        "userrights-nodatabase": "La base ëd dat $1 a-i é pa, ò pura a l'é nen local.",
-       "userrights-nologin": "A l'ha da [[Special:UserLogin|rintré ant ël sistema]] con un cont da aministrator për podej-je dé dij drit a j'utent.",
-       "userrights-notallowed": "Chiel a l'ha pa ij përmess për dé o gavé dij drit a j'utent.",
        "userrights-changeable-col": "Partìe ch'a peul cambié",
        "userrights-unchangeable-col": "Partìe ch'a peul pa cambié",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflit ëd modìfica ëd drit utent! Për piasì, ch'a lesa torna e ch'a confirma soe modìfiche.",
-       "userrights-removed-self": "A l'ha gavà për da bin ij sò drit. Parèj a peul pa pi acede a costa pàgina.",
        "group": "Partìa:",
        "group-user": "Utent",
        "group-autoconfirmed": "Utent ch'a son convalidasse daspërlor",
        "right-siteadmin": "Bloché e dësbloché la base ëd dàit",
        "right-override-export-depth": "Esporté le pàgine ancludend le pàgine colegà fin-a a na profondeur ëd 5",
        "right-sendemail": "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
-       "right-passwordreset": "Vëdde ij mëssagi ëd pòsta eletrònica ëd riampostassion dle ciav",
        "right-managechangetags": "Creé e dëscancelé dle [[Special:Tags|tichëtte]] da la base ëd dàit",
        "right-applychangetags": "Apliché [[Special:Tags|le tichëtte]] con soe pròpie modìfiche",
        "right-changetags": "Gionté e gavé dle [[Special:Tags|tichëtte]] qualsëssìa an s'dle revision andividuaj e dle vos d'argistr",
        "uploaded-animate-svg": "Trovà na tichëtta «animate», ch'a podrìa modifiché ël href an dovrand l'atribù «from» <code>&lt;$1 $2=\"$3\"&gt;</code> ant l'archivi SVG carià.",
        "uploaded-setting-event-handler-svg": "Ël posissionament dj'atribù ëd mansé a l'é blocà, <code>&lt;$1 $2=\"$3\"&gt;</code> trovà ant l'archivi SVG carià.",
        "uploaded-setting-href-svg": "L’usage dla tichëtta «set» për gionté n'atribù «href» a l’element pare a l'é blocà.",
-       "uploadscriptednamespace": "S'archivi SVG a conten në spassi nominal «$1» nen autorisà",
+       "uploadscriptednamespace": "S'archivi SVG a conten në spassi nominal «<nowiki>$1</nowiki>» nen autorisà",
        "uploadinvalidxml": "L'XML ant l'archivi carià a l'ha nen podù esse analisà.",
        "uploadvirus": "St'archivi-sì a l'han andrinta un '''vìrus!''' Detaj: $1",
        "uploadjava": "L'archivi a l'é n'archivi ZIP ch'a conten n'archivi Java .class.\nAs peulo pa cariesse dj'archivi Java, përché a peulo causé l'agirament ëd le restrission ëd sicurëssa.",
        "feedback-useragent": "Agent d'utent:",
        "searchsuggest-search": "Arserché",
        "searchsuggest-containing": "contenent ...",
-       "api-error-badaccess-groups": "Chiel a peul pa carié d'archivi su costa wiki.",
        "api-error-badtoken": "Eror antern: sìmbol pa bon.",
-       "api-error-copyuploaddisabled": "Le carie a travers ëd liure a son disabilità ansima a cost servent.",
-       "api-error-duplicate": "A-i {{PLURAL:$1|é n'àutr archivi|son àutri archivi}} già an sël sit col ël midem contnù.",
-       "api-error-duplicate-archive": "A-i {{PLURAL:$1|era n'àutr archivi|ero àutri archivi}} già an sël sit con ël midem contnù, ma {{PLURAL:$1|a l'é stàit|a son ëstàit}} ëscancelà.",
-       "api-error-empty-file": "L'archivi ch'a l'ha mandà a l'era veuid.",
        "api-error-emptypage": "La creassion ëd pàgine neuve veujde a l'é nen përmëttùa.",
-       "api-error-fetchfileerror": "Eror antern: quaicòs a l'é andàit mal antramentre ch'as arcuperava l'archivi.",
-       "api-error-fileexists-forbidden": "N'archivi con nòm «$1» a esist già, e a peul pa esse dzorascrivù.",
-       "api-error-fileexists-shared-forbidden": "N'archivi con nòm «$1» a esist già ant ël depòsit condivis ëd j'archivi, e a peul pa esse dzorascrivù.",
-       "api-error-file-too-large": "L'archivi ch'a l'ha mandà a l'era tròp gròss.",
-       "api-error-filename-tooshort": "Ël nòm ëd l'archivi a l'é tròp curt.",
-       "api-error-filetype-banned": "Costa sòrt d'archivi a l'é proibìa.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|a l'é na sòrt d'archivi proibìa|a son ëd sòrt d'archivi proibìe}}. {{PLURAL:$3|La sòrt d'archivi consentìa a l'é|Le sòrt d'archivi consentìe a son}} $2.",
-       "api-error-filetype-missing": "L'archivi a l'é sensa estension.",
-       "api-error-hookaborted": "La modìfica ch'a l'ha provà a fé a l'é stàita blocà dal gancio ëd n'estension.",
-       "api-error-http": "Eror antern: As peul pa coleghesse al servent.",
-       "api-error-illegal-filename": "Ël nòm dl'archivi a l'é nen consentì.",
-       "api-error-internal-error": "Eror antern: Cheicòs a l'é andàit mal con ël tratament ëd soa amportassion an sla wiki.",
-       "api-error-invalid-file-key": "Eror antern: archivi pa trovà ant la memòria a temp.",
-       "api-error-missingparam": "Eror antern: paràmetr mancant ant l'arcesta.",
-       "api-error-missingresult": "Eror antern: as peul pa determiné se la còpia a l'é andàita bin.",
-       "api-error-mustbeloggedin": "A dev esse intrà ant ël sistema për carié dj'archivi.",
-       "api-error-mustbeposted": "Eror antern: L'arcesta a l'ha da manca d'HTTP POST.",
-       "api-error-noimageinfo": "Ël cariament a l'é andàit bin, ma ël servent a l'ha dane gnun-e anformassion an sl'archivi.",
-       "api-error-nomodule": "Eror antern: gnun mòdoj ëd caria ampostà.",
-       "api-error-ok-but-empty": "Eror antern: Gnun-a rispòsta dal servent.",
-       "api-error-overwrite": "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
-       "api-error-stashfailed": "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
        "api-error-publishfailed": "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
-       "api-error-stasherror": "A-i é staje n'eror durant ël cariament dl'archivi da stërmé.",
-       "api-error-stashedfilenotfound": "L'archivi stërmà a l'é nen trovasse durant ël tentativ ëd carielo da sò strem.",
-       "api-error-stashpathinvalid": "Ël përcors anté ch'a l'avrìa dovù trovesse l'archivi stërmà a l'era nen bon.",
-       "api-error-stashfilestorage": "A-ié staje n'eror an rangiand l'archivi an sò strem.",
-       "api-error-stashzerolength": "Ël servent a l'ha nen podù stërmé l'archivi, përchè a l'era ëd taja nula.",
-       "api-error-stashnotloggedin": "A dev esse rintrà ant ël sistema për argistré dj'archivi ant lë strem ëd cariament.",
-       "api-error-stashwrongowner": "L'archivi al qual a sërcava d'acede ant lë strem a l'é nen sò.",
-       "api-error-stashnosuchfilekey": "La ciav dl'archivi al qual a sërcava d'acede ant lë strem a esist pa.",
-       "api-error-timeout": "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
-       "api-error-unclassified": "A l'é capitaje n'eror nen conossù.",
-       "api-error-unknown-code": "Eror sconossù: «$1».",
-       "api-error-unknown-error": "Eror antern: Cheicòs a l'é andàit mal quand a l'é provasse a carié sò archivi.",
+       "api-error-stashfailed": "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
        "api-error-unknown-warning": "Avis pa conossù: $1",
        "api-error-unknownerror": "Eror sconossù: «$1».",
-       "api-error-uploaddisabled": "Ël cariagi a l'é disabilità su sta wiki.",
-       "api-error-verification-error": "Cost archivi a peul esse danegià, o avèj l'estension sbalià.",
        "duration-seconds": "$1 {{PLURAL:$1|second|second}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index 33d0afe..e90c9ed 100644 (file)
                        "Macofe",
                        "Matma Rex",
                        "Saanvel",
-                       "Satdeep gill"
+                       "Satdeep gill",
+                       "Abbas dhothar"
                ]
        },
-       "tog-underline": "Ø­وڑ تھلے لین:",
+       "tog-underline": "جوڑ تھلے لین:",
        "tog-hideminor": "چھوٹیاں تبدیلیاں چھپاؤ",
        "tog-hidepatrolled": "ویکھیاں تبدیلیاں لکاؤ",
        "tog-newpageshidepatrolled": "نویاں صفیاں توں ویکھیاں تبدیلیاں لکاؤ",
-       "tog-hidecategorization": "صÙ\81Ø­Û\8cاں Ø¯Û\8c Ú¯Ù¹Ú¾ Ù\84کائÙ\88۔",
+       "tog-hidecategorization": "صÙ\81Ø­Û\92Ø¢Úº Ø¯Û\8c Ú¯Ù¹Ú¾ Ù\84Ù\8fکاؤ۔",
        "tog-extendwatchlist": "نظر تھلے رکھے صفحے نوں ودھاو, تاں جے اوہ تبدیلیاں جیڑیاں کم دے قابل نیں ویکھیاں جا سکن",
-       "tog-usenewrc": "تھوڑا خر پہلے کیتیاں گیاں تبدیلیاں ورتو",
+       "tog-usenewrc": "نویاں تبدیلیاں اتے میری اکھ تھلے لسٹ وچ صفحہ وار گروپ تبدیلیاں",
        "tog-numberheadings": "آپ نمبر دین والیاں سرخیاں",
        "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
@@ -41,7 +42,7 @@
        "tog-enotifminoredits": "صفحیاں چ چھوٹیاں موٹیاں تبدیلیاں تے وی مینوں ای میل کر دیو",
        "tog-enotifrevealaddr": "میرے ای میل دے پتے نوں سندیسے آلی ای میل دے وچ وکھاؤ۔",
        "tog-shownumberswatching": "ویکھن آلے لوکاں دی گنتی وکھاؤ۔",
-       "tog-oldsig": "ہن والے دسخط:",
+       "tog-oldsig": "تواڈے ہُن والے دستخط:",
        "tog-fancysig": "دستخط نوں وکی ٹیکسڈ ونگوں؎ ورتو(without an automatic link)",
        "tog-uselivepreview": "لائیو پریویو ورتو",
        "tog-forceeditsummary": "مینون اوسے ویلے دسو جدوں خالی سمری تے آؤ۔",
        "newwindow": "(نئی ونڈو چ کھولو)",
        "cancel": "مکاؤ",
        "moredotdotdot": "مزید۔۔۔۔",
-       "morenotlisted": "ایہ لسٹ پوری نئی۔",
+       "morenotlisted": "ایہ لسٹ پوری نئیں۔",
        "mypage": "صفہ",
        "mytalk": "میریاں گلاں",
        "anontalk": "گل",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "کم",
-       "namespaces": "ناواں دی تھاں:",
+       "namespaces": "ناں تھانواں:",
        "variants": "قسماں",
        "navigation-heading": "کھوج پتر",
        "errorpagetitle": "مسئلہ",
        "search": "کھوج",
        "searchbutton": "کھوج",
        "go": "جاؤ",
-       "searcharticle": "چلو جی",
+       "searcharticle": "چلو",
        "history": "پچھلے کم",
        "history_short": "ریکارڈ",
+       "history_small": "تریخ",
        "updatedmarker": "میرے پچھلی وار آن توں مگروں دیاں تبدیلیاں",
-       "printableversion": "چھپن جوگا صفہ",
+       "printableversion": "چھپن جوگا صفحہ",
        "permalink": "پکا جوڑ",
        "print": "چھاپو",
        "view": "وکھالہ",
        "articlepage": "مضمون آلا صفحہ",
        "talk": "گل بات",
        "views": "وکھالے",
-       "toolbox": "اÙ\88زار",
+       "toolbox": "سÙ\8eÙ\86د",
        "userpage": "ورتن آلے دا صفہ ویکھو",
        "projectpage": "ویونت والا صفہ ویکھو",
        "imagepage": "فائل آلا صفہ ویکھو",
        "redirectedfrom": "(لیایا گیا $1)",
        "redirectpagesub": "صفحہ ریڈائریکٹ کرو",
        "redirectto": "اگے کرو:",
-       "lastmodifiedat": "اس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
+       "lastmodifiedat": "اس صفحے نوں آخری واری $1 تریخ نوں $2 وجے بدلیا گیا۔",
        "viewcount": "اس صفحے نوں {{PLURAL:$1|اک واری|$1 واری}} کھولیا گیا اے۔",
        "protectedpage": "بجایا صفحہ",
        "jumpto": "جاؤ:",
        "copyrightpage": "{{ns:project}}:نقل دے حق",
        "currentevents": "اج کل دیاں گلاں",
        "currentevents-url": "Project:اج کل دیاں گلاں",
-       "disclaimers": "Ù\85Ù\86کرÙ\86ا",
-       "disclaimerpage": "Project:عاÙ\85 Ù\85Ù\86کرÙ\86ا",
+       "disclaimers": "Ù\84اتعÙ\84Ù\82Û\8c Ø§Ø¸Û\81ار",
+       "disclaimerpage": "Project:عاÙ\85 Ù\84اتعÙ\84Ù\82Û\8c Ø§Ø¸Û\81ار",
        "edithelp": "لکھن وچ مدد",
+       "helppage-top-gethelp": "مدد",
        "mainpage": "پہلا صفہ",
-       "mainpage-description": "پہلا صفہ",
+       "mainpage-description": "پہلا صفحہ",
        "policy-url": "Project:پالیسی",
        "portal": "بیٹھک",
        "portal-url": "ویونت:بیٹھک",
-       "privacy": "بچاؤ پالیسی",
-       "privacypage": "Project:بچاؤ پالیسی",
+       "privacy": "پرائیویسی پالیسی",
+       "privacypage": "Project:پرائیویسی پالیسی",
        "badaccess": "اجازت دے وچ غلطی اے",
        "badaccess-group0": "تھاونوں ایس کم دی اجازت نیں جیہڑا تسیں آکھیا اے۔",
        "badaccess-groups": "جیڑا کم تسی کرنا چا رۓ او اوہ صرف {{PLURAL:$2|اس گروپ|ایناں گروپاں}} دے ورتن آلے کر سکدے نیں: $1۔",
        "toc": "حصے",
        "showtoc": "وکھاؤ",
        "hidetoc": "چھپاؤ",
-       "collapsible-collapse": "ڈگنا",
+       "collapsible-collapse": "لُکاؤ",
        "collapsible-expand": "ودھاؤ",
+       "confirmable-no": "نئیں",
        "thisisdeleted": "$1 ویکھو یا واپس لاؤ",
        "viewdeleted": "ویکھو 1$ ؟",
        "restorelink": "{{PLURAL:$1|اک مٹائی گئی تبدیلی|1$ مٹائیاں گئیاں تبدیلیاں}}",
        "nstab-main": "صفہ",
        "nstab-user": "ورتن والے دا صفہ",
        "nstab-media": "میڈیا آلا صفہ",
-       "nstab-special": "خاص صفہ",
+       "nstab-special": "خاص صفحہ",
        "nstab-project": "ویونت دا صفہ",
        "nstab-image": "فائل",
-       "nstab-mediawiki": "سنیعا",
+       "nstab-mediawiki": "سنیہہ",
        "nstab-template": "سانچہ",
        "nstab-help": "مدد آلا صفہ",
        "nstab-category": "گٹھ",
        "badarticleerror": "اے کم اس صفحے تے نئیں ہو سکدا۔",
        "cannotdelete": "صفحہ یا فائل \"$1\" نوں مٹایا نا جاسکیا۔\nاینوں پہلاں توں ای کسے نے مٹایا ہوۓ گا۔",
        "cannotdelete-title": "صفہ مٹا نئیں سکدے \"$1\"",
-       "badtitle": "Ù¾Û\8cÚ\91ا Ø¹Ù\86Ù\88اÙ\86",
+       "badtitle": "بھÛ\8cÚ\91ا Ø¹Ù\86Ù\88اÙ\86",
        "badtitletext": "منگیا گۓ صفے دا ناں غلط اے، خالی، یا ایہ غلط ول نال جوڑیا گیا اے۔\nہوسکدا اے ایدے چ اک دو ھندسے ایسے ہون جیڑے ناں وچ ورتے نہیں جاسکدے۔",
        "perfcached": "تھلے دتا گیا ڈیٹا کاشیڈ اے تے پانویں نواں ناں ہووے. زیادہ توں زیادہ کاشے چ  {{PLURAL:$1|اک نتیجہ ہووے|$1 نتیجے ہوون}} گے.",
        "perfcachedts": "تھلے دتا گیا ڈیٹا کاشیڈ اے تے  $1 نوں نواں کیتا گیا۔ زیادہ توں زیادہ {{PLURAL:$4|اک نتیجہ ہووے|$4 نتیجے ہوون}} نتیجے کاشے چ ہیگے نیں .",
        "protectedpagetext": "اس صفحے دے اتے تبدیلی کرن نوں روکیا گیا اے۔",
        "viewsourcetext": "تسی اس صفحے دی لکھائی نوں ویکھ تے نقل کر سکدے او:",
        "viewyourtext": "تسیں آپنی تبدیلیاں دا ذریعہ ایس صفے تے ویکھ تے کاپی کرسکدے او۔",
-       "protectedinterface": "اÛ\92 صفحے سافٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا ہویا اے۔",
+       "protectedinterface": "اÛ\8cÛ\81 صفحے سافٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا ہویا اے۔",
        "editinginterface": "'''خبردار:''' تسیں اک ایسا صفہ بدل رۓ او جیہڑا مکھی صفے دے سوفٹویر نوں لکھت دیندا اے۔ ایس صفے ج تبدیلی ورتنن والیاں دے مکھی صفے دے وکھالے نوں بدل دے گی۔ بولی وٹاندرے لئی، مہربانی کرکے میڈیاوکی بولی ویونت [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ول ویکھو۔",
        "cascadeprotected": "ایس صفے نوں تبدیلی توں بچایا گیا اے، کیوں جے ایہ تھلے دتے گۓ {{PLURAL:$1|صفہ|صفے}} چ ہیگا اے تے اینوں ''کیسکیڈنگ'' چنوتی نال بچایا گیا اے:\n\n $2",
        "namespaceprotected": "'''$1''' ناں دے صفحے تسی نئیں لکھ سکدے۔",
        "createacct-email-ph": "اپنا ای-میل پتہ دیؤ",
        "createaccountmail": "ای میل دے نال",
        "createaccountreason": "وجہ:",
+       "createacct-reason": "وجہ",
+       "createacct-reason-ph": "تسیں اک ہور کھاتہ کیوں بنا رہے او",
        "createacct-submit": "اپنا کھاتا کھولو",
        "createacct-benefit-heading": "پنجابی وکی نوں تواڈے ورگے لوکاں نے بنایا اے۔",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "blocked-mailpassword": "تواڈے IP پتے تے تبدیلی کرن تے روک اے، تے تسی کنجی وی واپس نئیں لیا سکدے تاکے ایدا غلط ورت نا ہوۓ۔",
        "eauthentsent": "اک کنفرمیشن ای میل دتے گۓ ای میل پتے تے پیج دتی گئی اے۔ اس توں پہلاں کہ کوئی دوجی ای میل کھاتے تے پیجی جاۓ، توانوں ای میل چ دتیاں ہدایات تے عمل کرنا ہوۓ گا، تا کے اے پکا ہو سکے کہ اے کھاتہ تواڈا ہی اے۔",
        "throttled-mailpassword": "اک کنجی بارے سنیعہ پہلے ای پیجیا جاچکیا اے، پچھلے {{PLURAL:$1|کینٹہ|$1 کینٹے}} چ۔ \nکوئی غلط کم ہون توں پہلے صرف اک کنجی سنیغہ {{PLURAL:$1|کینٹہ|$1 کینٹے}} پیجیا جائیکا۔",
-       "mailerror": "چٹھی پیجن چ غلطی: $1",
+       "mailerror": "ای میل بھیجن وچ غلطی: $1",
        "acct_creation_throttle_hit": "ایس وکی تے آن والے تے تواڈے آئی پی پتے ورتدیاں ہویاں {{PLURAL:$1|1 کھاتہ|$1 کھاتے}} پچھلے دن چ جیہڑا کی ایس ویلے چ زیادہ توں زیادہ دی اجازت اے۔ \nایس لئی ایتھے آن والے  تے ایس آئی پی پتے نوں ورتن والے ایس ویلے ہور کھاتہ نئیں کھول سکدے۔",
        "emailauthenticated": "تھواڈا ای-میل پتہ $2 نوں $3 تے پکا کیتا گیا۔",
-       "emailnotauthenticated": "تھواڈا ای-میل پتہ ہجے پکا نئیں ہویا۔\nکوئی ای-میل اینج دے فیچر والی نئیں پیجی جاۓ گی۔",
+       "emailnotauthenticated": "تھواڈا ای-میل پتہ ہجے پکا نئیں ہویا۔\nکوئی ای-میل اینج دے فیچر والی نئیں بھیجی جائے گی۔",
        "noemailprefs": "ایناں فیچراں نوں کم کرن لئی اپنیاں تانگاں چ ای-میل پتہ دسو۔",
        "emailconfirmlink": "ای میل پتہ پکا کرو",
        "invalidemailaddress": "ایہ ای-میل پتہ نئیں چلے گا کیوں جے اے ناں منے جان والے فارمیٹ تے بنیا ہویا اے۔\nمہربانی کرکے منے جان والے فارمیٹ پتے نوں دسو یا فیر اے تھاں خالی چھڈ دیو۔",
        "resetpass_announce": "تسی اک کچے ای-میل کود تے لاگ ان ہوگۓ او۔\nلاگ ان مکان لئی تھوانوں ایتھے اک نویں کنجی بنانی پوے گی:",
        "resetpass_header": "کھاتے دی کنجی بدلو",
        "oldpassword": "پرانی کنجی:",
-       "newpassword": "نوی کنجی:",
-       "retypenew": "نئی کنجی دوبارہ لکھو:",
+       "newpassword": "نویں کنجی:",
+       "retypenew": "نویں کنجی دوبارہ لکھو:",
        "resetpass_submit": "کنجی رکھو تے لاگ ان ہو جاو",
-       "changepassword-success": "تھواڈی کنجی بدلی جاچکی اے!\nتسی لاگ ان ہورۓ او۔۔۔۔۔۔",
+       "changepassword-success": "تھواڈی کنجی بدلی جاچکی اے!\nتسی لاگ ان ہو رہے او۔۔۔۔۔۔",
+       "botpasswords-label-appid": "بوٹ ناں",
+       "botpasswords-label-create": "بناؤ",
        "resetpass_forbidden": "کنجی بدلی نئیں جاسکدی",
        "resetpass-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "resetpass-submit-loggedin": "کنجی بدلو",
        "passwordreset-disabled": "اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔",
        "passwordreset-username": "ورتن ناں:",
        "passwordreset-domain": "ڈومین",
-       "passwordreset-capture": "آن والی ای-میل ویکھو؟",
-       "passwordreset-capture-help": "اگر تسیں اے ڈبہ چیک کروگے ای-میل (عارضی کنجی نال) وکھائی جاۓ گی توانوں تے پیجی وی جاۓ گی۔",
        "passwordreset-email": "ای-میل پتہ:",
        "passwordreset-emailtitle": "{{SITENAME}} دے اتے کھاتے دی معلومات:",
        "passwordreset-emailtext-ip": "کسے نے (خورے تساں  آئی پی پتے $1) تواڈے کھاتے دا ویروا منگیا اے {{SITENAME}} ($4) لئی۔ تھلے دتا گیا ورتنوالا {{PLURAL:$3|کھاتہ|کھاتے}} ایس ای-میل پتے نال جوڑ رکھدا اے:\n\n$2\n\n{{PLURAL:$3|اے عارضی کنجی|اے عارضی کنجیاں}} {{PLURAL:$5|اک دن|$5 دناں}} چ مک جاوے گی۔ تسیں لاگان ہوو تے اپنی اک نويں کنجی چنو. اگر کسے ہور نے اے کنجی والی چٹھی پیجی اے یا توانوں پرانی کنجی یاد آگئی اے تے تسیں پرانی کنجی نال ای کم چلانا چاندے او تے تسیں ایس سنیعے نوں پل جاؤ تے پرانی کنجی ای ورتو۔",
        "passwordreset-emailtext-user": "ورتنوالے $1 نے {{سائیٹناں}} تے تواڈے کھاتے بارے پچھیا اے {{SITENAME}} لئی ($4)۔ تھلے دتا گیا ورتن {{PLURAL:$3|کھاتہ|کھاتے}} ایس ای-میل نال جڑدا اے۔\n\n$2\n\n{{PLURAL:$3|ایہ عارضی کنجی|اے عارضی کنجیاں}} مک جائیگا {{PLURAL:$5|اک دن|$5 دن}}۔ تسیں ہن لاکان ہوو تے نویں کنجی چنو۔ اگر کسے ہور نے اے چٹھی پیجی یا توانوں اپنی پہلی کنجی یاد آگئی اے تے تسیں اونوں بدلنا نئیں چاندے تے تسیں ایس سنیعے نوں پھل جاؤ تے پرانی کنجی نال ای کم چلاؤ۔",
        "passwordreset-emailelement": "ورتن ناں: \n$1\n\nعارضی کنجی: \n$2",
-       "passwordreset-emailsentemail": "یاد کران واسطے اک ای-میل Ù¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8c Ø§Û\92Û\94",
+       "passwordreset-emailsentemail": "یاد کران واسطے اک ای-میل Ø¨Ú¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8c Ø§Û\92Û\94",
        "changeemail": "ای-میل پتہ بدلو",
        "changeemail-header": "کھاتے دا ای-میل پتہ بدلو",
        "changeemail-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "headline_sample": "شہ سرخی",
        "headline_tip": "دوسرے درجے دی سرخی",
        "nowiki_sample": "فارمیٹ نہ ہوئی لکھائی ایتھے پاؤ",
-       "nowiki_tip": "وکی فارمیٹ رھندیو۔",
+       "nowiki_tip": "وکی فارمیٹ رہن دیؤ۔",
        "image_sample": "Example.jpg",
        "image_tip": "وچ مورت لگاؤ",
        "media_sample": "Example.ogg",
        "blockednoreason": "کوئی وجہ نئیں دسی گئی",
        "whitelistedittext": "تھواڈے کول $1 ہونا چآغیدا اے صفے تبدیل کرن لئی۔",
        "confirmedittext": "توانوں اپنا ای-میل پتہ پکا کرنا چائیدا اے تبدیلیاں کرن توں پہلے۔\nمہربانی کرکے اپنا ای-میل پتہ بناؤ تے پکا کرو [[Special:Preferences|user preferences]]",
-       "nosuchsectiontitle": "اÛ\92 ہو جیا کوئی ٹوٹا نئیں",
+       "nosuchsectiontitle": "اÛ\8cہو جیا کوئی ٹوٹا نئیں",
        "nosuchsectiontext": "تساں اک ایسے پاسے نوں بدلن دی کوشش کیتی اے جیہڑا ہے ای نئیں۔\nخورے جدوں تسی تک رۓ سے اودوں اینوں مٹادتا گیا ہووۓ یا بدل دتا گیا ہووے۔",
        "loginreqtitle": "لاگ ان چائیدا اے",
        "loginreqlink": "لاگ ان ہو جاو",
        "editconflict": "تبدیلی رپھڑ: $1",
        "explainconflict": "جدوں تسیں لکھنا شروع کیتا کسے ہور نے صفہ بدل دتا اے۔ اتلا لکھت تھاں چ چ لکھت ہے جیویں اوہ ہن ہیگی اے۔\nتواڈیاں تبدیلیاں تھلویں لکھت چ دسیاں جاریاں نیں۔ توانوں اپنیاں تبدیلیاں ہن دی لکھت چ رلانیاں پین گیاں۔\nتوانوں اپنیاں تبدیلیاںہن دی لکھت چ رلانیاں پین گیا۔\n'''صرف''' اتلی لکھت ددی تھاں بچائی جاسیگی جدوں تسیں \"{{int:savearticle}}\" دباؤ گے",
        "yourtext": "تواڈی لکھائی",
-       "storedversion": "سانبیا ورژن",
-       "nonunicodebrowser": "'''خبردار: تھواڈا براؤزر تے یونیکوڈ نئیں چلدا۔'''\nاک کم تھانوں ایس قابل کریگا جے بچت نال صفے بچا سکو: non-ASCII کیریکٹر تبدیلی ڈبے چ ہیکساڈیسیمل کوڈ دسن گے۔",
+       "storedversion": "سانبھی لکھائی",
+       "nonunicodebrowser": "'''خبردار: تھواڈے براؤزر اُتے یونیکوڈ نئیں چلدا۔'''\nاک کم تھانوں ایس قابل کریگا جے بچت نال صفے بچا سکو: non-ASCII کیریکٹر تبدیلی ڈبے چ ہیکساڈیسیمل کوڈ دسن گے۔",
        "editingold": "'''خبردار: تسیں ایس صفے دی پرانی ریوین بدل رۓ او۔'''\nاگر تسیں اینوں بچاندےاو، ایس ریوین مگروں کوئی وی تبدیلی مک جائیگی۔",
        "yourdiff": "تبدیلیاں",
        "copyrightwarning": "مہربانی کر کے اے گل یاد رکھ لو کے سارے کم {{SITENAME}} ایتھے $2 دے تھلے آن گے (زیادہ علم واسطے $1 تکو)۔<br />\nاگر تسی نئیں چاندے کے تواڑی لکھائی نوں بے رحمی نال ٹھیک کیتا جاۓ تے نالے اپنی مرضی نال اونھوں چھاپیا جاۓ تے ایتدے مت لکھو۔<br />\nتسی اے وی ساڈے نال وعدہ کر رہے او کہ اینوں تسی آپ لکھیا اے یا فیر کسی پبلک ڈومین توں یا ایہو جۓ کسے آزاد ذریعے توں نقل کیتا اے۔<br />\n'''ایتھے او کم بغیر اجازت توں نا لکھو جیدے حق راکھویں نے '''",
        "post-expand-template-inclusion-category": "صفے جتھے ٹمپلیٹ ناپ وڈا ہوگیا اے۔",
        "post-expand-template-argument-warning": "'''خبردار:''' ایس صفے تے اک ٹمپلیٹ گل بات دتی گئی اے جیہڑا چوکھا وڈا اے۔\nاے گلاں کڈ دتیاں گیاں نیں۔",
        "post-expand-template-argument-category": "صفے جناں چ کڈے گۓ ٹمپلیٹ دیاں گلاں نیں۔",
-       "parser-template-loop-warning": "ٹمپلیٹ لوپ لب لئی گئی: [[$1]]",
+       "parser-template-loop-warning": "سانچہ لوپ لبھ لئی گئی: [[$1]]",
        "parser-template-recursion-depth-warning": "ٹمپلیٹ ریکرشن ڈپتھ لمٹ ودی ($1)",
        "language-converter-depth-warning": "بولی بدلن دی ولگن ودی ($1)",
        "undo-success": "تبدیلیاں واپس ہوسکدیاں نیں۔\nتھلے فرق ویکھو اے ویکھن لئی جے ایہو ای تسی چاندے او، تے تھلے تبدیلیاں بچاؤ، تبدیلیاں مکاں دی روک نوں۔",
        "currentrevisionlink": "موجودہ حالت",
        "cur": "ہنوالا",
        "next": "اگلا",
-       "last": "پہلا",
+       "last": "پچھلا",
        "page_first": "پہلا",
        "page_last": "آخری",
        "histlegend": "ڈف سلیکشن: وکھری تبدیلیاں دا مقابلا کرن واسطے ریڈیو ڈبیاں تے نشان لاؤ تے اینٹر یا تھلے دتا گیا بٹن دباؤ۔<br />\nلیجنڈ: (موجودہ) = موجودہ تبدیلی نال مقابلہ،\n(آخری) = پچھلی تبدیلی توں فرق، M = تھوڑی تبدیلی",
        "history-fieldset-title": "ریکارڈ ویکھو",
        "history-show-deleted": "صرف مٹایا گیا اے۔",
-       "histfirst": "سب توں پہلا",
-       "histlast": "سب توں نواں",
+       "histfirst": "سبتوں پرانا",
+       "histlast": "سبتوں نواں",
        "historysize": "({{PLURAL:$1|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|searching on the wiki]] کرو چائیدے نویں صفیاں لئی۔",
        "rev-deleted-comment": "تبدیلی سمری مٹادتی گئی۔",
        "revdelete-confirm": "اے پکا کرلو جے تسیں ایہ کرنا چاندے او، تے توانوں ایدے نتیجے دا پتہ اے، تے تسیں [[{{MediaWiki:Policy-url}}|پالیسی]] تے چل کے ک رۓ او۔",
        "revdelete-suppress-text": "دبانا اودوں ای ٹھیک اے جدوں اے تھلے دتے کۓ مسلیاں لئی ہووے۔\n* غلط جانکاری\n**تھوڑی اپنے بارے جانکاری\n*:''کعر دا پتہ تے فون نمبر.''",
        "revdelete-legend": "ویکھن چانن دیاں ولگناں بناؤ",
-       "revdelete-hide-text": "ریوژن ٹیکسٹ لکاؤ",
+       "revdelete-hide-text": "ریویژن ٹیکسٹ",
        "revdelete-hide-image": "فائل دا مواد لکاؤ",
-       "revdelete-hide-name": "کم تے نشانہ چھپاؤ",
-       "revdelete-hide-comment": "Ù\84Ú©Ú¾Ù\86 Ø¯Û\92 Ø¨Ø§Ø±Û\92 Ú\86 ØµÙ\84اع Ù\84کاؤ",
+       "revdelete-hide-name": "پیرامیٹر تے ٹارگٹ چھپاؤ",
+       "revdelete-hide-comment": "Ù\84Ú©Ú¾Ù\86 Ø³Ù\85رÛ\8c",
        "revdelete-hide-user": "لکھن آلے دا ناں/آئی پی پتہ لکاؤ",
        "revdelete-hide-restricted": "ایڈمنسٹریٹراں تے ہوراں کولاں ڈیٹا لکاؤ۔",
        "revdelete-radio-same": "(اینوں ناں بدلو)",
-       "revdelete-radio-set": "ہاں",
-       "revdelete-radio-unset": "Ù\86ئÛ\8cÚº",
+       "revdelete-radio-set": "لُکی",
+       "revdelete-radio-unset": "Ù\86ظز Ø¢Ù\86دÛ\8c",
        "revdelete-suppress": "چھڈن دی چنوتی",
        "revdelete-unsuppress": "واپس کیتیاں ریویناں چ روکاں نوں ہٹاؤ۔",
        "revdelete-log": "وجہ:",
        "revdelete-submit": "{{PLURAL:$1|ریوین|ریویناں}} تے ورتو",
-       "revdelete-success": "'''ریوین وکھالہ کامیابی نال نواں کردتا گیا اے.'''",
+       "revdelete-success": "'''ریویژن وکھالہ کامیابی نال نواں کردتا گیا اے.'''",
        "revdelete-failure": "'''ریوین وکھالہ نویں نئیں کیتی جاسکدی:'''\n$1",
-       "logdelete-success": "'''Ù\84اک وکھالہ کامیابی نال سیٹ کردتا گیا.'''",
+       "logdelete-success": "'''Ù\84اگ وکھالہ کامیابی نال سیٹ کردتا گیا.'''",
        "logdelete-failure": "'''لاک وکھالہ ویکھیا نئیں جاسکدا:'''\n$1",
        "revdel-restore": "وکھالا بدلو",
        "pagehist": "صفحے دی تریخ",
        "deletedhist": "مٹائی گئی تریخ",
-       "revdelete-hide-current": "آئیٹم نوں $2 تے $1 تریخاں چ لکان چ غلطی۔\nایہ نئیں لکائی جاسکدی۔",
-       "revdelete-show-no-access": "$2، $1 دی تریخاں دیاں آئٹماں دے دسن چ غلطی ہوئی اے : ایہ آئٹم حد چ اے۔\nتسیں ایدے تک نئیں جاسکدے او۔",
+       "revdelete-hide-current": "آئیٹم نوں $2 تے $1 تریخاں چ لُکان وچ غلطی۔\nایہ نئیں لکائی جاسکدی۔",
+       "revdelete-show-no-access": "$2، $1 دی تریخاں دیاں آئٹماں دے دسن چ غلطی ہوئی اے : ایہ آئٹم حد وچ اے۔\nتسیں ایدے تک نئیں جاسکدے او۔",
        "revdelete-modify-no-access": "$2، $1 تریخ دی آئٹم بدلن چ غلطی ہوئی: ایہ آئٹم نوں حد چ رکھیا اے۔ تواڈی ایتھوں تک رسائی نئیں۔",
        "revdelete-modify-missing": "آئی ڈی آئیٹم $1 توں بدلن چ فلطی: ایہ ڈیٹابیس چ نئیں اے۔",
        "revdelete-no-change": "'''خبردار:''' $2 تریخ دی آئیٹم، $1 پہلے ای دیس سیٹنگ لئی آکھی جاچکی اے۔",
        "revdelete-otherreason": ":دوجی وجہ",
        "revdelete-reasonotherlist": "ہور وجہ",
        "revdelete-edit-reasonlist": "مٹانے دی وجہ لکھو",
-       "revdelete-offender": "ریوین لکھاری",
+       "revdelete-offender": "ریویژن لکھاری",
        "suppressionlog": "دبان لاگ",
-       "suppressionlogtext": "تھÙ\84Û\92 Ù\85ٹاÙ\86 ØªÛ\92 Ø±Ù\88Ú©Ù\86 Ø¯Û\92 Ú©Ù\85 Ø¯Û\8c Ù\84سٹ Ø§Û\92 Ø¬Û\8cÛ\81Ú\91ا Ù\85Ú©Ú¾Û\8cاÙ\88اں Ú©Ù\88Ù\84Ù\88Úº Ù\84Ú©Û\8cا Ø§Û\92Û\94\n[[Special:BlockList|IP block list]] Ù\88Û\8cÚ©Ú¾Ù\88  Û\81Ù\86 Ø¯Û\8c اوپریشنل بنداں تے روکاں تے۔",
+       "suppressionlogtext": "تھÙ\84Û\92 Ù\85ٹاÙ\86 ØªÛ\92 Ø±Ù\88Ú©Ù\86 Ø¯Û\92 Ú©Ù\85 Ø¯Û\8c Ù\84سٹ Ø§Û\92 Ø¬Û\8cÛ\81Ú\91ا Ù¾Ø±Ø¨Ù\86دھکاں Ú©Ù\88Ù\84Ù\88Úº Ù\84Ù\8fÚ©Û\8cا Ø§Û\92Û\94\nÙ\88Û\8cÚ©Ú¾Ù\88[[Special:BlockList|IP block list]]    Û\81Ù\86 Ø¯Û\8cاں اوپریشنل بنداں تے روکاں تے۔",
        "mergehistory": "صفیاں دا رکارڈ رلاؤ",
        "mergehistory-header": "ایہ صفہ توانوں اک سورس صفے دیاں ریویناں دا رکارڈ اک ہور صفے چ رلان دیوے گا۔\nایہ گل پکی کرو جے تبدیلی رکارڈ دی لکاتاری نوں رکھے گی۔",
        "mergehistory-box": "دوصفیاں دیاں رلیاں ریویني",
        "searchprofile-advanced-tooltip": "کسٹم ناواں چ لبو",
        "search-result-size": "$1 ({{PLURAL:$2|1 شبد|$2 شبد}})",
        "search-result-category-size": "{{PLURAL:$1|1 سنگی|$1 سنگی}} ({{PLURAL:$2|1 نکیاں گٹھاں|$2 نکیاں گٹھاں}}, {{PLURAL:$3|1 فائل|$3 فائلاں}})",
-       "search-redirect": "($1 Ø±Û\8cÚ\88ائرÛ\8cÚ©Ù¹)",
+       "search-redirect": "($1 ØªÙ\88Úº Ù\85Ú\91 Ø±Ø¬Ù\88ع)",
        "search-section": "($1 ٹوٹا)",
+       "search-category": "(کیٹیگری $1)",
        "search-suggest": "تسی $1 دی گل تے نئیں کر رۓ:",
        "search-interwiki-caption": "رلدے ویونت",
        "search-interwiki-default": "$1 نتارے:",
        "search-interwiki-more": "(اور)",
+       "search-interwiki-more-results": "ہور نتیجے",
        "search-relatedarticle": "جڑیاں",
        "searchrelated": "جڑیا",
        "searchall": "سارے",
        "saveprefs": "بچاؤ",
        "restoreprefs": "ڈیفالٹ سیٹنگز دوبارہ لیاؤ",
        "prefs-editing": "لکھائی",
-       "rows": "قطار:",
-       "columns": "کالم:",
        "searchresultshead": "کھوج",
        "stub-threshold": "بوآ <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes): لئی",
        "stub-threshold-disabled": "ناکارہ",
        "timezoneuseserverdefault": "وکی ڈیفالٹ ($1) ورتو۔",
        "timezoneuseoffset": "دوجے (آفسٹ دسو)",
        "servertime": "سرور دا ویلا:",
-       "guesstimezone": "براؤزر توں پعرو۔",
+       "guesstimezone": "براؤزر توں بھرو۔",
        "timezoneregion-africa": "افریقہ",
        "timezoneregion-america": "امریکہ",
        "timezoneregion-antarctica": "انٹارکٹکا",
        "yourlanguage": "بولی:",
        "yourvariant": "ورتی بولی دی اک ہور ونڈ:",
        "prefs-help-variant": "تسیں وکھرے یا اورتوگرافی چنی اے ایس وکی دیاں لکھتاں نوں دکھان لئی۔",
-       "yournick": "دسخط:",
-       "prefs-help-signature": "Ú¯Ù\84 Ø¨Ø§Øª ØµÙ\81Û\92 ØªÛ\92 \"<nowiki>~~~~</nowiki>\"  Ø¯Û\92 Ù\86اÙ\84 Ø¯Ø³Ø®Ø· Û\81Ù\88Ù\86Û\92 Ú\86ائÛ\8cدÛ\92 Ù\86Û\8cÚº Ø¬Ù\86اں Ù\86Ù\88Úº Ø¯Ø³Ø®Ø· ØªÛ\92 Ù\88Û\8cÙ\84Û\92 چ دسیا جائیگا۔",
-       "badsig": "ناں منیا جان والا کچا دسخط۔\nایچ ٹی ایم ایل ٹیگ۔",
-       "badsiglength": "تھÙ\88اÚ\88Û\92 Ø¯Ø³Ø®Ø· Ø¨Ø¹Ù\88ت Ù\84Ù\85بÛ\92 Ù\86Û\8cÚºÛ\94\n\nاÛ\92 $1 {{PLURAL:$1|اکرا|اکرے}}توں لمبے ناں ہون۔",
+       "yournick": "نویں دستخط:",
+       "prefs-help-signature": "Ú¯Ù\84 Ø¨Ø§Øª ØµÙ\81Û\92 ØªÛ\92 \"<nowiki>~~~~</nowiki>\"  Ø¯Û\92 Ù\86اÙ\84 Ø¯Ø³ØªØ®Ø· Û\81Ù\88Ù\86Û\92 Ú\86ائÛ\8cدÛ\92 Ù\86Û\8cÚº Ø¬Ù\86Û\81اں Ù\86Ù\88Úº Ø¯Ø³ØªØ®Ø· ØªÛ\92 Ù\88Û\8cÙ\84Û\92 Ù\88چ دسیا جائیگا۔",
+       "badsig": "Ù\86اں Ù\85Ù\86Û\8cا Ø¬Ø§Ù\86 Ù\88اÙ\84ا Ú©Ú\86ا Ø¯Ø³ØªØ®Ø·Û\94\nاÛ\8cÚ\86 Ù¹Û\8c Ø§Û\8cÙ\85 Ø§Û\8cÙ\84 Ù¹Û\8cÚ¯Û\94",
+       "badsiglength": "تھÙ\88اÚ\88Û\92 Ø¯Ø³ØªØ®Ø· Ø¨Ù\88Û\81ت Ù\84Ù\85بÛ\92 Ù\86Û\8cÚºÛ\94\n\nاÛ\8cÛ\81 $1 {{PLURAL:$1|اکرا|اکرے}}توں لمبے ناں ہون۔",
        "yourgender": "جنس",
        "gender-unknown": "نئیں دسیا گیا۔",
        "gender-male": "نر",
        "prefs-help-email": "ای-میل پتہ اوپشنل اے، پر کنجی ٹھیک کرن لئی ورتیا جاندا اے، کیا تسیں اپنی کنجی پعل جاؤگے۔",
        "prefs-help-email-others": "تسیں آپ چن سکدے او جے توانوں ملیا جاوے ای-میل توں  تواڈے جوڑ توں تواڈے ورتن والے یا گل بات صفے تے۔\nتواڈا ای-میل پتہ نئیں دسیا جاندا جدوں دوجے ورتن والے توانوں ملدے نیں۔",
        "prefs-help-email-required": "ای میل پتہ چائیدا اے۔",
-       "prefs-info": "مڈلی جانکاری",
+       "prefs-info": "مڈھلی جانکاری",
        "prefs-i18n": "انٹرنیشنلائزیشن",
-       "prefs-signature": "دسخط",
+       "prefs-signature": "دستخط",
        "prefs-dateformat": "تریخ فارمیٹ",
        "prefs-timeoffset": "ٹائم آفسیٹ",
        "prefs-advancedediting": "ہور چنوتیاں",
        "prefs-displayrc": "چنوتیاں دسو",
        "prefs-displaywatchlist": "چنوتیاں دسو",
        "prefs-diffs": "ڈفز",
-       "userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø³Ø¹اب کتاب",
+       "userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø­Ø³اب کتاب",
        "userrights-lookup-user": "ورتن ٹولی بچاؤ",
        "userrights-user-editname": "اک ورتن والا ناں لکھو:",
        "editusergroup": "ورتن ٹولی چ تبدیلی",
        "userrights-reason": "وجہ:",
        "userrights-no-interwiki": "تساں نوں ورتن حق بدلن دی اجازت دوسرے وکی تے نئیں۔",
        "userrights-nodatabase": "ڈیٹابیس $1 ہے ای نئیں یا لوکل نئیں۔",
-       "userrights-nologin": "تسیں لازمی [[Special:UserLogin|log in]] اک مکھیا کھاتے نال  اپنے ح‍اں لئی۔",
-       "userrights-notallowed": "تواڈے کھاتے نوں اے اجازت نئیں جے اے ورتن حق دے سکے۔",
        "userrights-changeable-col": "ٹولیاں جیہڑیاں تسی بدل ےکدے او۔",
        "userrights-unchangeable-col": "ٹولیاں جیہڑیاں تسی بدل نئیں سکدے",
        "group": "ٹولی:",
        "group-user": "ورتن آلے",
        "group-autoconfirmed": "اپنے آپ منے گۓ ورتن والے",
        "group-bot": "بوٹ",
-       "group-sysop": "Ù\85Ú©Ú¾Û\8cÛ\93",
+       "group-sysop": "پربÙ\86دھک",
        "group-bureaucrat": "بیوروکریٹ",
        "group-suppress": "چھڈیا گیا",
        "group-all": "(سارے)",
        "group-user-member": "{{GENDER:$1|ورتن والا}}",
        "group-autoconfirmed-member": "{{GENDER:$1|اپنے آپ منے گۓ ورتن والے}}",
        "group-bot-member": "{{GENDER:$1|بوٹ}}",
-       "group-sysop-member": "{{GENDER:$1|Ù\85Ú©Ú¾Û\8cا}}",
+       "group-sysop-member": "{{GENDER:$1|پربÙ\86دھک}}",
        "group-bureaucrat-member": "{{GENDER:$1|بیوروکریٹ}}",
        "group-suppress-member": "{{GENDER:$1|چھڈی گئی}}",
        "grouppage-user": "{{ns:project}}:ورتن آلے",
        "right-move-rootuserpages": "ورتن جڑ صفے لے چلو",
        "right-movefile": "فائلاں لے چلو۔",
        "right-suppressredirect": "جدوں صفے بل رۓ ہوو تے سورس توں ریڈائرکٹس ناں بناؤ",
-       "right-upload": "فائل چڑہاؤ",
-       "right-reupload": "پہلاں دی لکھی ہوئی فائل دے اتے لکھو",
-       "right-reupload-own": "آپ چڑھائیاں ہوئیاں فائلاں تے لکھو۔",
-       "right-reupload-shared": "رلی میڈیا فائلاں تے چڑھاؤ",
-       "right-upload_by_url": "ۃڈي توں چرھائی گئی فاغلاں",
+       "right-upload": "فائل چڑھاؤ",
+       "right-reupload": "پہلاں دی لکھی ہوئی فائل دے اُتے لکھو",
+       "right-reupload-own": "آپ Ú\86Ú\91ھائÛ\8cاں Û\81Ù\88ئÛ\8cاں Ù\81ائÙ\84اں Ø§Ù\8fتÛ\92 Ù\84Ú©Ú¾Ù\88Û\94",
+       "right-reupload-shared": "رÙ\84Û\8c Ù\85Û\8cÚ\88Û\8cا Ù\81ائÙ\84اں Ø§Ù\8fتÛ\92 Ú\86Ú\91ھاؤ",
+       "right-upload_by_url": "URL توں چرھائیاں گئیاں فائلاں",
        "right-purge": "جیہڑے صفے دی پک ناں ہووے اوس دی سائٹ کاشے صاف کرو",
-       "right-autoconfirmed": "کج بچاۓ گۓ صفے نوں تبدیل کرو۔",
+       "right-autoconfirmed": "آئی پی بیسڈ ریٹ حداں توں پریشان نا ہوو",
        "right-bot": "اپنے آپ ہوندے کم ورگا ورتو",
        "right-nominornewtalk": "نکیاں تبدیلیاں کوئی نين گل بات والے صفے تے جیہڑیاں نویں سنیعے نون ٹران",
        "right-apihighlimits": "API  کھوجاں چ آخدی جد تک جاؤ",
        "right-deleterevision": "مٹاؤ تے واپس لیاؤ صفیاں دیاں خاص ریوین",
        "right-deletedhistory": "مٹایا ہویا ریکارڈ ویکھو بنا اودیاں لکھتاں دے۔",
        "right-deletedtext": "مٹائی لکھت تے مٹیاں ریویناں دیاں تبدیلیاں ویکھو۔",
-       "right-browsearchive": "مٹاۓ ہوۓ صفحے کھوجو",
+       "right-browsearchive": "مٹائے ہوئے صفحے کھوجو",
        "right-undelete": "مٹایا صفحہ واپس لیاو",
        "right-suppressrevision": "اوہ ریویناں  نوں دوبارہ لیاؤ تے ویکھو جیہڑیاں مکھیاں توں لکیاں نیں۔",
        "right-suppressionlog": "پرائیویٹ لاگز ویکھو",
        "right-siteadmin": "ڈیٹابیس نوں کھولو تے بند کرو",
        "right-override-export-depth": "5 تک صفے تے جڑے صفے لے کے جاؤ",
        "right-sendemail": "دوجے ورتن والیاں نوں ای-میل کرو",
-       "right-passwordreset": "کنجی بدلی ای-میلاں نوں وکھاؤ",
        "newuserlogpage": "ورتنوالا بنان آلی لاگ",
        "newuserlogpagetext": "اے ورتن والا بنان دی لاگ اے۔",
        "rightslog": "ورتن والے دے حقاں دی لاگ",
        "action-autopatrol": "کیا تساں تبدیلی دے نشاں تے گشت دا نشان لایا",
        "action-unwatchedpages": "بنا اکھ تھلے رکھیاں صفیاں دی لسٹ ویکھو",
        "action-mergehistory": "ایس صفے دا رکارڈ رلاؤ",
-       "action-userrights": "ورتن ح‌ق چ تبدیلی کرو",
+       "action-userrights": "ورتن حق وچ تبدیلی کرو",
        "action-userrights-interwiki": "ورتن حقاں نوں دوجے وکیاں تے تبدیل کرو۔",
        "action-siteadmin": "ڈیٹابیس نوں کھولو یا بند کرو",
-       "action-sendemail": "ای-میلاں Ù¾Û\8cجÙ\88",
+       "action-sendemail": "ای-میلاں Ø¨Ú¾Û\8cجÙ\88",
        "nchanges": "$1 {{PLURAL:$1|change|تبدیلیاں}}",
        "enhancedrc-history": "پچھلا کم",
        "recentchanges": "نویاں تبدیلیاں",
        "rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
        "rcshowhideminor": "$1 معمولی تبدیلیاں",
        "rcshowhideminor-show": "وکھاو",
-       "rcshowhideminor-hide": "لکاؤ",
+       "rcshowhideminor-hide": "لُکاؤ",
        "rcshowhidebots": "$1 بوٹ",
        "rcshowhidebots-show": "وکھاؤ",
-       "rcshowhidebots-hide": "لکاؤ",
+       "rcshowhidebots-hide": "لُکاؤ",
        "rcshowhideliu": "$1 ورتن آلے اندر نیں",
-       "rcshowhideliu-hide": "لکاؤ",
+       "rcshowhideliu-hide": "لُکاؤ",
        "rcshowhideanons": "$1 گمنام ورتن والے",
        "rcshowhideanons-show": "وکھاو",
-       "rcshowhideanons-hide": "لکاؤ",
+       "rcshowhideanons-hide": "لُکاؤ",
        "rcshowhidepatr": "$1 ویکھی گئی لکھائی",
        "rcshowhidemine": "$1 میرے کم",
        "rcshowhidemine-show": "وکھاو",
-       "rcshowhidemine-hide": "لکاؤ",
+       "rcshowhidemine-hide": "لُکاؤ",
        "rclinks": "آخری $2 دناں دیاں $1 تبدیلیاں وکھاؤ<br />$3",
        "diff": "فرق",
        "hist": "پچھلا کم",
        "minoreditletter": "چھوٹا کم",
        "newpageletter": "نواں",
        "boteditletter": "بوٹ",
-       "number_of_watching_users_pageview": "[ $1 ویکہ ریا اے{{PLURAL:$1|ورتن والا|والے}}]",
+       "number_of_watching_users_pageview": "[ $1 ویکھ رہیا اے{{PLURAL:$1|ورتن والا|والے}}]",
        "rc_categories": "گٹھاں دی حد (وکھرے کرو \"|\")",
        "rc_categories_any": "کوئی",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹاں}} تبدیلی مگروں",
        "newsectionsummary": "/* $1 */ نواں پاسہ",
-       "rc-enhanced-expand": "لمبی کہانی وکھاؤ (جاوا سکرپٹ چائیدا اے)",
-       "rc-enhanced-hide": "لمبی کہانی لکاؤ",
+       "rc-enhanced-expand": "تفضیل وکھاؤ (جاوا سکرپٹ چائیدا اے)",
+       "rc-enhanced-hide": "تفضیل لکاؤ",
        "recentchangeslinked": "ملدیاں جلدیاں تبدیلیاں",
        "recentchangeslinked-feed": "ملدیاں جلدیاں تبدیلیاں",
        "recentchangeslinked-toolbox": "رلدیاں ملدیاں تبدیلیاں",
        "windows-nonascii-filename": "اے وکی فائل ناں جناں چ کوئی خاص کیریکٹر ہووے سپورٹ نئیں کردا۔",
        "fileexists": "اک فائل ایس ناں نال پہلے ای ہے مہربانی کرکے <strong>[[:$1]]</strong>  ویکھو\nاگر تھانوں یقین نئیں اگ تسیں اینون بدلنا چاندے اوہ۔\n[[$1|thumb]]",
        "filepageexists": "ایس فائل دا دسن والا صفہ پہلے ای <strong>[[:$1]]</strong> تے بنایا جاچکیا اے، پر این ناں دی کوئی فائل ایس ویلے نئیں ہیگی۔\nسمری جیہڑی تسیں لکھو گے اوہ دسن والے صفے تے نئیں دسے گی۔\nاپنی سموری اوتھے دیکھن لئی توانوں اپنے ہتھیں اینون تبدیل کرنا پوے گا۔\n[[$1|thumb]]",
-       "fileexists-extension": "ایس ناں دی شائل ہیگی اے: [[$2|thumb]]\n* چڑھائی گئی فائل دا ناں: <strong>[[:$1]]</strong>\n* ہیگی فائل دا ناں: <strong>[[:$2]]</strong>\nمہربانی کرکے وکھرا ناں چنو.",
+       "fileexists-extension": "ایس ناں دی فائل ہیگی اے: [[$2|thumb]]\n* چڑھائی گئی فائل دا ناں: <strong>[[:$1]]</strong>\n* ہیگی فائل دا ناں: <strong>[[:$2]]</strong>\nمہربانی کرکے وکھرا ناں چنو.",
        "fileexists-thumbnail-yes": "ایہ اک ناپ دی مورت دی فائل دسدی اے ''(تھمبنیل)''.\n[[$1|thumb]]\nمہربانی کرکے فائل ویکھو <strong>[[:$1]]</strong>.\nاگر ویکھی فائل اوسے مورت دے اصل ناپ دی اے تے فیر ایہ ضروری نئیں جے اک فالتو تھمبنیل چڑھائی جاۓ۔.",
        "file-thumbnail-no": "فائل ناں <strong>$1</strong> توں شروع ہوندا اے۔\nاے اک نکے ناپ دی مورت لگدی اے ''(تھمبنیل)''۔\nاگر تواڈے کول ایہ مورت پورے وڈے ناپ چ اے تسیں اینوں چڑھا سکدے او، نئیں تے فیر ایس فائل دا ناں بدلو۔",
        "fileexists-forbidden": "ایس ناں دی فائل پہلے ای ہیگی اے تے اودے اتے نئیں لکھیا جاسکدا۔\nاگر تسیں ہلے وی اپنی فائل چڑھاناں چاندے اوہ مہربانی کرکے نویں ناں نال چڑھاؤ۔\n[[File:$1|تھمب|وشکار|$1]]",
        "uploadwarning": "فائل چڑانے توں خبردار",
        "uploadwarning-text": "تھلے فائل بارے دس بدلو تے فیر کوشش کرو۔",
        "savefile": "فائل بچاؤ",
-       "uploaddisabled": "فائل چڑانا بند اے",
+       "uploaddisabled": "فائل چڑھانا بند اے",
        "copyuploaddisabled": "یو آر این لے چڑھانا نکارہ کیتا۔",
-       "uploaddisabledtext": "فائل چڑانے چ رکاوٹ اے۔",
+       "uploaddisabledtext": "فائل چڑھانے وچ رکاوٹ اے۔",
        "php-uploaddisabledtext": "پی ایچ پی چ فائل چڑھانا نکارہ کیتا ہویا جے۔\nمہربانی کرکے فائل چڑھان دی سیٹنک ویکھو۔",
-       "uploadscripted": "ایس فائل چ  ایچ ٹی ایم ایل یا سکرپٹ کوڈ ہیگا اے جینوں کسے ویب براؤزر نے غلط سمجیا ہووے۔",
+       "uploadscripted": "ایس فائل چ  ایچ ٹی ایم ایل یا سکرپٹ کوڈ ہیگا اے جینوں کسے ویب براؤزر نے غلط سمجھیا ہووے۔",
        "uploadvirus": "اس فائل چ وائرس اے! تفصیل: $1",
        "uploadjava": "ایہ فائل اک زپ فائل اے جیدے چ جاوا کلاس فائل اے۔\nجاوا فائلاں نوں چڑھان دی اجازت نئیں کیوں جے او بچاؤ ولاں توں بچ کے لنکدے نیں۔",
        "upload-source": "سورس فائل",
        "backend-fail-readonly": "سٹوریج بیکنڈ \"$1\"  ایس ویلے صرف پڑھیا جاسکدا اے۔ وجہ دتی اے: \"$2\"",
        "backend-fail-synced": "فائل \"$1\" اندرلے سٹوریح بیکنڈ چ اک کچی حالت چ اے۔",
        "backend-fail-connect": "سٹوریج بیکنڈ \"$1\" نال جوڑ ناں ہوسکیا۔",
-       "backend-fail-internal": "اک نان سمج ج ان والی غلطی سٹوریج بیکنڈ \"$1\" چ ہوؤی۔",
+       "backend-fail-internal": "اک ن سمجھ وچ آن والی غلطی سٹوریج بیکنڈ \"$1\" وچ ہوئی۔",
        "backend-fail-contenttype": "\"$1\" تے فائل نوں سٹور کرن لئی فائل دے اندر کی اے نئیں پتہ لگ سکیا۔",
        "backend-fail-batchsize": "سٹوریج بیکنڈ نوں $1 فائل دا بیچ {{PLURAL:$1|اوپریشن|اوپریشن}} دتا گیا؛ ایدی حد $2 {{PLURAL:$2|اوپریشن|اوپریشن}} جے۔",
        "lockmanager-notlocked": "\"$1\"  ناں کھولیا جاسکیا؛ اینوں تالا نئیں سی لگیا۔",
        "upload_source_file": " (تواڈے کمپیوٹر تے اک فائل)",
        "listfiles-summary": "ایس خاص صفے تے ساریاں چڑھائیاں فائلاں  دسیاں نیں۔\nجدوں ورتن والا اینوں فلٹر کرے، صرف اوہ فائلاں جتھے ورتن والے نیں نویں ورین دیاں فائلاں چڑھاغیاں ہون دسیاں جاندیاں نیں۔",
        "listfiles_search_for": "میڈیا نان نوں کھوجو:",
-       "imgfile": "فائل",
+       "imgfile": "تصویر",
        "listfiles": "فائل لسٹ",
        "listfiles_thumb": "نکی مورت",
        "listfiles_date": "تریخ",
        "listfiles_size": "ناپ",
        "listfiles_description": "تفصیل",
        "listfiles_count": "ورژن",
-       "file-anchor-link": "فائل",
+       "file-anchor-link": "تصویر",
        "filehist": "فائل ورتن",
        "filehist-help": "فائل نو اس ویلے دی حالت وچ ویکھن واسطے تاریخ/ویلے تے کلک کرو۔",
        "filehist-deleteall": "سب نوں مٹاؤ",
        "filehist-user": "ورتن والا",
        "filehist-dimensions": "پاسے",
        "filehist-filesize": "فائل دا ناپ",
-       "filehist-comment": "راۓ",
+       "filehist-comment": "رائے",
        "imagelinks": "فائل ورتن",
        "linkstoimage": "تھلے دتے گۓ {{PLURAL:$1|$1 صفے}} اس فائل نال جڑدے نے",
        "linkstoimage-more": "$1 توں چوکھے {{PLURAL:$1|صفہ جوڑ|صفہ جوڑ}} ایس فائل نوں۔\nتھلے دتی گئی لسٹ {{PLURAL:$1|پہلا صفہ جوڑ|پہلا $1 صفہ جوڑ}} ایس فائل نال دسدی اے۔\nاک خاص [[Special:WhatLinksHere/$2|پوری لسٹ]] ہیگی اے۔",
        "nolinkstoimage": "اس فائل نال جڑیا کوئی صفحہ نہیں۔",
        "morelinkstoimage": "ایس فائل نوں [[Special:WhatLinksHere/$1|ہور جوڑ]] ویکھو",
-       "linkstoimage-redirect": "$1 (فائل Ø±Û\8cÚ\88ائÛ\8cدکٹ) $2",
+       "linkstoimage-redirect": "$1 (فائل Ù\85Ú\91 Ø±Ø¬Ù\88ع) $2",
        "duplicatesoffile": "تھلے دتی گئی {{PLURAL:$1|فائل دوہری اے|1$ فائل دوہری نیں}} ایس فائل دیاں ([[Special:FileDuplicateSearch/$2|ہور گلاں]]) کاپی نیں۔",
        "sharedupload": "اے فائل $1 مشترکہ اپلوڈ اے تے اے دوجے منصوبے وی استعمال کر سکدے نے۔",
        "sharedupload-desc-there": "ایہ فائل $1 توں اے تے اینوں دوجے ویونت وی ورت سکدے نیں۔\nمہربانی کرکے [$2 فائل دس صفہ] ویکھو ہور دساں لئی۔",
        "download": "فائل کاپی کرو",
        "unwatchedpages": "اندیکھے صفحے",
        "listredirects": "لسٹ ریڈائریکٹس",
-       "unusedtemplates": "نا استعمال ہوۓ سچے",
+       "unusedtemplates": "نا استعمال ہوۓ سانچے",
        "unusedtemplatestext": "ایس صفے چ  سارے صفیاں دی لسٹ اے {{ns:ٹمپلیٹ}} تے جیہڑے کسے ہور صفے نال نئیں رلے۔  ٹمپلیٹ تے  ہور جوڑ ویکھ لو مٹان توں پہلے۔",
        "unusedtemplateswlh": "دوجے جوڑ",
        "randompage": "رلے ملے صفے",
        "statistics-header-pages": "صفے دے آنکڑے",
        "statistics-header-edits": "تبدیلیاں دا آنکڑہ",
        "statistics-header-users": "ورتن آلیاں دا سعاب کتاب",
-       "statistics-header-hooks": "دÙ\88جÛ\92 Ø³Ø¹اب کتاب",
+       "statistics-header-hooks": "دÙ\88جÛ\92 Ø­Ø³اب کتاب",
        "statistics-articles": "لسٹ صفے",
        "statistics-pages": "صفحے",
        "statistics-pages-desc": "اس وکی دے سارے صفحے، گل بات، اگے ٹور آلے تے دوجے صفحے ملا کے۔",
        "listusers-creationsort": "بنان تریخ توں وکھریاں کرو۔",
        "usereditcount": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "usercreated": "{{GENDER:$3|بنائی گئی}} نوں $1 تے $2",
-       "newpages": "نویں صفے",
+       "newpages": "نویں صفحے",
        "newpages-username": "ورتن آلا ناں:",
        "ancientpages": "سب توں پرانے صفے",
        "move": "لے چلو",
        "suppress": "چھڈیا گیا",
        "querypage-disabled": "اے صفہ ناکارہ کیتا گیا پرفارمنس وجہ توں۔",
        "booksources": "کتاب توں اتہ پتہ",
-       "booksources-search-legend": "اس مضمون تے کتاباں لبو",
+       "booksources-search-legend": "اس مضمون تے کتاباں لبھو",
        "booksources-search": "کھوج",
        "booksources-text": "تھلے اوناں جوڑاں دی لسٹ اے جتھے نویاں تے پرانیاں کتاباں وکدیاں نیں، تے ہور وی جانکاری ہوسکدی اے  کتاباں بارے تسیں ویکھدے او:",
        "booksources-invalid-isbn": "دتی گئی آئی ایس بی این چلدی نئیں لکدی ؛ اصل سورس نوں چیک کرو کاپی کرن توں پہلے۔",
        "activeusers-count": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}} پچھلے{{PLURAL:$3|دن|$3 دن}} چ",
        "activeusers-from": "ورتن والے ایس توں شروع ہون والے دسو:",
        "activeusers-noresult": "کوئی ورتن والا نئیں لبیا۔",
-       "listgrouprights": "ورتن ٹرلی حق",
+       "listgrouprights": "ورتن گروہ حق",
        "listgrouprights-summary": "تھلے اک لسٹ اے ورتن ٹولیاں دی ای وکی تے، اپنے رلدے حقاں نال۔ \n\nہربندے دے ح‍ق‍اں [[{{MediaWiki:Listgrouprights-helppage}}|ہور جانکاری]]",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">حق دتا گیا</span>\n* <span class=\"listgrouprights-revoked\">حق راپس</span>",
        "listgrouprights-group": "ٹولی",
        "listgrouprights-removegroup-self": "ہٹاؤ {{PLURAL:$2|ٹولی|ٹولیاں}} اپنے کھاتے چوں: $1",
        "listgrouprights-addgroup-self-all": "ساریاں ٹولیاں کٹھیاں کرو کھاتہ لئی",
        "listgrouprights-removegroup-self-all": "ایس کھاتے توں ساریاں ٹولیاں ہٹاؤ",
-       "mailnologin": "Ù\86اں Ù¾Û\8cØ­ Ù¾ØªÛ\81",
+       "mailnologin": "پتÛ\81 Ù\86ئÛ\8cÚº Ø¨Ú¾Û\8cجÛ\8cا",
        "mailnologintext": "تسیں لازمی [[Special:UserLogin|لاگان]] ہوو تے اک پکا ای-میل پتہ تواڈی [[Special:Preferences|تانگ]] چ ہووے تاں جے دوجے ورتن والے توانوں ای-میل کرسکن۔",
        "emailuser": "اس ورتن والے نو ای میل کرو",
        "emailpagetext": "تسیں تھلے دتا گیا فارم  ورت سکدے اوہ ایس ورتن والے نوں ای-میل سنیعہ کلن لئی۔ \nای-میل پتہ تساں [[Special:Preferences|تواڈے ورتن تانکآں]] چ پایا اے  ای-میل توں تواڈا پتہ دسے گا جتھے چٹھی چلی تاں جے چٹھی لین والا توانوں سدا جواب دے سکے۔",
        "emailnotarget": "لین والے ۂئی ناں ہون والا ورتن ناں۔",
        "emailtarget": "لین والے دا ورتن ناں لکھو",
        "emailusername": "ورتن آلے دا ناں:",
-       "emailusernamesubmit": "Ù¾Û\8cجÙ\88",
+       "emailusernamesubmit": "بھÛ\8cجÙ\88",
        "email-legend": "دوجے ورتن والے نوں {{سائٹ ناں}} ای-میل پیجو",
        "emailfrom": "توں:",
        "emailto": "نوں:",
        "emailsubject": "مضمون:",
-       "emailmessage": "سنیعا:",
-       "emailsend": "Ù¾Û\8cجÙ\88",
-       "emailccme": "میرے سنیعÛ\92 Ø¯Û\8c Ù\85Û\8cÙ\86Ù\88Úº Ø§Ú© Ø§Û\8c\85Û\8cÙ\84 Ú©Ø§Ù¾Û\8c Ù¾Û\8cجÙ\88Û\94",
-       "emailccsubject": "تھواڈے سنیعے دی کاپی $1 نوں:$2",
-       "emailsent": "ای-میل Ù¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8cÛ\94",
-       "emailsenttext": "تھواڈا ای-میل سنیعہ پیج دتا گیا اے۔",
+       "emailmessage": "سنیہہ:",
+       "emailsend": "بھÛ\8cجÙ\88",
+       "emailccme": "میرے سنیÛ\81Û\92 Ø¯Û\8c Ù\85Û\8cÙ\86Ù\88Úº Ø§Ú© Ø§Û\8c\85Û\8cÙ\84 Ú©Ø§Ù¾Û\8c Ø¨Ú¾Û\8cجÙ\88Û\94",
+       "emailccsubject": "تھواڈے سنیہے دی کاپی $1 نوں:$2",
+       "emailsent": "ای-میل Ø¨Ú¾Û\8cج Ø¯ØªÛ\8c Ú¯Ø¦Û\8cÛ\94",
+       "emailsenttext": "تھواڈا ای-میل سنیہہ پیج دتا گیا اے۔",
        "emailuserfooter": "ایہ ای-میل $1 نے پیجی $2  نوں {{SITENAME}} تے \"ای-میل ورتن\" فنکشن نال",
-       "usermessage-summary": "پربندھ چھڈن سنیعہ",
+       "usermessage-summary": "پربندھ چھڈن سنیہہ",
        "usermessage-editor": "پربندھ ڈاکیا۔",
        "watchlist": "میریاں اکھاں تھلے رکھی لسٹ",
        "mywatchlist": "میری اکھ تھلے رکھی لسٹ",
        "watchlistfor2": "$1 تے $2 ل‏ی",
        "nowatchlist": "تھواڈی اکھ تھلے لسٹ چ کوئی شے نئیں۔",
        "watchlistanontext": "مہربانی کرکے $1 نوں ویکھو یا اپنی اکھ تھلے رکھی لسٹ نوں بدلو۔",
-       "watchnologin": "لاگ ان نئیں ہوۓ او",
+       "watchnologin": "لاگ ان نئیں ہوئے او",
        "addwatch": "اکھ تھلے کرو",
        "addedwatchtext": "اے صفحہ \"[[:$1]] تواڈیاں اکھاں تھلے آگیا اے۔<br />\nمستقبل وچ اس صفحہ تے ایدے بارے چ گل بات نویاں تبدیلیاں وچ موٹے نظر آن گے تا کہ آسانی نال کھوجیا جا سکے۔",
        "removewatch": "اکھ تھلیوں ہٹاؤ",
        "protectlogpage": "بچت لاگ",
        "protectlogtext": "تھلے صفے نوں بچان لئی تبدیلیاں دی لسٹ اے۔\n[[Special:ProtectedPages|بچاۓ صفیاں دی لسٹ]] ویکھو ہن دے اوپریشنل صفیاں دے بچاؤ دی لسٹ ویکھو۔",
        "protectedarticle": "\"[[$1]]\" بچایا گیا اے",
-       "modifiedarticleprotection": "\"[[$1]]\" آستے بچاؤ بدلیا",
+       "modifiedarticleprotection": "\"[[$1]]\" واسطے بچاؤ بدلیا",
        "unprotectedarticle": "\"[[$1]]\" توں بچاؤ ہٹا لیا گیا۔",
        "movedarticleprotection": "بچاؤ سیٹنگ \"[[$2]]\" توں \"[[$1]]\" ول پلٹی۔",
        "protect-title": "\"$1\" لئی بچاؤ پدھر تبدیل۔",
        "protect-cantedit": "تسی اس صفحے دے حفاظتی درجے نوں نہیں بدل سکدے کیونکہ توانوں اس کم دی اجازت نہیں اے۔",
        "protect-othertime": "دوجے ویلے:",
        "protect-othertime-op": "دوجے ویلے:",
-       "protect-existing-expiry": "ہن دا مکن ویاہ: $3، $2",
+       "protect-existing-expiry": "مُکن ویلہ حالے ہیگا اے: $3، $2",
        "protect-otherreason": ":دوجی وجہ",
        "protect-otherreason-op": "ہور وجہ",
        "protect-dropdown": "*بچاؤ دیاں عام وجہاں\n** زیادہ وینڈالزم\n** زیادہ سپامنگ\n**  بے مقصد لکھت چگڑے\n** زیادہ ویکھیا جان والا صفہ",
        "restriction-edit": "لکھو",
        "restriction-move": "لے چلو",
        "restriction-create": "بناؤ",
-       "restriction-upload": "اتے چاڑو",
+       "restriction-upload": "اُتے چاڑھو",
        "restriction-level-sysop": "پوری طرح بچایا ہویا",
        "restriction-level-autoconfirmed": "کج بچایا گیا",
        "restriction-level-all": "کسے وی درجے تے",
        "undelete-cleanup-error": "ناں ورتی گئی آرکائیو فائل \"$1\" دے مٹانے چ غلطی۔",
        "undelete-missing-filearchive": "فائل آرکائیو آئی ڈی $1 نوں واپس کرن چ ناکامی کیوں جے اے ڈیٹابیس نئیں اے۔\nخورے اے پہلے ای مٹ چکی ہووے۔",
        "undelete-error": "مٹاۓ صفے واپس لیان چ غلطی",
-       "undelete-error-short": "Ù\81اغÙ\84 Ù\88اپس Ú©Ø±Ù\86 چ غلطی: $1",
+       "undelete-error-short": "Ù\81ائÙ\84 Ù\88اپس Ú©Ø±Ù\86 Ù\88چ غلطی: $1",
        "undelete-error-long": "فائل واپس کرن  لگیاں غلطیاں ہوئیاں:\n$1",
        "undelete-show-file-confirm": "تساں نوں کیا پک اے جے تسیں فائل \"<nowiki>$1</nowiki>\" دی مٹائی ریوین  $2 توں $3 تک ویکھنا چاندے او؟",
        "undelete-show-file-submit": "ہاں جی",
        "month": "مہینے توں (تے پہلاں):",
        "year": "سال توں (تے پہلاں):",
        "sp-contributions-newbies": "صرف نویں ورتن والیاں دے کم وکھاؤ",
-       "sp-contributions-newbies-sub": "نویں کھاتیاں آستے",
-       "sp-contributions-newbies-title": "نویں کھاتے چ ورتن والے دے کم",
+       "sp-contributions-newbies-sub": "نویاں کھاتےآں واسطے",
+       "sp-contributions-newbies-title": "نویں کھاتے وچ ورتن والے دے کم",
        "sp-contributions-blocklog": "لاگ روکو",
        "sp-contributions-deleted": "ورتن والے دے کم مٹادتے گۓ۔",
        "sp-contributions-uploads": "چڑھائیاں فائلاں",
        "sp-contributions-logs": "لاگز",
        "sp-contributions-talk": "گل بات",
-       "sp-contributions-userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø³Ø¹اب کتاب",
+       "sp-contributions-userrights": "Ù\88رتÙ\86 Ù\88اÙ\84Û\8cاں Ø¯Û\92 Ø­Ù\82اں Ø¯Ø§ Ø­Ø³اب کتاب",
        "sp-contributions-blocked-notice": "ایس ورتن والے تے اجکل روک اے۔ \nروکن لاگ چ ایدے بارے تھلے لکھیا اے۔",
        "sp-contributions-blocked-notice-anon": "ایس آئی پی پتے تے اجکل روک اے۔ \nروکن لاگ چ ایدے بارے تھلے لکھیا اے۔",
-       "sp-contributions-search": "حصے پان آلیاں دی تلاش",
+       "sp-contributions-search": "حصے پاؤن آلیاں دی تلاش",
        "sp-contributions-username": "آئی پی پتہ یا ورتن آلا ناں:",
        "sp-contributions-toponly": "صرف اوہ تبدیلیاں وکھاؤ جیہڑیاں سب توں نیڑے ویلے ہویاں نیں۔",
        "sp-contributions-submit": "کھوجو",
        "whatlinkshere": "ایتھے کیدا جوڑ اے",
-       "whatlinkshere-title": "اÙ\88 ØµÙ\81Û\92 Ø¬Û\8cڑے \"$1\" نال جڑے نیں",
+       "whatlinkshere-title": "اÙ\88 ØµÙ\81Û\92 Ø¬Û\81ڑے \"$1\" نال جڑے نیں",
        "whatlinkshere-page": "صفہ:",
        "linkshere": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''[[:$1]]''':",
        "nolinkshere": "'''[[:$1]]''' دے نال کسے دا جوڑ نہیں",
        "whatlinkshere-prev": "{{PLURAL:$1|پچھلا $1ا|پچھلا}}",
        "whatlinkshere-next": "{{PLURAL:$1|اگلا $1|اگلا}}",
        "whatlinkshere-links": "← جوڑ",
-       "whatlinkshere-hideredirs": "$1 ریڈائریکٹس",
+       "whatlinkshere-hideredirs": "$1 ریڈائریکٹ",
        "whatlinkshere-hidetrans": "$1 ٹرانسکلوژن",
        "whatlinkshere-hidelinks": "$1 جوڑ",
        "whatlinkshere-hideimages": "$1 مورت جوڑ",
        "ipb-unblock": "ورتن والا یا آئی پی پتہ کھولو",
        "ipb-blocklist": "روکیاں گياں نوں ویکھو",
        "ipb-blocklist-contribs": "$1 دے کم",
+       "ipb-blocklist-duration-left": "سجے",
        "unblockip": "ورتن آلے تے روک بند کرو",
        "unblockiptext": "تھلے دتا گیا فارم ورتو لکھن دی ازادی لین لئی پہلاں توں روکے آئی پی پتے  یا ورتن ناں لئی۔",
        "ipusubmit": "ایس روک نوں ہٹاؤ",
        "semiprotectedpagemovewarning": "'''نوٹ:''' ایہ صفہ نوں بچایا گیا اے تاں جے کھاتے والے ورتن والے ای اینوں ایتھں لجا سکن۔\nآخری لاگ انٹری اتے پتے لئی تھلے دتی گئی اے:",
        "move-over-sharedrepo": "== فائل ہیگی ==\nفائل نون ایس ٹائٹل[[:$1]]  ول لجانا اک ہور فائل تے اینوں چڑھا دے گا۔.",
        "file-exists-sharedrepo": "جیہڑا فائل ناں چنیاں گیا جے اوہ پہلے ای اک سانجی چ ورتیا جاریا اے۔\nمہربانی کرکے اک ہور ناں چنو۔",
-       "export": "صفحے باہر Ù¾Û\8cجÙ\88",
+       "export": "صفحے باہر Ø¨Ú¾Û\8cجÙ\88",
        "exporttext": "تسیں اے لکھت اگے پیج سکدے او تے لکھت تریخ اک خاص صفے دی یا کسے ایکس ایم ایل چ صفیاں صفیاں چ لپیٹی۔ اے کسے ہور وکی چ وی لیایا جاسکدا اے میڈیاوکی ورتدیاں [[Special:Import|صفے لیاؤ]] دی راہ۔\n\nصفے بار لجان لئی، تھلے دتے گۓ لکھت ڈبے چ سرناواں لکھو، اک سرناواں اک لائن چ  اور چنوں کیا جے تسیں  ہن دی ریوین چاندے پرانیاں دے ناۂ نال، رکارڈ صفہ لین چ، یا ہن دی ریوین  آخری تبدیلی دی جانکاری نال۔\n\nدوجے کیس چ تسیں جوڑ وی ورت سکدے او، ادھارن لئی [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صفہ \"[[{{MediaWiki:Mainpage}}]]\" لئی۔",
        "exportall": "سارے صفے لجاؤ",
        "exportcuronly": "صرف ہن والیاں ریوین نال نئں۔ پورا ریکارڈ نیں۔",
        "export-download": "فائل دے طور تے بچاؤ",
        "export-templates": "سچہ شامل کرو",
        "export-pagelinks": "جوڑ والے صفے جوڑو ایتھوں تک:",
-       "allmessages": "سسٹم سنیآ",
+       "allmessages": "سسٹم سنیہہ",
        "allmessagesname": "ناں",
        "allmessagesdefault": "ڈیفالٹ لکھائی",
        "allmessagescurrent": "موجودہ لکھائی",
        "importfailed": "لیانا فیل: <nowiki>$1</nowiki>",
        "importunknownsource": "انجان لیان سورس ٹائپ",
        "importcantopen": "لیاندی گئی فائل نئیں کھولی جاسکی",
-       "importbadinterwiki": "Ù¾Û\8cÚ\91ا Ø§Ù\86ٹرÙ\88Ú©Û\8c Ù\84Ù\86Ú©",
+       "importbadinterwiki": "بھÛ\8cÚ\91ا Ø§Ù\86ٹرÙ\88Ú©Û\8c Ù\84Ù\86Ú©",
        "importsuccess": "لے کے آگۓ آں!",
        "importnosources": "کوئی ٹرانسوکی امپورٹ سورسز نئیں دسیا گیا تے ڈائرکٹ رکارڈ چڑھاۓ کم نئیں کر رۓ۔",
        "importnofile": "لیاندی ہوئی کوئی فائل نئیں چڑہائی گئی۔",
        "import-error-special": "\"$1\" صفہ نئیں لیایا گیا کیوں جے ایہ اک خاص ناں تھان توں نال جڑدا اے جیءرا صفیاں لئی نئیں۔",
        "import-error-invalid": "\"$1\" صفہ نئیں لیایا گیا ایدا ناں نئیں رکھیا جاسکدا۔",
        "importlogpage": "لاگ لے کے آؤ",
-       "importlogpagetext": "پربنھک لیان صفیاں دا ایڈٹ رکارڈ نال دوجے وکیاں توں۔",
+       "importlogpagetext": "پربندھک لیان صفیاں دا ایڈٹ رکارڈ نال دوجے وکیاں توں۔",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|ریوین|ریویناں}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ریوین|ریویناں }} $2 توں",
        "javascripttest": "JavaScript ٹیسٹنگ",
        "tooltip-ca-talk": "اس صفے بارے گل بات",
        "tooltip-ca-edit": "اس صفے تے لکھو",
        "tooltip-ca-addsection": "اس گل بات وچ حصہ لے لو۔",
-       "tooltip-ca-viewsource": "اے صفہ بچایا گیا اے۔\nتسی اینو صرف ویکھ سکدے او۔",
-       "tooltip-ca-history": "اس صفے دا پرانہ ورژن۔",
+       "tooltip-ca-viewsource": "اے صفہ بچایا گیا اے۔\nتسی اینوں صرف ویکھ سکدے او۔",
+       "tooltip-ca-history": "اس صفے دا پرانا ورژن۔",
        "tooltip-ca-protect": "اس صفے نوں بچاؤ",
        "tooltip-ca-unprotect": "ایس صفے دا بچاؤ بدلو۔",
        "tooltip-ca-delete": "اس صفے نوں مٹاؤ",
        "tooltip-ca-watch": "اس صفحہ تے نظر رکھو",
        "tooltip-ca-unwatch": "اس صفحے توں نظر ہٹاؤ",
        "tooltip-search": "کھوج {{SITENAME}}",
-       "tooltip-search-go": "اس Ù\86اں Ø¯Û\92 ØµÙ\81Û\92 ØªÛ\92 Ú\86Ù\84Ù\88Ø\8c Ø§Ú¯Ø± ایہ ہیگا اے",
-       "tooltip-search-fulltext": "اس شبد نوں صفیاں چ لبو",
-       "tooltip-p-logo": "پہلا صفہ",
+       "tooltip-search-go": "اس Ù\86اں Ø¯Û\92 ØµÙ\81Û\92 ØªÛ\92 Ú\86Ù\84Ù\88Ø\8c Ø¬Û\92 ایہ ہیگا اے",
+       "tooltip-search-fulltext": "اس شبد نوں صفحےآں وچ لبھو",
+       "tooltip-p-logo": "پہلا صفہ ویکھو",
        "tooltip-n-mainpage": "پہلے صفے نوں ویکھو",
        "tooltip-n-mainpage-description": "پہلے صفے تے جاؤ",
-       "tooltip-n-portal": "پربندھ بارے ، تسیں کی کر سکدے او تے کنج کھوج سکدے او",
+       "tooltip-n-portal": "پربندھ بارے ، تسیں کیہ کر سکدے او تے کنج کھوج سکدے او",
        "tooltip-n-currentevents": "موجودہ حالات تے پچھلیاں معلومات دیکھو",
        "tooltip-n-recentchanges": "وکی تے نویاں تبدیلیاں۔",
        "tooltip-n-randompage": "کوئی صفہ کھولو۔",
-       "tooltip-n-help": "Ù\85دد Ù\84Û\8cÙ\86Û\92 Ø¢Ù\84ی جگہ۔",
+       "tooltip-n-help": "Ù\84بھÙ\86 Ø¯ی جگہ۔",
        "tooltip-t-whatlinkshere": "اس نال جڑے سارے وکی صفے۔",
        "tooltip-t-recentchangeslinked": "اس صفے توں جڑے صفیاں چ نویاں تبدیلیاں",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-t-emailuser": "اس ورتن والے نو ای میل کرو",
        "tooltip-t-upload": "فائل چڑھاؤ",
        "tooltip-t-specialpages": "سارے خاص صفیاں دی اک لسٹ",
-       "tooltip-t-print": "اس صفے دا چھپنے آلا ورژن ویکھو",
+       "tooltip-t-print": "اس صفحے دا چھپن والا ورژن ویکھو",
        "tooltip-t-permalink": "اس صفے دے اس ورژن نال پکا جوڑ",
        "tooltip-ca-nstab-main": "مواد آلا صفہ ویکھو",
        "tooltip-ca-nstab-user": "ورتن آلے دا صفہ ویکھو",
        "tooltip-ca-nstab-special": "ایہ اک خاص صفہ اے، تے ایہنوں لکھیا نئی جا سکدا۔",
        "tooltip-ca-nstab-project": "وینت دا صفہ ویکھو",
        "tooltip-ca-nstab-image": "فائل دا صفہ ویکھو",
-       "tooltip-ca-nstab-mediawiki": "پربÙ\86دھ Ø³Ù\86Û\8cعہ ویکھو",
+       "tooltip-ca-nstab-mediawiki": "Ù\86ظاÙ\85Û\8c Ø³Ù\86Û\8cÛ\81ہ ویکھو",
        "tooltip-ca-nstab-template": "سانچہ ویکھو",
        "tooltip-ca-nstab-help": "مدد دا صفحہ ویکھو",
        "tooltip-ca-nstab-category": "کیٹاگری آلا صفہ ویکھو",
        "spamprotectiontitle": "سپام بچاؤ فلٹر",
        "spamprotectiontext": "لکھت جیہڑی تسی بچانا چاندے او اونوں سپام فلٹر نے روکیا اے۔\nایہ خورے کسے جوڑ دی بارلے  بلیکلسٹڈ سائٹ نال ہون توں ہوئی اے۔",
        "spamprotectionmatch": "تھلے دتی گئی لکھت نے ساڈے سپام فلٹر نوں چلایا: $1",
-       "spambot_username": "Ù\85Û\8cÚ\88Û\8cاÙ\88Ú©Û\8c Ø³Ù¾Ø§Ù\85 Ø³فائی",
+       "spambot_username": "Ù\85Û\8cÚ\88Û\8cاÙ\88Ú©Û\8c Ø³Ù¾Ø§Ù\85 Øµفائی",
        "spam_reverting": "آخری ریوین ول جیدے چ $1 دے جوڑ ناں ہون۔",
        "spam_blanking": "سارے ریوین جناں چ $1 نوں جوڑ نیں، طاف کیتا جاریا اے۔",
        "simpleantispam-label": "سپام روک پھاٹک\nDo <strong>not</strong> fill this in!",
        "pageinfo-watchers": "ویکھن والے",
        "pageinfo-edits": "تبدیلیاں گنتی",
        "pageinfo-authors": "وکھرے لکھاریاں دی گنتی",
-       "pageinfo-toolboxlink": "صفہ وات",
+       "pageinfo-toolboxlink": "صفحہ جانکاری",
        "markaspatrolleddiff": "ویکھے گۓ دا نشان لاؤ",
        "markaspatrolledtext": "ایس صفے تے ویکھن دا نشان لاؤ",
        "markedaspatrolled": "ویکھن دا نشان لاؤ",
        "file-info": "فائل ناپ: $1، MIME  ٹائپ: $2",
        "file-info-size": "پکسل:$1 × $2, فائل سائز: $3, مائم ٹائپ: $4",
        "file-info-size-pages": "$1 × $2 پکسل, فائل ناپ: $3, مائم ٹائپ: $4, $5 {{PLURAL:$5|صفہ|صفے}}",
-       "file-nohires": "اس ØªÙ\88Úº Ù\88Ú\88Û\8c Ù\81Ù\88Ù¹Ù\88 موجود نہیں۔",
+       "file-nohires": "اس ØªÙ\88Úº Ù\88Ú\88Û\8c Ù\85Ù\88رت موجود نہیں۔",
        "svg-long-desc": "ایس وی جی فائل، پکسل:$1 × $2، فائل سائز: $3",
        "show-big-image": "اصلی فائل",
        "show-big-image-preview": "ایس وکھالے دا ناپ: $1۔",
        "watchlisttools-view": "ملدیاں ہوئیاں تبدیلیاں ویکھو",
        "watchlisttools-edit": "اکھ تھلے رکھے ہوۓ صفحیاں نوں ویکھو تے تبدیل کرو",
        "watchlisttools-raw": "کچی اکھ تھلے رکھی ہوئی نو تبدیل کرو",
+       "hijri-calendar-m1": "محرم",
+       "hijri-calendar-m2": "صفر",
+       "hijri-calendar-m3": "ربیع الاول",
+       "hijri-calendar-m4": "ربیع الثانی",
+       "hijri-calendar-m5": "جمادی الاول",
+       "hijri-calendar-m6": "جمادی الثانی",
+       "hijri-calendar-m7": "رجب",
+       "hijri-calendar-m8": "شعبان",
+       "hijri-calendar-m9": "رمضان",
+       "hijri-calendar-m10": "شوال",
+       "hijri-calendar-m11": "ذوالقعدہ",
+       "hijri-calendar-m12": "ذوالحجہ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "duplicate-defaultsort": "'''خبردار:''' ڈیفالٹ چابی \"$2\" پہلی ڈیفالٹ چابی \"$1\" دے اتے لگ گئی اے۔",
        "version": "ورژن",
        "feedback-thanks": "شکریہ ! تواڈی صلاع  صفہ \"[$2 $1]\" تے چاڑ دتی گئی اے۔",
        "searchsuggest-search": "کھوج",
        "searchsuggest-containing": "بند کر ریا اے۔۔۔",
-       "api-error-badaccess-groups": "تھوانوں ایس وکی تے فائلاں چڑھان دی اجازت نئیں۔",
        "api-error-badtoken": "اندر دی غلطی: برا ٹوکن",
-       "api-error-copyuploaddisabled": "یو آر ایل نال فائل چڑھانا ایس سرور تے نکام",
-       "api-error-duplicate": "ایتھے {{PLURAL:$1|ہے اک ہور فائل|ہین کچ ہور فائلاں}} ایسے مواد نال ایس تھاں تے پہلے ای ہے۔",
-       "api-error-duplicate-archive": "ایتھے  {{PLURAL:$1|سی اک ہور فائل|سن کج ہور فائلاں}} پہلے ای ایس تھاں تے اے اکو جے مواد نال پر {{PLURAL:$1|اے سی|اوہ سن}} مٹایا گیا۔",
-       "api-error-empty-file": "جیڑی فائل تسی دسی اے اوہ حالی اے۔",
        "api-error-emptypage": "نواں بناریا آن، خالی صفیاں دی اجازت نئیں۔",
-       "api-error-fetchfileerror": "اندر دی غلطی: فائل لیندیاں کوئی غلطی ہوئی۔",
-       "api-error-file-too-large": "جیڑی فائل تسی دسی اے اوہ بوت وڈی اے۔",
-       "api-error-filename-tooshort": "اس فائل دا ناں بوت چھوٹا اے۔",
-       "api-error-filetype-banned": "اس قسم دی فائل تے پابندی اے۔",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|اینج دی فائل دی اجازت نئیں|اینج دیاں فائلاں دی اجازت نئیں}} اجازت دتی {{PLURAL:$3|فائل ٹائپ اے|فائل ٹائپ نیں}} $2۔",
-       "api-error-filetype-missing": "فائل چ ایکسٹنشن نئیں اے۔",
-       "api-error-hookaborted": "جیڑی تبدیلی تسی کرنا چاہی اے، اونوں اک ایکسٹنشن کنڈے نیں بند کردتا اے۔",
-       "api-error-http": "انٹرنیٹ ئلطی: سرور نال کوئی جوڑ نئیں۔",
-       "api-error-illegal-filename": "اس فائل دے ناں تے پابندی اے۔",
-       "api-error-internal-error": "اندر دی غلطی:  تواڈے وکی تے چڑھاندیاں کوئی غلطی ہوئی اے۔",
-       "api-error-invalid-file-key": "اندر دی غلطی: فائل ناں لبی کچے سٹور ج",
-       "api-error-missingparam": "اندر دی غلطی: غیب پیرامیٹرز منگن تے۔",
-       "api-error-missingresult": "اندر دی غلطی: سعاب نئیں لاسکدے جے کاپی چلے گی۔",
-       "api-error-mustbeloggedin": "فائلاں اپلوڈ کرن واسطے توانوں لاگ ان کرنا ضروری اے۔",
-       "api-error-mustbeposted": "اندر دی غلطی: ایچ ٹیٹیپی پوسٹ چائیدی اے۔",
-       "api-error-noimageinfo": "فائل چڑھانا کامیاب، پر سرور نے فائل بارے سانوں کوئی دس نئیں پیجی۔",
-       "api-error-nomodule": "انٹنیٹ غلطی: فائل چڑھان والا موڈیول سیٹ ںئیں",
-       "api-error-ok-but-empty": "انٹرنیٹ غلطی: سرور ولوں کوئی جواب نئیں۔",
-       "api-error-overwrite": "اک ہونی فائل تے ہور لکھن دی اجازت نئیں۔",
        "api-error-stashfailed": "اندر دی غلطی: سرور کچیاں فائلاں نوں رکھن چ نکام۔",
-       "api-error-timeout": "سرور نے توقع رکھے ویلے ج جواب نئیں دتا۔",
-       "api-error-unclassified": "اک انجان غلطی ہوگئی اے۔",
-       "api-error-unknown-code": "انجان غلطی:\"$1\"",
-       "api-error-unknown-error": "اندر دی غلطی: کوئی چیز غلط ہوئی جدوں تسی فائل چڑھاندے سی۔",
        "api-error-unknown-warning": "انجان خبرداری: $1",
        "api-error-unknownerror": "انجان غلطی : \"$1\"۔",
-       "api-error-uploaddisabled": "فائل جڑھانا ایس وکی تے بند اے۔",
-       "api-error-verification-error": "اے فائل کرپٹ ہو سکدی یا فیر ایدا فارمیٹ غلط اے۔",
        "special-characters-group-latin": "لاطینی",
        "special-characters-group-latinextended": "ودویں لاطینی",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-gujarati": "گجراتی",
        "special-characters-group-thai": "تھائی",
        "special-characters-group-lao": "لاؤ",
-       "special-characters-group-khmer": "کھیمر"
+       "special-characters-group-khmer": "کھیمر",
+       "mw-widgets-titleinput-description-redirect": "مڑ رجوع $1 نوں"
 }
index ab2c9ff..fe83af4 100644 (file)
        "uploaddisabledtext": "د دوتنې پورته کولو آسانتياوې ناچارن شوي.",
        "php-uploaddisabledtext": "په PHP کې دوتنې پورته کېدنې ناچارن شوي.\nلطفاً د file_uploads امستنې وڅارئ.",
        "uploadscripted": "دا دوتنه د HTML يا سکرېپټ کوډ لري چې کېدای شي په تېروتنه د جال يو کتنمل له خوا تفسير شوې وي.",
-       "uploadscriptednamespace": "د SVG دا دوتنه يو ناقانونه نومتشيال لري \"$1\".",
+       "uploadscriptednamespace": "د SVG دا دوتنه يو ناقانونه نومتشيال لري \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "د پورته شوې دوتنې XML نه شي تحليل کېدلی.",
        "uploadvirus": "دا دوتنه ويروس لري! تفصيل: $1",
        "upload-source": "سرچينيزه دوتنه",
        "feedback-thanks-title": "مننه!",
        "feedback-useragent": "کارن پلاوی:",
        "searchsuggest-search": "پلټل",
-       "api-error-badaccess-groups": "تاسې دې ويکي کې د دوتونو ورپورته کولو پرېښه نه لرۍ.",
-       "api-error-empty-file": "کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.",
        "api-error-emptypage": "د نوي تشو مخونو جوړولو پرېښنه نه شته.",
-       "api-error-file-too-large": "کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.",
-       "api-error-filename-tooshort": "د دوتنې نوم ډېر لنډ دی.",
-       "api-error-filetype-banned": "په دې ډول دوتنې بنديز دی.",
-       "api-error-filetype-missing": "دوتنې نوم يو شاتاړی نه لري.",
-       "api-error-illegal-filename": "د دوتنې نوم نه دی پرېښل شوی.",
-       "api-error-mustbeloggedin": "د دوتنو د پورته کولو لپاره بايد تاسې غونډال کې ننوتلی اوسۍ.",
-       "api-error-unclassified": "يوه ناڅرگنده تېروتنه رامېنځته شوه.",
-       "api-error-unknown-code": "ناڅرگنده تېروتنه: \"$1\"",
        "api-error-unknown-warning": "ناڅرگنده گواښنه: \"$1\".",
        "api-error-unknownerror": "ناڅرگنده تېروتنه: \"$1\".",
-       "api-error-uploaddisabled": "په دې ويکي باندې پورته کېدنې ناچارنې شوي.",
-       "api-error-verification-error": "کېدای شي دا دوتنه خرابه وي او يا هم ناسم شاتاړی ولري.",
        "duration-seconds": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
        "duration-minutes": "$1 {{PLURAL:$1|دقيقه|دقيقې}}",
        "duration-hours": "$1 {{PLURAL:$1|گړۍ|گړۍ}}",
index a57aeaf..2250b88 100644 (file)
                        "Bruno.S.Alves 270",
                        "!Silent",
                        "Joao Xavier",
-                       "Nahime2015"
+                       "Nahime2015",
+                       "Alex Great"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
        "missingcommenttext": "Por favor, introduzida um comentário abaixo.",
        "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
-       "summary-preview": "Previsão do resumo:",
+       "summary-preview": "Previsão do resumo de edição:",
        "subject-preview": "Previsão do assunto/título:",
        "previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
        "blockedtitle": "O usuário está bloqueado",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registrada.\nVerifique se deseja mesmo criar/editar esta página.",
        "userpage-userdoesnotexist-view": "A conta de usuário \"$1\" não está registrada.",
        "blocked-notice-logextract": "Este usuário está atualmente bloqueado.\nO registro de bloqueio mais recente é fornecido abaixo, para referência:",
-       "clearyourcache": "<strong>Nota:</strong> Após salvar, você pode ter que limpar o \"cache\" do seu navegador para ver as alterações.\n*<strong>Firefox / Safari:</strong> Pressione <em>Shift</em> enquanto clica <em>Recarregar</em>, ou pressione <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> no Mac)\n*<strong>Google Chorme:</strong> Pressione <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> no Mac)\n* <strong>Internet Explorer:</strong> Pressione<em>Ctrl</em> enquanto clica <em>Recarregar</em>, ou Pressione <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vá para <em>Menu → Configurações</em> (<em>Opera → Preferencias</em> no Mac) e depois para <em>Privacidade e Segurança → Limpar dados de navegação → Imagens e arquivos em cache</em>.",
+       "clearyourcache": "<strong>Nota:</strong> Após salvar, você pode ter que limpar o \"cache\" do seu navegador para ver as alterações.\n*<strong>Firefox / Safari:</strong> Pressione <em>Shift</em> enquanto clica <em>Recarregar</em>, ou pressione <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> no Mac)\n*<strong>Google Chrome:</strong> Pressione <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> no Mac)\n* <strong>Internet Explorer:</strong> Pressione<em>Ctrl</em> enquanto clica <em>Recarregar</em>, ou Pressione <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vá para <em>Menu → Configurações</em> (<em>Opera → Preferencias</em> no Mac) e depois para <em>Privacidade e Segurança → Limpar dados de navegação → Imagens e arquivos em cache</em>.",
        "usercssyoucanpreview": "'''Dica:''' Utilize o botão \"{{int:showpreview}}\" para testar seu novo CSS antes de salvar.",
        "userjsyoucanpreview": "'''Dica:''' Utilize o botão \"{{int:showpreview}}\" para testar seu novo JavaScript antes de salvar.",
        "usercsspreview": "'''Lembre-se de que você está apenas previsualizando o seu CSS particular.'''\n'''Ele ainda não foi salvo!'''",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
+       "search-interwiki-more-results": "Mais resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} <strong>[[User:$1|$1]]</Strong> $2",
        "viewinguserrights": "Visualizar os privilégios {{GENDER:$1|do usuário|da usuária}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
-       "userrights-viewusergroup": "Ver grupos de usuários",
+       "userrights-viewusergroup": "Ver grupos de {{GENDER:$1|usuários}}",
        "saveusergroups": "Salvar grupos de{{GENDER:$1|usuário}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
        "userrights-expiry-options": "1 dia:1 day,1 semana:1 week,1 mês:1 month,3 meses:3 months,6 meses:6 months,1 ano:1 year",
        "userrights-invalid-expiry": "O tempo de expiração para o grupo \"$1\" é inválido.",
        "userrights-expiry-in-past": "O tempo de expiração para o grupo \"$1\" está no passado.",
+       "userrights-cannot-shorten-expiry": "Você não pode antecipar a expiração do grupo \"$1\". Somente usuários com permissão para adicionar e remover este grupo pode apresentar tempos de expiração.",
        "userrights-conflict": "Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.",
        "group": "Grupo:",
        "group-user": "Usuários",
        "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-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-filtergroup-registration": "Registro de usuário",
        "rcfilters-filter-registered-label": "Registrado",
        "uploaded-setting-handler-svg": "A configuração do atributo \"handler\" com destino remoto/de dados/<i>script</i> em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
        "uploaded-remote-url-svg": "A configuração de qualquer atributo de estilo com um URL remoto em arquivos SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no arquivo SVG carregado.",
        "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com o URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no arquivo SVG carregado.",
-       "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
+       "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.",
        "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1",
        "uploadjava": "Este é um arquivo ZIP que contém um arquivo .class de Java.\nNão é permitido o upload de arquivos Java já que eles podem contornar as restrições de segurança.",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Adicione mais...",
        "sessionmanager-tie": "Não é possível combinar vários tipos de autenticação de solicitação: $1.",
        "sessionprovider-generic": "$1 sessões",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Sessões baseadas em cookie",
index eb93915..1a87f50 100644 (file)
        "selfredirect": "<strong>Aviso:</strong> Está a redirecionar esta página para si mesma.\nPode ter especificado o destino errado para a página ou até a editar a página errada.\nSe clicar em \"{{int:savearticle}}\" novamente, o redirecionamento será criado na mesma.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
        "missingcommentheader": "<strong>Atenção:</strong> Não introduziu um assunto para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto.",
-       "summary-preview": "Antevisão do resumo:",
+       "summary-preview": "Antevisão do resumo de edição:",
        "subject-preview": "Antevisão do assunto:",
        "previewerrortext": "Ocorreu um erro enquanto tentava antever as suas alterações.",
        "blockedtitle": "O utilizador está bloqueado",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
+       "search-interwiki-more-results": "mais resultados",
        "search-relatedarticle": "Relacionado",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}  <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "A ver os privilégios {{GENDER:$1|do utilizador|da utilizadora}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
-       "userrights-viewusergroup": "Ver grupos do utilizador",
+       "userrights-viewusergroup": "Ver grupos {{GENDER:$1|do utilizador|da utilizadora}}",
        "saveusergroups": "Gravar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
-       "userrights-groups-help": "É possível alterar os grupos a que {{GENDER:$1|este utilizador|esta utilizadora|este(a) utilizador(a)}} pertence:\n* Uma caixa de seleção marcada significa que {{GENDER:$1|o utilizador|a utilizadora|o(a) utilizador(a)}} se encontra no grupo.\n* Uma caixa de seleção desmarcada significa que {{GENDER:$1|o utilizador|a utilizadora|o(a) utilizador(a)}} não se encontra no grupo.\n* Um asterisco (*) indica que não pode remover o grupo depois de o adicionar, ou vice-versa.",
+       "userrights-groups-help": "É possível alterar os grupos a que {{GENDER:$1|este utilizador|esta utilizadora}} pertence:\n* Uma caixa de seleção marcada significa que {{GENDER:$1|o utilizador|a utilizadora}} se encontra no grupo.\n* Uma caixa de seleção desmarcada significa que {{GENDER:$1|o utilizador|a utilizadora}} não se encontra no grupo.\n* Um asterisco (*) indica que não pode remover o grupo depois de o adicionar, ou vice-versa.\n* Um símbolo de cardinal (#) indica que só pode atrasar a data de expiração deste grupo; não a pode adiantar.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Não tem permissões para alterar os privilégios de utilizadores noutras wikis.",
        "userrights-nodatabase": "A base de dados $1 não existe ou não é uma base de dados local.",
        "userrights-expiry-existing": "Prazo de expiração: $3, $2",
        "userrights-expiry-othertime": "Outra duração:",
        "userrights-expiry-options": "1 dia:1 day,1 semana:1 week,1 mês:1 month,3 meses:3 months,6 meses:6 months,1 ano:1 year",
-       "userrights-invalid-expiry": "O tempo de expiração para o grupo \"$1\" é inválido.",
-       "userrights-expiry-in-past": "O tempo de expiração para o grupo \"$1\" está no passado.",
+       "userrights-invalid-expiry": "O prazo de expiração para o grupo \"$1\" é inválido.",
+       "userrights-expiry-in-past": "O prazo de expiração para o grupo \"$1\" está no passado.",
+       "userrights-cannot-shorten-expiry": "Não pode adiantar a data de expiração do grupo \"$1\". Só os utilizadores com permissões para adicionar e remover este grupo podem adiantar datas de expiração.",
        "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
        "rcfilters-clear-all-filters": "Limpar todos os filtros",
        "rcfilters-search-placeholder": "Filtrar mudanças recentes (navegue ou começe a escrever)",
        "rcfilters-invalid-filter": "Filtro inválido",
-       "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
+       "rcfilters-empty-filter": "Não há filtros ativos. São mostradas todas as contribuições.",
        "rcfilters-filterlist-title": "Filtros",
+       "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-filterlist-noresults": "Não foram encontrados filtros",
        "rcfilters-filtergroup-registration": "Registo de utilizador",
        "rcfilters-filter-registered-label": "Registado",
        "rcfilters-filter-userExpLevel-experienced-label": "Utilizadores experientes",
        "rcfilters-filter-userExpLevel-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
        "rcfilters-filtergroup-automated": "Contribuições automatizadas",
-       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-label": "Robô",
        "rcfilters-filter-bots-description": "Edições efectuadas por ferramentas automatizadas.",
-       "rcfilters-filter-humans-label": "Humano (não bot)",
+       "rcfilters-filter-humans-label": "Ser humano (não robô)",
        "rcfilters-filter-humans-description": "Edições efectuadas por editores humanos.",
        "rcfilters-filtergroup-significance": "Significado",
        "rcfilters-filter-minor-label": "Edições menores",
        "rcfilters-filter-major-description": "Edições não marcadas como menores.",
        "rcfilters-filtergroup-changetype": "Tipo de alteração",
        "rcfilters-filter-pageedits-label": "Edições da página",
-       "rcfilters-filter-pageedits-description": "Edições do conteúdo wiki, discussões, descrições de categorias....",
+       "rcfilters-filter-pageedits-description": "Edições do conteúdo da wiki, de discussões, de descrições de categorias....",
        "rcfilters-filter-newpages-label": "Criações de páginas",
        "rcfilters-filter-newpages-description": "Edições que criam novas páginas.",
        "rcfilters-filter-categorization-label": "Alterações de categoria",
        "uploaded-setting-handler-svg": "A configuração do atributo \"handler\" com destino remoto/de dados/<i>script</i> em ficheiros SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no ficheiro SVG carregado.",
        "uploaded-remote-url-svg": "A configuração de qualquer atributo de estilo com um URL remoto em ficheiros SVG está bloqueada. Foi detetado <code>$1=\"$2\"</code> no ficheiro SVG carregado.",
        "uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com o URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG carregado.",
-       "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
+       "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
        "uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
        "uploadjava": "Este é um ficheiro ZIP que contém um ficheiro .class de Java.\nNão é permitido o carregamento de ficheiros Java, porque estes podem contornar as restrições de segurança.",
        "editcomment": "O resumo da edição era: <em$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
+       "rollback-success": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Adicionar mais...",
        "sessionmanager-tie": "Não se pode combinar múltiplas solicitações de tipos de autenticação: $1.",
        "sessionprovider-generic": "Sessões $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
index b141ffc..026157e 100644 (file)
                        "Chaduvari",
                        "MarcoAurelio",
                        "Joao Xavier",
-                       "Winstonyin"
+                       "Winstonyin",
+                       "Jhertel"
                ]
        },
        "sidebar": "{{notranslate}}",
        "search": "{{doc-special|Search}}\nNoun. Text of menu section shown on every page of the wiki above the search form.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}\n{{Identical|Search}}",
        "search-ignored-headings": "Headings that will be ignored by search. You can translate the text, including \"Leave this line exactly as it is\". Some lines of this messages have one (1) leading space.",
        "searchbutton": "The button you can see in the sidebar, below the search input box. The \"Go\" button is {{msg-mw|Searcharticle}}.\n{{Identical|Search}}",
-       "go": "See also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
+       "go": "Appears next to the search button. Goes directly to the page with that name, if it exists.\n\nSee also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
        "searcharticle": "Button description in the search menu displayed on every page. The \"Search\" button is {{msg-mw|Searchbutton}}.\n{{Identical|Go}}",
        "history": "{{Identical|Page history}}",
        "history_short": "Text used on the history tab.\n\n{{Identical|History}}",
        "databaseerror-query": "Identifies, in the list of technical details, the [[wikipedia:SQL|SQL]] statement that failed.\nParameters:\n* $1 - SQL statement (shown within a box)\n{{Identical|Query}}",
        "databaseerror-function": "Identifies, in the list of technical details, the function that tried to execute the database query.\nParameters:\n* $1 - Name of function\n{{Identical|Function}}",
        "databaseerror-error": "Identifies, in the list of technical details, the error message the database server returned.\nParameters:\n* $1 - Error message from the database server, probably in English\n{{Identical|Error}}",
-       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum time allowed in database updates",
+       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum number of seconds allowed in database updates",
        "laggedslavemode": "Used as warning when getting the timestamp of the latest version, if in LaggedSlaveMode.",
        "readonly": "Used as title of error message when database is locked.",
        "enterlockreason": "For developers when locking the database",
        "permissionserrorstext-withaction": "This message is \"with action\" version of {{msg-mw|Permissionserrorstext}}.\n\nParameters:\n* $1 - the number of reasons that were found why the action cannot be performed\n* $2 - one of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.",
        "contentmodelediterror": "Error message shown when trying to edit an old revision with a content model different from that of the current revision\n* $1 - content model of the old revision\n* $2 - content model of the current revision",
        "recreate-moveddeleted-warn": "Warning shown when creating a page which has already been deleted. See for example [[Test]].",
-       "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
-       "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
+       "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).\n\nSee also {{msg-mw|moveddeleted-notice-recent}}",
+       "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).\n\nSee also {{msg-mw|moveddeleted-notice}}",
        "log-fulllog": "Used as link text.",
        "edit-hook-aborted": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
        "edit-gone-missing": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
        "search-interwiki-default": "Parameters:\n* $1 - the hostname of the remote wiki from where the additional results listed below are returned",
        "search-interwiki-custom": "#REDIRECT [[MediaWiki:Wmf-search-interwiki-custom/qqq]]",
        "search-interwiki-more": "{{Identical|More}}",
+       "search-interwiki-more-results": "Label for a link that leads to more search results from a given wiki.",
        "search-relatedarticle": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
        "searchrelated": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
        "searchall": "{{Identical|All}}",
        "userrights-changeable-col": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is the head of a column of group assignments.\n\nParameters:\n* $1 - (Optional) for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language can do without.",
        "userrights-unchangeable-col": "Used when editing user groups in [[Special:Userrights]]. The message is the head of a column of group assignments.\n\nParameters:\n* $1 - (Optional) for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language allows that.",
        "userrights-irreversible-marker": "{{optional}}\nParameters:\n* $1 - group member",
+       "userrights-no-shorten-expiry-marker": "{{optional}}\nParameters:\n* $1 - group member",
        "userrights-expiry-current": "Indicates when a user's membership of a user group expires.\n\nParameters:\n* $1 - time and date of expiry\n* $2 - date of expiry\n* $3 - time of expiry\n{{Identical|Expire}}",
        "userrights-expiry-none": "Indicates that a user's membership of a user group lasts indefinitely, and does not expire.",
        "userrights-expiry": "Used as a label for a form element which can be used to select an expiry date/time.\n{{Identical|Expire}}",
        "userrights-expiry-options": "{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}\nOptions for the duration of the user group membership. Example: See e.g. [[MediaWiki:Userrights-expiry-options/nl]] if you still don't know how to do it.\n\nSee also {{msg-mw|protect-expiry-options}}.",
        "userrights-invalid-expiry": "Error message on [[Special:UserRights]].\n\nParameters:\n* $1 - group name",
        "userrights-expiry-in-past": "Error message on [[Special:UserRights]] when the user types an expiry date that has already passed.\n\nParameters:\n* $1 - group name",
+       "userrights-cannot-shorten-expiry": "Error message on [[Special:UserRights]] when the user tries to move the expiry date to be closer to the present and they do not have permission to do so. \"Bring forward\" is a phrasal verb meaning \"move to an earlier time\".\n\nParameters:\n* $1 - group name",
        "userrights-conflict": "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
        "group": "{{Identical|Group}}",
        "group-user": "{{doc-group|user}}\n{{Identical|User}}",
        "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-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-filterlist-noresults": "Message showing no results found for searching a filter.",
        "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}}",
        "booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
        "magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.\n\nSee [https://en.wikipedia.org/wiki/Help:Magic_links#RFC Help:Magic links] for more information on RFC magic links.",
-       "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
+       "magiclink-tracking-rfc-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-rfc}}",
        "magiclink-tracking-pmid": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use PMID magic links will be added.",
-       "magiclink-tracking-pmid-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-pmid}}",
+       "magiclink-tracking-pmid-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-pmid}}",
        "magiclink-tracking-isbn": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use ISBN magic links will be added.",
-       "magiclink-tracking-isbn-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-isbn}}",
+       "magiclink-tracking-isbn-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-isbn}}",
        "rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
        "pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
        "specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user.  \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
        "editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
        "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
        "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
-       "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
+       "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). Parameters:\n* $1 - user whose changes have been reverted\n* $2 - user who produced version, which replaces reverted version\n* $3 - the first user's name, can be used for GENDER\n* $4 - the second user's name, can be used for GENDER\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
        "mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
        "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
        "mw-widgets-categoryselector-add-category-placeholder": "Placeholder displayed in the category selector widget after the capsules of already added categories.",
+       "mw-widgets-usersmultiselect-placeholder": "Placeholder displayed in the input field, where new usernames are entered",
        "sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
        "sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
index 86abce6..c0192d2 100644 (file)
        "passwordreset-emaildisabled": "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
        "passwordreset-username": "Ruraqpa sutin:",
        "passwordreset-domain": "Duminyu:",
-       "passwordreset-capture": "Llalliwaq e-chaskita qhawayta munankichu?",
-       "passwordreset-capture-help": "Kay k'itichata ñit'iywan sananchaspaykiqa, mit'alla yaykuna rimayuq e-chaskita rikunki, hinaptiyki ruraqmanmi kachasqa kanqa.",
        "passwordreset-email": "E-chaski imamayta:",
        "passwordreset-emailtitle": "{{SITENAME}}-paq rakiqunamanta willakuna",
        "passwordreset-emailtext-ip": "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)\nrakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}\nkay e-chaski imamaytayuq kachkan:\n\n$2\n\nKay mit'alla yaykuna {{PLURAL:$3|rimaqa|rimakunaqa}} kunanmanta {{PLURAL:$5|huk p'unchawpi|$5 p'unchawpi}} mawk'ayanqam.\nYaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqaptinqa,\nicha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,\nkay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
        "saveprefs": "Allinkachinakunata waqaychay",
        "restoreprefs": "Tukuy kikinmanta allinkachinakunata kutichimuy (tukuy rakirikunapi)",
        "prefs-editing": "Llamk'apusqa",
-       "rows": "Sinrukuna:",
-       "columns": "Wachukuna:",
        "searchresultshead": "Maskay",
        "stub-threshold": "Kay hatun kaykamam <a href=\"#\" class=\"stub\">t'una qillqasqa t'inki</a> nisqa kachun (byte):",
        "stub-threshold-disabled": "Ama nisqa",
        "userrights-reason": "Kayrayku:",
        "userrights-no-interwiki": "Manam saqillasunkichu huk wikikunapi ruraqkunap hayñinkunata hukchayta.",
        "userrights-nodatabase": "$1 sutiyuq willañiqintinqa manam kanchu icha manam kayllapichu.",
-       "userrights-nologin": "Kamachiqpa rakiqunaykiwan [[Special:UserLogin|yaykunaykim]] tiyan ruraqkunap hayñinkunata rurapunaykipaq.",
-       "userrights-notallowed": "Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.",
        "userrights-changeable-col": "Hukchanayki huñukuna",
        "userrights-unchangeable-col": "Mana hukchanayki huñukuna",
        "userrights-conflict": "Ruraqpa hayñin hukchay tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.",
        "right-siteadmin": "Willañiqintinta hark'ay, paskaypas",
        "right-override-export-depth": "P'anqakunata hawaman quy, t'inkisqa p'anqakunatapas pichqa ñiqin t'inkipayasqakama",
        "right-sendemail": "Huk ruraqkunaman e-chaskita kachay",
-       "right-passwordreset": "Yaykuna rima kutichina e-chaskikunata qhaway",
        "newuserlogpage": "Rakiquna kamariy hallch'a",
        "newuserlogpagetext": "Kayqa ruraqkunap rakiqunankunata kamariymanta hallch'am.",
        "rightslog": "Ruraqpa hayñinkunap hukyasqankuna",
        "uploaddisabledtext": "Willañiqi churkuyqa manam saqillasqachu.",
        "php-uploaddisabledtext": "PHP-wan willañiqi churkuyqa hark'asqam. Ama hina kaspa, willañiqi churkuy allinkachinakunata llanchiy.",
        "uploadscripted": "Kay willañiqiqa wakichi icha HTML qillqayuqmi, llika wamp'unaqa pantalla unanchanmanchá.",
-       "uploadscriptednamespace": "Kay SVG willañiqiqa mana allin \"$1\" sutisuyuyuqmi.",
+       "uploadscriptednamespace": "Kay SVG willañiqiqa mana allin \"<nowiki>$1</nowiki>\" sutisuyuyuqmi.",
        "uploadinvalidxml": "Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.",
        "uploadvirus": "Willañiqipiqa añawmi! Yuyay: $1",
        "uploadjava": "Kay ZIP willañiqiqa Java .class willañiqiyuqmi.\nJava churkuyqa manam saqillasqachu, qasikanapaq saywachasqa kanman karunchana tiyanman.",
        "feedback-thanks": "Añaychayki! Willapuyniykiqa \"[$2 $1]\" sutiyuq p'anqaman yapasqañam.",
        "searchsuggest-search": "Maskay",
        "searchsuggest-containing": "kaykunayuq: ...",
-       "api-error-badaccess-groups": "Kay wikipiqa willañiqikunata manam churkuyta atinkichu.",
        "api-error-badtoken": "Ukhupi pantasqa: Mana allinta sananchasqa.",
-       "api-error-copyuploaddisabled": "URL nisqawanqa kay sirwiqpi manam churkuyta atinki.",
-       "api-error-duplicate": "Kay tiyaypiqa huk {{PLURAL:$1|willañiqim|willañiqikunam}} kachkanñam kaqlla samiqniyuq kaq.",
-       "api-error-duplicate-archive": "Kay tiyaypiqa huk {{PLURAL:$1|willañiqim|willañiqikunam}} karqanñam kaqlla samiqniyuq kaq, kunantaq qullusqañam.",
-       "api-error-empty-file": "Kachasqayki willañiqiqa ch'usaqmi.",
        "api-error-emptypage": "Musuq ch'usaq p'anqakunata kamariyqa manam saqillasqachu.",
-       "api-error-fetchfileerror": "Ukhupi pantasqa: Willañiqita chaskiykachachkaptiyki ima mana allin kaqpas tukurqan.",
-       "api-error-fileexists-forbidden": "\"$1\" sutiyuq willañiqiqa kachkañam, manam huknachayta atinkichu.",
-       "api-error-fileexists-shared-forbidden": "\"$1\" sutiyuq willañiqiqa rakinakusqa willañiqi churanapi kachkañam, manam huknachayta atinkichu.",
-       "api-error-file-too-large": "Kachasqayki willañiqiqa nisyu hatunmi.",
-       "api-error-filename-tooshort": "Kay willañiqi sutiqa nisyu pisillam.",
-       "api-error-filetype-banned": "Kay willañiqi layaqa manam saqillasqachu.",
-       "api-error-filetype-banned-type": "$1 nisqaqa manam saqillasqachu willañiqi {{PLURAL:$4|laya|layakuna}}.  Saqillasqa willañiqi {{PLURAL:$3|layaqa|layakunaqa}} kaymi: $2.",
-       "api-error-filetype-missing": "Kay willañiqi sutiqa manam k'askaqniyuqchu.",
-       "api-error-hookaborted": "Wakinchaykachasqaykitaqa mast'ari ch'iwinam puchukachirqan.",
-       "api-error-http": "Ukhupi pantasqa: Manam sirwiqwan t'inkinakuyta atinichu.",
-       "api-error-illegal-filename": "Kay willañiqi sutiqa manam saqillasqachu.",
-       "api-error-internal-error": "Ukhupi pantasqa: Wikipi churkuchkaptiyki ima mana allin kaqpas tukurqan.",
-       "api-error-invalid-file-key": "Ukhupi pantasqa: Mit'alla hallch'api willañiqiqa manam tarisqachu.",
-       "api-error-missingparam": "Ukhupi pantasqa: Mañakuypi manam kuskanachina tupukuna kanchu.",
-       "api-error-missingresult": "Ukhupi pantasqa: Manam yuqanchasqachu iskaychay aypasqachu.",
-       "api-error-mustbeloggedin": "Yaykunaykim tiyan willañiqikunata churkunaykipaq.",
-       "api-error-mustbeposted": "Ukhupi pantasqa: Mañakuypaq HTTP POST kanam tiyan.",
-       "api-error-noimageinfo": "Willañiqiqa churkusqañam, chaywanpas sirwiq manam willawanchu ima willañiqimantapas.",
-       "api-error-nomodule": "Ukhupi pantasqa: Manam kanchu churasqa churkuna wakina tupu.",
-       "api-error-ok-but-empty": "Ukhupi pantasqa: Sirwiqqa manam kutipanchu.",
-       "api-error-overwrite": "Kachkaqña willañiqita huknachayqa manam saqillasqachu.",
-       "api-error-stashfailed": "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam hallch'ayta atinchu.",
        "api-error-publishfailed": "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam uyanchayta atinchu.",
-       "api-error-timeout": "Suyakusqa mit'apiqa sirwiq manam kutiparqanchu.",
-       "api-error-unclassified": "Mana riqsisqa pantasqam tukurqan.",
-       "api-error-unknown-code": "Mana riqsisqa pantasqa: \"$1\".",
-       "api-error-unknown-error": "Ukhupi pantasqa: Churkuykachachkaptiyki ima mana allin kaqpas tukurqan.",
+       "api-error-stashfailed": "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam hallch'ayta atinchu.",
        "api-error-unknown-warning": "Mana riqsisqa yuyampay: \"$1\".",
        "api-error-unknownerror": "Mana riqsisqa pantasqa: \"$1\".",
-       "api-error-uploaddisabled": "Kay wikipiqa manam churkuyta atinkichu.",
-       "api-error-verification-error": "Kay willañiqiqa waqllisqachá, icha pantasqa k'askaqniyuqchá.",
        "duration-seconds": "$1 {{PLURAL:$1|sikundu|sikundukuna}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minutukuna}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|urakuna}}",
index 62f7dec..814f123 100644 (file)
        "saveprefs": "Salvează preferințele",
        "restoreprefs": "Restaurează toate valorile implicite (în toate secțiunile)",
        "prefs-editing": "Modificare",
-       "rows": "Rânduri:",
-       "columns": "Coloane:",
        "searchresultshead": "Parametri căutare",
        "stub-threshold": "Pragul pentru formatarea legăturilor către cioturi ($1):",
        "stub-threshold-sample-link": "exemplu",
        "uploaded-setting-handler-svg": "Sunt blocate fișierele SVG care setează atributul „handler” cu remote/data/script. S-a găsit <code>$1=„$2”</code> în fișierul SVG încărcat.",
        "uploaded-remote-url-svg": "Sunt blocate fișierele SVG care setează orice atribut de stil către adrese URL la distanță. S-a găsit <code>$1=„$2”</code> în fișierul SVG încărcat.",
        "uploaded-image-filter-svg": "S-a găsit filtru de imagine cu URL: <code>&lt;$1 $2=\"$3\"&gt;</code> în fișierul SVG încărcat.",
-       "uploadscriptednamespace": "Acest fișier SVG conține un spațiu de nume „$1” neautorizat.",
+       "uploadscriptednamespace": "Acest fișier SVG conține un spațiu de nume „<nowiki>$1</nowiki>” neautorizat.",
        "uploadinvalidxml": "Nu s-a putut analiza conținutul XML din fișierul încărcat.",
        "uploadvirus": "Fișierul conține un virus! Detalii: $1",
        "uploadjava": "Fișierul de față este o arhivă ZIP care conține un fișier de clasă Java.\nÎncărcarea fișierelor Java nu este permisă, întrucât pot evita restricțiile de securitate.",
        "feedback-useragent": "Agent utilizator:",
        "searchsuggest-search": "Căutare",
        "searchsuggest-containing": "conținând...",
-       "api-error-autoblocked": "Adresa dumnevoastră IP a fost blocată automat, pentru că a fost folosită de un utilizator blocat.",
-       "api-error-badaccess-groups": "Nu aveți dreptul să încărcați fișiere pe acest wiki.",
        "api-error-badtoken": "Eroare internă: jeton greșit.",
-       "api-error-blocked": "Vi s-a blocat accesul la modificări.",
-       "api-error-copyuploaddisabled": "Încărcarea prin URL este dezactivată pe acest server.",
-       "api-error-duplicate": "Există {{PLURAL:$1|un alt fișier deja încărcat|alte fișiere deja încărcate}} cu același conținut.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|A existat un alt fișier|Au existat alte fișiere}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.",
-       "api-error-empty-file": "Fișierul încărcat de dumneavoastră este gol.",
        "api-error-emptypage": "Crearea paginilor noi, goale nu este permisă.",
-       "api-error-fetchfileerror": "Eroare internă: ceva nu a funcționat corect la prelucrarea fișierului.",
-       "api-error-fileexists-forbidden": "Un fișier cu numele „$1” există deja și nu poate fi suprascris.",
-       "api-error-fileexists-shared-forbidden": "Un fișier cu numele „$1” există deja în depozitul de fișiere partajate, și nu poate fi suprascris.",
-       "api-error-file-too-large": "Fișierul pe care l-ați trimis este prea mare.",
-       "api-error-filename-tooshort": "Numele fișierului este prea scurt.",
-       "api-error-filetype-banned": "Acest tip de fișiere este interzis.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|este un tip de fișier nepermis|sunt tipuri de fișier nepermise}}. {{PLURAL:$3|Tip de fișier permis este|Tipuri de fișier permise sunt}} $2.",
-       "api-error-filetype-missing": "Fișierului îi lipsește extensia.",
-       "api-error-hookaborted": "Modificarea pe care ați încercat să o faceți a fost oprită de sesizarea unei extensii.",
-       "api-error-http": "Eroare internă: nu s-a reușit conectarea la server.",
-       "api-error-illegal-filename": "Numele acordat fișierului nu este permis.",
-       "api-error-internal-error": "Eroare internă: ceva nu a funcționat în timpul procesării încărcării.",
-       "api-error-invalid-file-key": "Eroare internă: fișierul nu a fost găsit în depozitul temporar.",
-       "api-error-missingparam": "Eroare internă: lipsesc parametrii cererii.",
-       "api-error-missingresult": "Eroare internă: nu s-a putut determina dacă copierea a reușit.",
-       "api-error-mustbeloggedin": "Trebuie să fiți autentificat pentru a încărca fișiere.",
-       "api-error-mustbeposted": "Eroare internă: cererea necesită metoda HTTP POST.",
-       "api-error-noimageinfo": "Încărcarea a reușit, dar serverul nu a dat nicio informație despre fișier.",
-       "api-error-nomodule": "Eroare internă: niciun modul de încărcare setat.",
-       "api-error-ok-but-empty": "Eroare internă: niciun răspuns de la server.",
-       "api-error-overwrite": "Nu este permisă suprascrierea unui fișier existent.",
-       "api-error-ratelimited": "Ați încercat să încărcați într-un interval de timp scurt mai multe fișiere decât permite acest wiki.\nÎncercați din nou peste câteva minute.",
-       "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-publishfailed": "Eroare internă: serverul nu a putut publica fișierul temporar.",
-       "api-error-stasherror": "A apărut o eroare la încărcarea fișierului în depozitul temporar.",
-       "api-error-stashedfilenotfound": "Fișierul din depozitul temporar nu a fost găsit când s-a încercat încărcarea sa.",
-       "api-error-stashpathinvalid": "Calea unde ar fi trebuit să fie găsit fișierul din depozitul temporar nu este validă.",
-       "api-error-stashfilestorage": "A apărut o eroare la stocarea fișierului în depozitul temporar.",
-       "api-error-stashzerolength": "Serverul nu a putut depozita temporar fișierul, deoarece are o mărime egală cu zero.",
-       "api-error-stashnotloggedin": "Trebuie să vă autentificați pentru a salva fișiere în depozitul temporar.",
-       "api-error-stashwrongowner": "Fișierul pe care încercați să-l accesați din depozitul temporar nu vă aparține.",
-       "api-error-stashnosuchfilekey": "Cheia fișierului pe care încercați să-l accesați din depozitul temporar nu există.",
-       "api-error-timeout": "Serverul nu a răspuns în timp util.",
-       "api-error-unclassified": "A apărut o eroare necunoscută.",
-       "api-error-unknown-code": "Eroare necunoscută: „$1”",
-       "api-error-unknown-error": "Eroare internă: ceva nu a funcționat atunci când ați încercat să încărcați fișierul.",
+       "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-unknown-warning": "Avertisment necunoscut: $1",
        "api-error-unknownerror": "Eroare necunoscută: „$1”.",
-       "api-error-uploaddisabled": "Încărcarea este dezactivată pe acest wiki.",
-       "api-error-verification-error": "Acest fișier ar putea fi corupt sau poate avea extensia greșită.",
-       "api-error-was-deleted": "Un fișier cu același nume a fost deja încărcat în trecut și ulterior șters.",
        "duration-seconds": "$1 {{PLURAL:$1|secundă|secunde|de secunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|de minute}}",
        "duration-hours": "$1 {{PLURAL:$1|oră|ore|de ore}}",
index 026e178..a58a9db 100644 (file)
        "saveprefs": "Reggistre",
        "restoreprefs": "Repristine tutte le 'mbostaziune origgenale",
        "prefs-editing": "Stoche a cange",
-       "rows": "Righe:",
-       "columns": "Culonne:",
        "searchresultshead": "Cirche",
        "stub-threshold": "Soglie pe collegamende stub de formattazione ($1):",
        "stub-threshold-sample-link": "esembie",
        "uploaded-hostile-svg": "Acchiate 'nu CSS insecure ndr'à l'elemende de stile d'u file SVG carecate.",
        "uploaded-event-handler-on-svg": "'A 'mbostazione de le attribute de gestione de l'evende <code>$1=\"$2\"</code> non ge se pò ffà cu le file SVG.",
        "uploaded-href-unsafe-target-svg": "Acchiate 'na destinazione href non secure <code>&lt;$1 $2=\"$3\"&gt;</code> jndr'à 'u file SVG carecate.",
-       "uploadscriptednamespace": "Stu file SVG tène 'nu namespace illegale '$1'",
+       "uploadscriptednamespace": "Stu file SVG tène 'nu namespace illegale '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "L'XML jndr'à 'u file carecate non ge pò essere analizzate.",
        "uploadvirus": "Alanga toje, 'u file condiene 'nu virus! Dettaglie: $1",
        "uploadjava": "'U file jè 'nu file de tipe ZIP ca condene 'nu file de classe Java.\n'U carecamende de le file Java non g'è permesse, purcé lore ponne causà l'aggiramende de le restriziune de sicurezze.",
        "feedback-useragent": "Utende agente:",
        "searchsuggest-search": "Cirche {{SITENAME}}",
        "searchsuggest-containing": "tène...",
-       "api-error-badaccess-groups": "Tu non ge puè carecà file sus a sta Uicchi.",
        "api-error-badtoken": "Errore inderne: Gettone errate.",
-       "api-error-copyuploaddisabled": "'U carecamende da URL jè disabbilitate sus a stu server.",
-       "api-error-duplicate": "{{PLURAL:$1|Stè 'n'otre file|Stonne otre file}} sus a 'u site cu 'u stesse condenute.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Stave 'n'otre file|Stavane otre file}} già sus a 'u site cu 'u stesse condenute, ma {{PLURAL:$1|ha state|onne state}} scangellate.",
-       "api-error-empty-file": "'U file ca tu è confermate ere vacande.",
        "api-error-emptypage": "Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.",
-       "api-error-fetchfileerror": "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
-       "api-error-fileexists-forbidden": "'Nu file cu 'u nome \"$1\" esiste, e non ge pò essere sovrascritte.",
-       "api-error-fileexists-shared-forbidden": "'Nu file cu 'u nome \"$1\" esiste jndr'à l'archivije de le file comune, e non ge pò essere sovrascritte.",
-       "api-error-file-too-large": "'U file ca tu è confermate jè troppe granne.",
-       "api-error-filename-tooshort": "'U nome d'u file jè troppe curte.",
-       "api-error-filetype-banned": "Stu tipe de file jè vietate.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|ète 'nu tipe de file ca non g'è permesse|sonde tipe de file ca no sonde permesse}}. {{PLURAL:$3|'U tipe de file permesse ète|Le tipe de file permesse sonde}} $2.",
-       "api-error-filetype-missing": "'U file jè senze 'n'estenzione.",
-       "api-error-hookaborted": "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'n'estenzione.",
-       "api-error-http": "Errore inderne: Non ge se riesce a collegà a 'u server",
-       "api-error-illegal-filename": "'U nome d'u file non g'è permesse.",
-       "api-error-internal-error": "Errore inderne: Quaccheccose ha sciute male mendre ca ste processamme 'u carecamende tune sus 'a uicchi.",
-       "api-error-invalid-file-key": "Errore inderne: 'U file non ge se iacchie jndr'à memorie temboranèe.",
-       "api-error-missingparam": "Errore inderne: Parametre mangande sus a richieste.",
-       "api-error-missingresult": "Errore inderne: Non ge se pò determinà ce 'a copie ha state fatte.",
-       "api-error-mustbeloggedin": "Tu a essere collegate pe carecà le file.",
-       "api-error-mustbeposted": "Errore inderne: 'A richieste vole HTTP POST.",
-       "api-error-noimageinfo": "'U carecamende ha riuscite, ma 'u server non ge n'ha date nisciuna 'mbormazione sus a 'u file.",
-       "api-error-nomodule": "Errore inderne: Nisciune module de carecamende 'mbostate.",
-       "api-error-ok-but-empty": "Errore inderne: Nisciune resposte da 'u server.",
-       "api-error-overwrite": "'A sovrascritture de 'nu file ca esiste non ge se pò fà.",
-       "api-error-stashfailed": "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
        "api-error-publishfailed": "Errore inderne: 'U server ha fallite 'a pubblecazione d'u file temboranèe.",
-       "api-error-stasherror": "Ha assute 'n'errore mendre ca carecave 'u file jndr'à 'u majazzine.",
-       "api-error-stashedfilenotfound": "'U file stipate non g'ha state acchiate quanne ste pruvave a carecarle jndr'à 'u majazzine.",
-       "api-error-stashpathinvalid": "'U percorse 'addò 'u file s'avesse acchià non g'è valide.",
-       "api-error-stashfilestorage": "Ha assute 'n'errore memorizzanne 'u file jndr'à 'u majazzine.",
-       "api-error-stashzerolength": "'U server non ge pò pigghiarse 'u file, purcé téne 'na lunghezze zero.",
-       "api-error-stashnotloggedin": "Tu a trasè pe reggistrà file jndr'à 'u majazzine de carecamende.",
-       "api-error-stashwrongowner": "'U file ca ste pruéve a pigghià da 'u majazzine non ge ste cchiù.",
-       "api-error-stashnosuchfilekey": "'A chiave d'u file ca ste pruéve a pigghià da 'u majazzine non g'esiste cchiù.",
-       "api-error-timeout": "'U server non g'ave resposte jndr'à 'u tiembe ca 'u spettave.",
-       "api-error-unclassified": "'N'errore scanusciute s'a verificate",
-       "api-error-unknown-code": "Errore scanusciute: \"$1\"",
-       "api-error-unknown-error": "Errore inderne: Quacche cose ha sciute storte quanne ste pruvave a carecà 'u file tune.",
+       "api-error-stashfailed": "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
        "api-error-unknown-warning": "Avvertimende scanusciute: $1",
        "api-error-unknownerror": "Errore scanusciute: \"$1\"",
-       "api-error-uploaddisabled": "Le carecaminde sonde disabbilitate sus a sta Uicchi.",
-       "api-error-verification-error": "Stu file pò essere scuasciate, o ave 'n'estenzione sbagliate.",
        "duration-seconds": "{{PLURAL:$1|seconde|seconde}}",
        "duration-minutes": "{{PLURAL:$1|minute|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|ore}}",
index 338954f..46805f8 100644 (file)
                        "Kareyac",
                        "Mailman",
                        "Аль-Гимравий",
-                       "Gamliel Fishkin"
+                       "Gamliel Fishkin",
+                       "Ping08",
+                       "Yuryleb",
+                       "Redredsonia"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
-       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки из списка свежих правок",
+       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f из списка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-hidecategorization": "Скрывать категоризацию страниц",
        "tog-watchdeletion": "Добавлять в список наблюдения удалённые мной страницы и файлы",
        "tog-watchuploads": "Добавлять закачанные мною файлы в список наблюдения",
        "tog-watchrollback": "Добавлять страницы, где я выполнил откат, в мой список наблюдения",
-       "tog-minordefault": "Помечать по умолчанию правки как малозначимые",
+       "tog-minordefault": "По умолчанию помечать правки как малые",
        "tog-previewontop": "Помещать предпросмотр перед окном редактирования",
        "tog-previewonfirst": "Показывать предпросмотр при переходе к редактированию",
        "tog-enotifwatchlistpages": "Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения",
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
        "about": "Описание",
        "article": "Статья",
-       "newwindow": "&nbsp;(в новом окне)",
+       "newwindow": "(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список может быть неполным.",
        "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
        "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
-       "summary-preview": "Ð\9eпиÑ\81ание Ð±Ñ\83деÑ\82:",
-       "subject-preview": "Ð\97аголовок Ð±Ñ\83деÑ\82 Ð²Ñ\8bглÑ\8fдеÑ\82Ñ\8c Ñ\82ак:",
+       "summary-preview": "Ð\9fÑ\80едпÑ\80оÑ\81моÑ\82Ñ\80 Ð¾Ð¿Ð¸Ñ\81аниÑ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f:",
+       "subject-preview": "Ð\9fÑ\80едпÑ\80оÑ\81моÑ\82Ñ\80 Ñ\82емÑ\8b/заголовка:",
        "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|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\nВаш IP-адрес — $3, идентификатор блокировки — $5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "missing-revision": "Версия $1 страницы «{{FULLPAGENAME}}» не существует.\n\nЭто обычно бывает, если последовать по устаревшей ссылке на страницу, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "userpage-userdoesnotexist": "Учётной записи «<nowiki>$1</nowiki>» не существует. Убедитесь, что вы действительно желаете создать или изменить эту страницу.",
        "userpage-userdoesnotexist-view": "Не зарегистрировано учётной записи «$1».",
-       "blocked-notice-logextract": "Этот участник в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
+       "blocked-notice-logextract": "{{GENDER:$1|Этот участник|Эта участница}} в данный момент {{GENDER:$1|заблокирован|заблокирована}}.\nНиже приведена последняя запись из журнала блокировок:",
        "clearyourcache": "<strong>Замечание.</strong> Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* <strong>Firefox / Safari:</strong> Удерживая клавишу <em>Shift</em>, нажмите на панели инструментов <em>Обновить</em> либо нажмите <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> Нажмите <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Удерживая <em>Ctrl</em>, нажмите <em>Обновить</em> либо нажмите <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Перейдите в <em>Menu → Настройки</em> (<em>Opera → Настройки</em> на Mac), а затем <em>Безопасность → Очистить историю посещений → Кэшированные изображения и файлы</em>",
        "usercssyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
        "userjsyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
        "editpage-cannot-use-custom-model": "Модель содержимого этой страницы не может быть изменена.",
        "longpageerror": "'''ОШИБКА: записываемый вами текст имеет размер $1 {{PLURAL:$1|килобайт|килобайта|килобайт}}, что больше, чем установленный предел в $2 {{PLURAL:$2|килобайт|килобайта|килобайт}}. Страница не может быть сохранена.'''",
        "readonlywarning": "<strong>Предупреждение: База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.</strong>\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nСистемный администратор, заблокировавший базу данных, оставил следующее объяснение: $1",
-       "protectedpagewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°Ñ\89иÑ\89ена Ð¾Ñ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ов.'''\nНиже для справки приведена последняя запись журнала:",
+       "protectedpagewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°Ñ\89иÑ\89ена Ð¾Ñ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
        "cascadeprotectedwarning": "<strong>Предупреждение:</strong> Данную страницу могут редактировать только участники с административными правами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
        "titleprotectedwarning": "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''\nНиже для справки приведена последняя запись журнала:",
        "search-interwiki-caption": "Родственные проекты",
        "search-interwiki-default": "Результаты из $1:",
        "search-interwiki-more": "(ещё)",
+       "search-interwiki-more-results": "ещё результаты",
        "search-relatedarticle": "Связанный",
        "searchrelated": "связанный",
        "searchall": "все",
        "userrights": "Управление правами участника",
        "userrights-lookup-user": "Выбор участника",
        "userrights-user-editname": "Введите имя учётной записи:",
-       "editusergroup": "Ð\97агÑ\80Ñ\83зка Ð³Ñ\80Ñ\83пп участников",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b участников",
        "editinguser": "Изменение прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Просмотр прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Изменение членства в группах",
-       "userrights-viewusergroup": "пÑ\80оÑ\81моÑ\82Ñ\80 Ð³Ñ\80Ñ\83пп Ñ\83Ñ\87аÑ\81Ñ\82ника",
+       "userrights-editusergroup": "Изменение групп {{GENDER:$1|участника|участницы}}",
+       "userrights-viewusergroup": "Ð\9fÑ\80оÑ\81моÑ\82Ñ\80 Ð³Ñ\80Ñ\83пп {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86Ñ\8b}}",
        "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
        "userrights-groupsmember": "Состоит в группах:",
        "userrights-groupsmember-auto": "Неявно состоит в группах:",
-       "userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка — участник входит в эту группу.\n* Если отметка не стоит — участник не входит в эту группу.\n* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.",
+       "userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения этой группы, вы не можете перенести его на более ранний срок.",
        "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-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
        "group": "Группа:",
        "group-user": "Участники",
        "rcfilters-invalid-filter": "Недопустимый фильтр",
        "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
        "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
+       "rcfilters-highlightbutton-title": "Выделить результаты",
+       "rcfilters-highlightmenu-title": "Выберите цвет",
        "rcfilters-filterlist-noresults": "Фильтры не найдены",
        "rcfilters-filtergroup-registration": "Регистрация участников",
        "rcfilters-filter-registered-label": "Зарегистрированные",
        "uploaded-setting-handler-svg": "SVG, который задаёт атрибут «handler» с помощью удалённого адреса/данных/скрипта, блокируется. Найдена конструкция <code>$1=\"$2\"</code> в загруженном SVG-файле.",
        "uploaded-remote-url-svg": "SVG, который задаёт любой атрибут стиля с помощью удалённого URL-адреса, блокируется. Найдена конструкция <code>$1=\"$2\"</code> в загруженном SVG-файле.",
        "uploaded-image-filter-svg": "В загруженном SVG-файле найден фильтр изображений с URL-адресом <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Этот SVG-файл содержит некорректное пространство имён '$1'",
+       "uploadscriptednamespace": "Этот SVG-файл содержит некорректное пространство имён '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "XML в загруженном файле не может быть проанализирован.",
        "uploadvirus": "Файл содержит вирус! См. $1",
        "uploadjava": "Файл представляет собой ZIP-архив, содержащий .class файл Java.\nЗагрузка Java-файлов не допускается из-за соображений безопасности.",
        "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; возврат к версии $2.",
+       "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возврат к версии {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
        "sessionfailure-title": "Ошибка сеанса",
        "sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, нажмите кнопку «Назад» и перезагрузите страницу, с которой вы пришли.",
        "imageinvalidfilename": "Целевое имя файла ошибочно",
        "fix-double-redirects": "Исправить перенаправления, указывающие на прежнее название",
        "move-leave-redirect": "Оставить перенаправление",
-       "protectedpagemovewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð·Ð°Ñ\89иÑ\89ена; Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ов.'''\nНиже для справки приведена последняя запись журнала:",
+       "protectedpagemovewarning": "'''Ð\9fÑ\80едÑ\83пÑ\80еждение. Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð·Ð°Ñ\89иÑ\89ена; Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c ÐµÑ\91 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ\87иÑ\8fми Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagemovewarning": "'''Замечание.''' Эта страница была защищена; переименовать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
        "move-over-sharedrepo": "В общем хранилище существует [[:$1]]. Переименование файла в это название вызовет перекрытие файла из общего хранилища.",
        "file-exists-sharedrepo": "Выбранное имя файла уже используется в общем хранилище.\nПожалуйста, выберите другое имя.",
        "spam_blanking": "Все версии содержат ссылки на $1, очистка",
        "spam_deleting": "Все версии содержали ссылки на $1, производится удаление",
        "simpleantispam-label": "Анти-спам проверка.\n<strong>Не</strong> заполняйте это!",
-       "pageinfo-title": "СведениÑ\8f Ð¿Ð¾ «$1»",
+       "pageinfo-title": "СведениÑ\8f Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86е «$1»",
        "pageinfo-not-current": "К сожалению, невозможно предоставить эту информацию для старых версий.",
        "pageinfo-header-basic": "Основные сведения",
        "pageinfo-header-edits": "История изменений",
        "bitrate-gigabits": "$1 Гб/с",
        "bitrate-terabits": "$1 Тб/с",
        "lag-warn-normal": "Изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.",
-       "lag-warn-high": "Ð\98з-за Ð±Ð¾Ð»Ñ\8cÑ\88ого Ð¾Ñ\82Ñ\81Ñ\82аваниÑ\8f Ð² Ñ\81инÑ\85Ñ\80онизаÑ\86ии Ñ\81еÑ\80веÑ\80ов, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ñ\81деланнÑ\8bе Ð¼ÐµÐ½ÐµÐµ {{PLURAL:$1|$1 Ñ\81екÑ\83ндÑ\8b|$1 Ñ\81екÑ\83нд|1=Ñ\81екÑ\83ндÑ\8b}} Ð½Ð°Ð·Ð°Ð´, Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð½Ðµ Ð¾Ñ\82обÑ\80ажаÑ\82Ñ\8cÑ\81Ñ\8f Ð² Ñ\8dÑ\82ом Ñ\81пиÑ\81ке.",
+       "lag-warn-high": "Ð\98з-за Ð±Ð¾Ð»Ñ\8cÑ\88ого Ð¾Ñ\82Ñ\81Ñ\82аваниÑ\8f Ð² Ñ\81инÑ\85Ñ\80онизаÑ\86ии Ñ\81еÑ\80веÑ\80ов, Ð² Ñ\8dÑ\82ом Ñ\81пиÑ\81ке Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð½Ðµ Ð¾Ñ\82обÑ\80ажаÑ\82Ñ\8cÑ\81Ñ\8f Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ñ\81деланнÑ\8bе Ð¼ÐµÐ½ÐµÐµ {{PLURAL:$1|$1 Ñ\81екÑ\83ндÑ\8b|$1 Ñ\81екÑ\83нд|1=Ñ\81екÑ\83ндÑ\8b}} Ð½Ð°Ð·Ð°Ð´.",
        "watchlistedit-normal-title": "Изменение списка наблюдения",
        "watchlistedit-normal-legend": "Удаление записей из списка наблюдения",
        "watchlistedit-normal-explain": "Ниже перечислены страницы, находящиеся в вашем списке наблюдения.\nДля удаления записей отметьте соответствующие позиции и нажмите кнопку «{{int:Watchlistedit-normal-submit}}».\nВы также можете [[Special:EditWatchlist/raw|править список как текст]].",
        "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": "сессий на основе куки",
index dbc7b57..7c1f625 100644 (file)
@@ -11,7 +11,8 @@
                        "아라",
                        "Dicto23456",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "KHMELNYTSKYIA"
                ]
        },
        "tog-underline": "Підкреслёвати одказы:",
        "currentevents": "Актуалны подїї",
        "currentevents-url": "Project:Актуалны подїї",
        "disclaimers": "Вылучіня одповідности",
-       "disclaimerpage": "Project:Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96нÑ\8f Ð¾Ð´Ð¿Ð¾Ð²Ñ\96дноÑ\81Ñ\82и",
+       "disclaimerpage": "Project:Ð\92Ñ\96дмова Ð²Ñ\96д Ð²Ñ\96дповÑ\96далÑ\8cноÑ\81Ñ\82Ñ\96",
        "edithelp": "Поміч едітованя",
        "mainpage": "Головна сторінка",
        "mainpage-description": "Головна сторінка",
        "passwordreset-emaildisabled": "Функції електронічной пошты были выпнуы на тій вікі.",
        "passwordreset-username": "Мено хоснователя:",
        "passwordreset-domain": "Домена:",
-       "passwordreset-capture": "Посмотрити выслїдный імейл?",
-       "passwordreset-capture-help": "Кідь означіте тото поличко, буде імейл (з дочасным геслом) оркем посланя хоснователёви указаный і вам.",
        "passwordreset-email": "Адреса електронічной пошты:",
        "passwordreset-emailtitle": "Детайлы конта на {{SITENAME}}",
        "passwordreset-emailtext-ip": "Дахто (може Вы, з IP адресы $1) попросив о наставлїня нового гесла до вашого конта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане слїдуюче конто|суть повязаны слїдуючі конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло стане неплатным|Тоты дочасны гесла стануть неплатныма}} {{PLURAL:$5|за день|за $5 днї|за $5 днїв}}.\nТеперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту просьбу послав хтось другый або сьте собі на своє старе гесло спомянули і не хочете го змінити, можете тото повідомлїня іґноровати і дале хосновати старе гесло.",
        "saveprefs": "Уложыти",
        "restoreprefs": "Обновити вшыткы штандартны наставлїня (у вшыткых секціях)",
        "prefs-editing": "Едітованя",
-       "rows": "Рядкы:",
-       "columns": "Колонкы:",
        "searchresultshead": "Гляданя",
        "stub-threshold": "Поріг про форматованя одказу як <a href=\"#\" class=\"stub\">одказів на \"stub\"</a> (v bajtech):",
        "stub-threshold-disabled": "Выпнуте",
        "userrights-reason": "Причіна:",
        "userrights-no-interwiki": "Не маєте поволїня мінити права хоснователїв на іншых вікі.",
        "userrights-nodatabase": "Датабаза $1 не екзістує або не є місцёва.",
-       "userrights-nologin": "Мусите ся [[Special:UserLogin|приголосити]] на конто адміністратора, жебы сьте могли мінити права хоснователїв.",
-       "userrights-notallowed": "Вы не мате права придати або одстранити хосновательскы права.",
        "userrights-changeable-col": "Ґрупы, котры можете змінити",
        "userrights-unchangeable-col": "Ґрупы, котры не можете змінити",
        "userrights-conflict": "Конфлікт змін прав хоснователїв! Просиме, перевірьте зміны і потвердьте їх.",
-       "userrights-removed-self": "Вы успішно позбавили ся властных прав. Зато уж веце не мате приступ до той сторінкы.",
        "group": "Ґрупа:",
        "group-user": "Хоснователї",
        "group-autoconfirmed": "Автопотверджены хоснователї",
        "right-siteadmin": "Замыкана і одомыканя датабазы",
        "right-override-export-depth": "Експорт сторінок включаючі звязаны сторінкы з глубков до 5",
        "right-sendemail": "Посыланя пошты іншым хоснователям",
-       "right-passwordreset": "Перезераня імейлів про зміну гесла",
        "newuserlogpage": "Лоґ вытварянь хоснователїв",
        "newuserlogpagetext": "Тото є список ново реґістрованых хоснователїв.",
        "rightslog": "Лоґ хосновательскых прав",
        "blocklink": "заблоковати",
        "unblocklink": "одблоковати",
        "change-blocklink": "змінити блок",
-       "contribslink": "пÑ\80иÑ\81пÑ\96вкÑ\8b",
+       "contribslink": "внеÑ\81ок",
        "emaillink": "послати імейл",
        "autoblocker": "Сьте были автоматічно блокованы, протоже здїляте IP-адресу з хоснователём „[[User:$1|$1]]“. Причіна блокованя того хоснователя: „$2“",
        "blocklogpage": "Запис блоковань",
        "version-license": "Ліценція",
        "version-ext-license": "Ліценція",
        "version-ext-colheader-name": "Росшырїня",
-       "version-ext-colheader-version": "Верзія",
+       "version-ext-colheader-version": "Версія",
        "version-ext-colheader-license": "Ліценція",
        "version-ext-colheader-description": "Попис",
        "version-ext-colheader-credits": "Авторы",
        "feedback-subject": "Предмет:",
        "feedback-submit": "Одослати",
        "feedback-thanks": "Дякуєме! Ваш коментарь быв приданый на сторінку „[$2 $1]“.",
-       "searchsuggest-search": "Глядати",
+       "searchsuggest-search": "Глядати {{SITENAME}}",
        "searchsuggest-containing": "обсягуючій...",
-       "api-error-badaccess-groups": "Не мате дозволено наладововати файлы на тоту вікі.",
        "api-error-badtoken": "Внутрїшня хыба: планый знак.",
-       "api-error-copyuploaddisabled": "Наладовованя з URL є на тім сервері заказане.",
-       "api-error-duplicate": "На тій вікі уж {{PLURAL:$1|екзістує другый файл|екзістують іншы файлы}} з такым самым обсягом.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|быв другый файл|были даякы другы файлы}} з такым самым обсягом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.",
-       "api-error-empty-file": "Наладованый файл є порожнїй.",
        "api-error-emptypage": "Створїня новых, порожнїх сторінк неслободно.",
-       "api-error-fetchfileerror": "Внутрїшня хыба: трафила ся хыба під час обтриманя файлу.",
-       "api-error-fileexists-forbidden": "Файл з назвов „$1“ уж екзістує тай не годен го переписати.",
-       "api-error-fileexists-shared-forbidden": "файл з назвов „$1“ уж екзістує в сполочнім усховищу тай не годен го переписати.",
-       "api-error-file-too-large": "Наладованый файл є барз великый.",
-       "api-error-filename-tooshort": "Назва файлу є барз курта.",
-       "api-error-filetype-banned": "Тот тіп файлу є заказаный.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|є недозволеный формат файлів|суть недозволены форматы файлів}}. {{PLURAL:$3|Дозволеный формат фалів є|Дозволены форматы файлів суть}} $2.",
-       "api-error-filetype-missing": "Тот файл не мать росшырїня.",
-       "api-error-hookaborted": "Пожадована вами зміна была одмітнута дакотрым росшырінём.",
-       "api-error-http": "Внутрїшня хыба: не вдало ся припоїти к серверу.",
-       "api-error-illegal-filename": "Тота назва файлу не є дозволена.",
-       "api-error-internal-error": "Внутрїшня хыба: притрафила ся хыба під час спрацованя вашого наладованого файлу.",
-       "api-error-invalid-file-key": "Внутрїшня хыба: файл ся не нашов в дочаснім усховіщі.",
-       "api-error-missingparam": "Внутрїшня хыба: хыбують параметры пожадавкы.",
-       "api-error-missingresult": "Внутрїшня хыба: не годен становити, ці копірованя было успішне.",
-       "api-error-mustbeloggedin": "Жебы наладовати файлы, мусите быти приголошеный.",
-       "api-error-mustbeposted": "Внутрїшня хыба: пожадавка мусить быти через HTTP POST.",
-       "api-error-noimageinfo": "Наладованя было успішне, але сервер не додав о файлї ниякы інформації.",
-       "api-error-nomodule": "Внутрїшня хыба: не є наставленый модул наладовованя.",
-       "api-error-ok-but-empty": "Внутрїшня хыба: сервер не одповідать.",
-       "api-error-overwrite": "Не є дозволене переписати екзістуючій файл.",
-       "api-error-stashfailed": "Внутрїшня хыба: серверу ся не вдало уложыти дочасный файл.",
        "api-error-publishfailed": "Внутрїшня хыба: серверови ся не вдало опубліковати дочасный файл.",
-       "api-error-timeout": "Сервер не одповідав в очекаванім часї.",
-       "api-error-unclassified": "Трафила ся незнама хыба.",
-       "api-error-unknown-code": "Незнама хыба: „$1“",
-       "api-error-unknown-error": "Внутрїшня хыба: трафила ся хыба при спробі о наладованя файлу.",
+       "api-error-stashfailed": "Внутрїшня хыба: серверу ся не вдало уложыти дочасный файл.",
        "api-error-unknown-warning": "Незнаме варованя: $1",
        "api-error-unknownerror": "Незнама хыба: „$1“",
-       "api-error-uploaddisabled": "Начітаваня файлів є на тій вікі выпнуте.",
-       "api-error-verification-error": "Файл є може пошкодженый, або мать плане росшырїня.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минуту|минуты|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|година|годины|годин}}",
index d96819c..0992814 100644 (file)
        "passwordreset-emaildisabled": "अस्मिन् विकि-जालस्थाने वि-पत्रसम्बद्धाः सेवाः असमर्थिताः सन्ति ।",
        "passwordreset-username": "सदस्यनाम:",
        "passwordreset-domain": "प्रदेशः :",
-       "passwordreset-capture": "परिणामस्वरूपनिर्मितानि वि-पत्राणि द्रष्टुम् इच्छति ?",
-       "passwordreset-capture-help": "अस्यां मञ्जूषायां यदि भवता अङ्क्यते तर्हि वि-पत्रम् (अस्थायिकूटशब्देन सह) दर्श्यते प्रेष्यते च ।",
        "passwordreset-email": "वि-पत्रसङ्केतः",
        "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र योजकविषये",
        "passwordreset-emailtext-ip": "कोऽपि (कदाचित् भवान्/भवती, $1 अन्तर्जालसंविदः (from IP)) {{SITENAME}}($4) जालस्थानस्य कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । अनेन वि-पत्रेण सह निम्न{{PLURAL:$3|योजकः सल्लग्नः अस्ति|योजकाः सल्लग्नाः सन्ति}} ।\n\n$2\n\n{{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} {{PLURAL:$3|एषः अल्पकालीनकूटशब्दः निरस्तः भविष्यति|एते अल्पकालीनकूटशब्दाः निरस्ताः भविष्यन्ति}} ।\n\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पुरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छति ।",
        "saveprefs": "रक्ष्यताम्",
        "restoreprefs": "मूलव्यवस्थापनानुगुणं (default settings) सर्वे विकल्पाः भवन्तु (सर्वेषु विभागेषु)",
        "prefs-editing": "सम्पादनम्",
-       "rows": "पङ्कतयः :",
-       "columns": "स्तम्भाः :",
        "searchresultshead": "अन्वेषणम्",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> इत्यस्य प्रारूपणस्य (formatting) कृते प्रारम्भिकसोपानम् (अष्टकानि) :",
        "stub-threshold-disabled": "निष्क्रियः",
        "userrights-reason": "कारणम् :",
        "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
        "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते अथवा तु सः स्थानीयः नास्ति ।",
-       "userrights-nologin": "सदस्येभ्यः अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
-       "userrights-notallowed": "सदस्येभ्यः अधिकारं दातुं, योजकान् अपाकर्तुं च ते अनुमतिः नास्ति ।",
        "userrights-changeable-col": "परिवर्तनार्हाः समूहाः",
        "userrights-unchangeable-col": "परिवर्तयितुम् अनर्हाः समूहाः",
        "userrights-conflict": "सदस्याधिकारस्य परिवर्तनेषु अन्तर्विरोधः अस्ति ! कृपया स्वकृतानि परिवर्तनानि पुनरवलोक्य संरक्ष्यन्ताम् ।",
-       "userrights-removed-self": "भवता/भवत्या सफलतया स्वाधिकाराः अपाकृताः । अतः भवान्/भवती एतत् पृष्ठं द्रष्टुं न प्रभवति ।",
        "group": "समूहः :",
        "group-user": "सदस्याः",
        "group-autoconfirmed": "स्वदृढितयोजकाः",
        "right-siteadmin": "दत्तांशनिधिं किलतु, अकिलितं च करोतु",
        "right-override-export-depth": "यानि पुष्ठानि पञ्चस्तरपर्यन्तं संलग्नानि सन्ति, तेषां सर्वेषां निर्यातं करोतु ।",
        "right-sendemail": "अन्ययोजकेभ्यः वि-पत्रं प्रेषयतु",
-       "right-passwordreset": "निकुञ्चपुनारचितानां विद्युन्मानपत्राणाम् अवलोकनम् ।",
        "right-managechangetags": "दत्तांशात् [[Special:Tags|चिह्नानि]] निर्मीयन्ताम्, अपाक्रियन्तां च",
        "right-applychangetags": "[[Special:Tags|चिह्नानि]] एकस्य परिवर्तनेन सह प्रयुञ्जताम् ।",
        "right-changetags": "स्वतन्त्रसंस्करणे, प्रवेशावल्यां च [[Special:Tags|चिह्नानि]] ऐच्छितरीत्या स्थापयतु, निष्कासयतु च",
        "uploaddisabledtext": "उत्तारितसञ्चिकाः निष्क्रियाः ।",
        "php-uploaddisabledtext": "PHP मध्ये उत्तारितसञ्चिकाः निष्क्रियाः ।",
        "uploadscripted": "HTMLयुक्ताः अथवा लिपिसङ्केतयुक्ताः सञ्चिकाः जालदर्शिकया बाधिताः ।",
-       "uploadscriptednamespace": "\"$1\" इत्येत् अमान्यं नामावकाशं SVG सञ्चिकायां विद्यते ।",
+       "uploadscriptednamespace": "\"<nowiki>$1</nowiki>\" इत्येत् अमान्यं नामावकाशं SVG सञ्चिकायां विद्यते ।",
        "uploadinvalidxml": "उपारोहितसञ्चिकायां स्थितं XML व्याख्यायितं (parse) कर्तुं न शक्यते ।",
        "uploadvirus": "अस्यां सञ्चिकायां वैराणुः अस्ति । विवरणम् $1",
        "uploadjava": "इयं ZIP सञ्चिका अस्यां जावावर्गस्य सञ्चिकाः सन्ति । \nजावासञ्चिकाः उत्तरणं निषिद्धम् । यतः अनेन सुरक्षाबन्धाः शिथिलाः भवन्ति ।",
        "feedback-useragent": "योजकानुयोज्यः :",
        "searchsuggest-search": "अन्वेषणम्",
        "searchsuggest-containing": "विद्यन्ते......",
-       "api-error-badaccess-groups": "भवान् अस्यां वीक्यां सञ्चिकाः उत्तारयितुम् नानुमतः ।",
        "api-error-badtoken": "आन्तरिकदोषः : दुष्टप्रतीकः ।",
-       "api-error-copyuploaddisabled": "अस्मिन् वितारके युआर् एल् द्वारा उत्तारणं निष्क्रियम् ।",
-       "api-error-duplicate": "{{PLURAL:$1| अन्यसञ्चिकाः | सन्ति काश्चन अन्यसञ्चिकाः}} एकस्मिन् एव ।",
-       "api-error-duplicate-archive": "तत्र {{PLURAL:$1|आसीत् काश्चन अन्यसञ्चिकाः|काचन अन्यसञ्चिकाः}}, पूर्वमेव {{PLURAL:$1|यह was|they आसन्}} किन्तु अपनीताः ।",
-       "api-error-empty-file": "समर्पिता सञ्चिका रिक्ता आसीत् ।",
        "api-error-emptypage": "नूतनस्य रिक्तस्य पृष्ठस्य सर्जनं निषिद्धम् ।",
-       "api-error-fetchfileerror": "आन्तरिकदोषः : सञ्चिकायाः प्राप्त्यवसरे कश्चन दोषः जातः ।",
-       "api-error-fileexists-forbidden": "\"$1\" नामिका सञ्चिका पूर्वमेव विद्यते । पुनः तदुपरि लेखनम् अशक्यम् ।",
-       "api-error-fileexists-shared-forbidden": "\"$1\" इति नाम्नः सञ्चिका पूर्वमेव सञ्चिकाकोशे अस्ति । अधिलिखितं न स्यात् ।",
-       "api-error-file-too-large": "समर्पिता सञ्चिका सुदीर्घा अस्ति ।",
-       "api-error-filename-tooshort": "सञ्चिकानाम अतीव ह्रस्वम् अस्ति ।",
-       "api-error-filetype-banned": "ईदृशी सञ्चिका अनुरुद्धा ।",
-       "api-error-filetype-banned-type": "'''\".$1\"'''सञ्चिका {{PLURAL:$4|प्रकारस्य }} अनुमतिः नास्ति ।\nप्रकारसञ्चिकायाः{{PLURAL:$3|}} अनुमतिरस्ति  $2।",
-       "api-error-filetype-missing": "अस्याः सञ्चिकायाः विस्तारः लुप्तः अस्ति ।",
-       "api-error-hookaborted": "भवतः संस्करणप्रयत्नः विस्तारेण अपसारितः ।",
-       "api-error-http": "आन्तरिकदोषः : वितारकस्य सम्पर्के असमर्थम् ।",
-       "api-error-illegal-filename": "सञ्चिकानामलेखनं नानुमतम् ।",
-       "api-error-internal-error": "आन्तरिकदोषः : वीक्यां भवतः उत्तारणावसरे काचनदोषः संवृत्तः ।",
-       "api-error-invalid-file-key": "आन्तरिकदोषः : अनित्यसञ्चिकाकोशे सञ्चिका न दृष्टा ।",
-       "api-error-missingparam": "आन्तरिकदोषः : अभ्यर्थनानुगुणं व्याप्तिः विलुप्ता ।",
-       "api-error-missingresult": "आन्तरिकदोषः : प्रतिकृतिः सफला इति निश्चिता नाभवत् ।",
-       "api-error-mustbeloggedin": "सञ्चिकायाः उपारोपणाय अन्तः प्रवेशः अनिवार्यः ।",
-       "api-error-mustbeposted": "आन्तरिकदोषः : HTTP प्रस्तोतुम् अभ्यर्थनम् आवश्यकम् ।",
-       "api-error-noimageinfo": "उत्तारणं सफलम् । किन्तु सञ्चिकाविषये वितारकः कामपि सूचनां न अयच्छतु ।",
-       "api-error-nomodule": "आन्तरिकदोषः : उत्तारणघटकः न व्यवस्थितः ।",
-       "api-error-ok-but-empty": "आन्तरिकदोषः : वितारकतः प्रतिस्पन्दः न प्राप्तः ।",
-       "api-error-overwrite": "वर्तमानसञ्चिकायाः पुनर्लेखनं नानुमतम् ।",
-       "api-error-stashfailed": "आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितारकः असमर्थः जातः ।",
        "api-error-publishfailed": "आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितरकः असमर्थः जातः ।",
-       "api-error-stasherror": "गोपनीयस्थाने सञ्चिकायाः उपारोहणकाले दोषः समुद्भूतः ।",
-       "api-error-stashedfilenotfound": "यदा गुहितस्थाने सञ्चिकाम् उपारोहणस्य प्रयासः कृतः, तदा गुहितसञ्चिका न प्राप्ता ।",
-       "api-error-stashpathinvalid": "गुहितस्थानस्य यः मार्गः प्रदत्तः, सः अमान्यः अस्ति ।",
-       "api-error-stashfilestorage": "गोपनीयस्थाने सञ्चिकायाः उपारोहणकाले दोषः समुद्भूतः ।",
-       "api-error-stashzerolength": "वितरकः गुहितसञ्चिकां नाप्रापत्, यतो हि तस्य दीर्घ्यं नासीत् ।",
-       "api-error-stashnotloggedin": "गुहितस्थाने सञ्चिकाम् उपारोहितुं भवान्/भवती प्रविश्यताम् ।",
-       "api-error-stashwrongowner": "यां सञ्चिकां भवान्/भवती गुहिकस्थाने उपारोहितुं प्रयासं करोति, सा भवतः/भवत्याः नास्ति ।",
-       "api-error-stashnosuchfilekey": "गुहितस्थानस्य यां सञ्चिकायाः तालिकां भवान्/भवती इच्छति, सा न विद्यते ।",
-       "api-error-timeout": "अपेक्षितावधौ वितारकेण प्रतिस्पन्दः न दर्शितः ।",
-       "api-error-unclassified": "कश्चन अज्ञातः दोषः जातः ।",
-       "api-error-unknown-code": "अज्ञातः दोषः \" $1 \"",
-       "api-error-unknown-error": "आन्तरिकदोषः : सञ्चिकायाः आरोपणावसरे कश्चन दोषः जातः ।",
+       "api-error-stashfailed": "आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितारकः असमर्थः जातः ।",
        "api-error-unknown-warning": "अज्ञातः प्रबोधः \"$1\"",
        "api-error-unknownerror": "अज्ञातः दोषः \" $1 \"",
-       "api-error-uploaddisabled": "अस्यां वीक्याम् आरोपणं निष्क्रिया कृता अस्ति ।",
-       "api-error-verification-error": "इयं सञ्चिका सदोषा स्यात् अथवा विस्तारः दोषयुक्तः स्यात् ।",
        "duration-seconds": "$1 {{PLURAL:$1|क्षणम्|क्षणानि}}",
        "duration-minutes": "$1 {{PLURAL:$1|निमेषः|निमेषाः}}",
        "duration-hours": "$1 {{PLURAL:$1|घण्टा|घण्टाः}}",
index 4a5ce17..8c3e93a 100644 (file)
        "uploaded-setting-handler-svg": "«Handler» атрибууту аадырыс/дааннай/скрипт көмөтүнэн быһаарар SVG хааччахтаммыт. Угуллубут SVG-билэҕэ <code>$1=\"$2\"</code> конструкция көстүбүт.",
        "uploaded-remote-url-svg": "Тэйиччи URL-лунан атрибууттуур SVG хааччахтаммыт. Киллэриллибит SVG-билэҕэ <code>$1=\"$2\"</code> көстүбүт.",
        "uploaded-image-filter-svg": "Хачайдаммыт SVG-билэҕэ маннык URL-аадырыстаах ойуу сиидэтэ көстүбүт <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
+       "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '<nowiki>$1</nowiki>'",
        "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "uploadvirus": "Бу билэ вирустаах! Көр: $1",
        "uploadjava": "Билэ Java .class билэлээх ZIP-архыып эбит.\nКуттал суох буолбатын диэн Java-билэрэри манна угар бобуллар.",
index 807dbfc..d74cacf 100644 (file)
        "passwordreset-emaildisabled": "Li funziunalità di e-mail foru disattivati nta sta wiki.",
        "passwordreset-username": "Nomu utenti:",
        "passwordreset-domain": "Duminiu:",
-       "passwordreset-capture": "Ammustrari lu missaggiu e-mail chi veni cumpostu?",
-       "passwordreset-capture-help": "Si attivi sta casedda, lu missaggiu e-mail (câ password timpurània) veni ammustratu a tìa sparti chi veni mannatu a l'utenti.",
        "passwordreset-email": "Nnirizzu di posta elittrònica:",
        "passwordreset-emailtitle": "Dittagghî dû cuntu supra a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quarchidunu (prubbabbilmenti tu, dô nnirizzu IP $1) fici n'addumannata pi l'azziramentu dâ tò password pi {{SITENAME}} ($4). {{PLURAL:$3|Lu cuntu utenti siguenti è assuciatu|Li cunti utenti siguenti sù assuciati}} cu stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurània|Sti password timpurànii}} scàdinu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a tràsiri e scègghiri na password nova. Si fu quarchidun'àutru a fari st'addumannata e nun tu, o si t'arricurdasti la tò password origginali e nun la voi canciari cchiù, poi gnurari stu missaggiu e cuntinuari a adupirari la tò password vecchia.",
        "saveprefs": "Sarva",
        "restoreprefs": "Riprìstina tutti li mpustazzioni pridifinuti (nta tutti li sizzioni)",
        "prefs-editing": "Canciamentu",
-       "rows": "Righi:",
-       "columns": "Culonni:",
        "searchresultshead": "Arricerca",
        "stub-threshold": "Sogghia pi furmattari nu liami comu bozza ($1):",
        "stub-threshold-sample-link": "esempiu",
        "userrights-reason": "Mutivu:",
        "userrights-no-interwiki": "Nun hai lu pirmissu di canciari li dritti di l'utenti nta l'àutri wiki.",
        "userrights-nodatabase": "La basi di dati $1 nun esisti o nun è lucali.",
-       "userrights-nologin": "Hai a [[Special:UserLogin|tràsiri]] cûn cuntu d'amministraturi pi putiri assignari li dritti di l'utenti.",
-       "userrights-notallowed": "Nun hai lu pirmissu di agghiùnciri o livari dritti a l'utenti.",
        "userrights-changeable-col": "Gruppi chi si ponnu canciari",
        "userrights-unchangeable-col": "Gruppi chi nun si ponnu canciari",
        "userrights-conflict": "Cunflittu di canciamentu dî dritti di l'utenti! Pi favuri cuntrolla e cunferma li tò canciamenti.",
-       "userrights-removed-self": "Arriniscisti a livàriti li tò stissi dritti. Pi chistu, nun hai cchiù l'accessu a sta pàggina.",
        "group": "Gruppu:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti autu-cunfirmati",
        "right-siteadmin": "Bluccari e sbluccari la basi di dati",
        "right-override-export-depth": "Espurtari pàggini cu li pàggini culligati nfina ô quintu liveddu",
        "right-sendemail": "Mannari missaggi di posta elittrònica a l'àutri utenti",
-       "right-passwordreset": "Taliari li missaggi di posta elittrònica d'azziramentu dî password",
        "right-managechangetags": "Criari e cancillari [[Special:Tags|etichetti]] dâ basi di dati",
        "right-applychangetags": "Appizzari [[Special:Tags|etichetti]] ntê propî canciamenti",
        "right-changetags": "Agghiùnciri e livari a piaciri [[Special:Tags|etichetti]] dî virsioni e dî vuci di riggistru",
        "uploaded-setting-handler-svg": "Lu còdici SVG ca mposta l'attribbutu \"handler\" a na distinazzioni rimota/data/script veni bluccatu. Fu attruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
        "uploaded-remote-url-svg": "Lu còdici SVG ca mposta n'attribbutu style qualegghiè versu di n'URL rimota veni bluccatu. Fu attruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
        "uploaded-image-filter-svg": "Fu attruvatu nu filtru di mmàggini cu URL <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
-       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunzintutu, \"$1\".",
+       "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunzintutu, \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "L'XML ntô file carricatu nun potti èssiri analizzatu sintatticamenti.",
        "uploadvirus": "Lu file cunteni un virus!\nDittagghî: $1",
        "uploadjava": "Stu file è n'archiviu ZIP chi cunteni nu file .class Java.\nCarricari file Java nun è cunzintutu pirchì pirmèttinu d'aggirari li ristrizzioni di sicurizza.",
        "feedback-useragent": "Aggenti di l'utenti:",
        "searchsuggest-search": "Arricerca",
        "searchsuggest-containing": "chi cunteni...",
-       "api-error-badaccess-groups": "Nun hai lu pirmissu di carricari file nta sta wiki.",
        "api-error-badtoken": "Erruri nternu: Token sbagghiatu",
-       "api-error-copyuploaddisabled": "Lu carricamentu a pàrtiri d'URL è disattivatu nta stu server.",
-       "api-error-duplicate": "Già {{PLURAL:$1|c'è n'àutru file]|ci sunnu àutri file]}} supra ô situ chi {{PLURAL:$1|havi|hannu}} lu stissu cuntinutu.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|C'era n'àutru file|C'èranu àutri file}} supra ô situ c'{{PLURAL:$1|avìa|avìanu}} lu stissu cuntinutu, ma {{PLURAL:$1|fu cancillatu|foru cancillati}}.",
-       "api-error-empty-file": "Lu file chi mannasti era vacanti.",
        "api-error-emptypage": "Criari pàggini novi e vacanti nun è cunzintutu.",
-       "api-error-fetchfileerror": "Erruri nternu: Quarchi cosa nun funziunau mentri chi si carricava lu file.",
-       "api-error-fileexists-forbidden": "Nu file chi si chiama \"$1\" già esisti, e nun si pò suprascrìviri.",
-       "api-error-fileexists-shared-forbidden": "Nu file chi si chiama \"$1\" già esisti ntô dipòsitu cunnivisu, e nun si pò suprascrìviri.",
-       "api-error-file-too-large": "Lu file chi mannasti era troppu grossu.",
-       "api-error-filename-tooshort": "Lu nomu dû file è troppu curtu.",
-       "api-error-filetype-banned": "Stu tipu di file è sbannutu.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nun è un tipu di file cunzintutu|nun sù tipi di file cunzintuti}}. {{PLURAL:$3|Lu tipu di file cunzintutu è|Li tipi di file cunzintuti sunnu}} $2.",
-       "api-error-filetype-missing": "Ô nomu dû file ci ammanca l'estinzioni.",
-       "api-error-hookaborted": "Lu canciamentu chi stavi pruvannu a fari fu annullatu di n'estinzioni.",
-       "api-error-http": "Erruri nternu: Mpussìbbili culligàrisi ô server.",
-       "api-error-illegal-filename": "Lu nomu dû file nun è cunzintutu.",
-       "api-error-internal-error": "Erruri nternu: Quarchi cosa nun funziunau mentri chi si stava travagghiannu lu tò carricamentu supra â wiki.",
-       "api-error-invalid-file-key": "Erruri nternu: Lu file nun fu attruvatu ntâ mimurizzazzioni timpurània.",
-       "api-error-missingparam": "Erruri nternu: Ammàncanu paràmitri nta l'addumannata.",
-       "api-error-missingresult": "Erruri nternu: Nun fu pussìbbili capiri si la copia arriniscìu.",
-       "api-error-mustbeloggedin": "Hai a aviri trasutu pi carricari file.",
-       "api-error-mustbeposted": "Erruri nternu: L'addumannata havi bisognu di POST HTTP.",
-       "api-error-noimageinfo": "Lu carricamentu arriniscìu, pirò lu server nun ni desi nudda nfurmazzioni a prupòsitu dû file.",
-       "api-error-nomodule": "Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu",
-       "api-error-ok-but-empty": "Erruri ntenru: nudda risposta dû server",
-       "api-error-overwrite": "Suprascriviri nu file ca nun esisti nun è cunsitutu",
-       "api-error-stashfailed": "Erruri nternu: lu server nun arrinisciu a mimurizzari lu ducumentu timpuraniu",
        "api-error-publishfailed": "Erruri nternu: Lu server nun arriniscìu a pubblicari lu file timpuràniu.",
-       "api-error-stasherror": "Ci fu n'erruri ntô carricari lu file nta l'ammucciagghia.",
-       "api-error-stashedfilenotfound": "Lu file nun fu attruvatu nta l'ammucciagghia duranti lu tintativu di carricamentu a pàrtiri di l'ammucciagghia.",
-       "api-error-stashpathinvalid": "Lu caminu unni avissi avutu a èssiri lu file nta l'ammucciagghia nun era vàlidu.",
-       "api-error-stashfilestorage": "Ci fu n'erruri ntô mimurizzari lu file nta l'ammucciagghia.",
-       "api-error-stashzerolength": "Lu server nun potti mèttiri lu file nta l'ammucciagghia, pirchì avìa lunghizza zeru.",
-       "api-error-stashnotloggedin": "Hai a aviri trasutu pi sarvari file nta l'ammucciagghia.",
-       "api-error-stashwrongowner": "Lu file nta l'ammucciagghia chi pruvasti a pigghiari nun t'apparteni.",
-       "api-error-stashnosuchfilekey": "Lu file nta l'ammucciagghia chi pruvasti a pigghiari nun esisti.",
-       "api-error-timeout": "Lu server nun arrispunniu ntô tempu privistu",
-       "api-error-unclassified": "S'avvirificau n'erruri scanusciutu",
-       "api-error-unknown-code": "Erruri scanusciuti: \"$1$\".",
-       "api-error-unknown-error": "Erruri nternu: Quarchi cosa nun funziunau ntô tintativu di carricari lu tò file.",
+       "api-error-stashfailed": "Erruri nternu: lu server nun arrinisciu a mimurizzari lu ducumentu timpuraniu",
        "api-error-unknown-warning": "Avvisu scanusciutu: \"$1\".",
        "api-error-unknownerror": "Erruri scanusciutu: \"$1\".",
-       "api-error-uploaddisabled": "Lu carricamentu è disattivatu nta sta wiki.",
-       "api-error-verification-error": "Lu file purrìa èssiri ruinatu, o puru aviri la stinzioni sbagghiata.",
        "duration-seconds": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|uri}}",
index a94b562..a6af6a9 100644 (file)
        "passwordreset-emaildisabled": "Wab-mail features hae been disabled oan this wiki.",
        "passwordreset-username": "Uisername:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "See the ootcomin e-mail?",
-       "passwordreset-capture-help": "Gif ye check this kist, the e-mail (wi the temperie passwaird) will be shawn til ye n be sent til the uiser ava.",
        "passwordreset-email": "Wab-mail address:",
        "passwordreset-emailtitle": "Accoont details oan {{SITENAME}}",
        "passwordreset-emailtext-ip": "Somebodie (likely ye, fae IP address $1) requested ae reset o yer passwaird fer {{SITENAME}} ($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}}\nassociated 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 passwaird nou. Gif some ither bodie makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae longer\nwish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
        "saveprefs": "Hain preferences",
        "restoreprefs": "Restore aw defaut settins (in aw sections)",
        "prefs-editing": "Eeditin",
-       "rows": "Raws:",
-       "columns": "Columns:",
        "searchresultshead": "Rake ootcome settins",
        "stub-threshold": "Threeshaud fer <a href=\"#\" class=\"stub\">stub airtin</a> formattin (bytes):",
        "stub-threshold-disabled": "Disablt",
        "userrights-reason": "Raison:",
        "userrights-no-interwiki": "Ye dinna hae permission tae eedit uiser richts oan ither wikis.",
        "userrights-nodatabase": "Database $1 disna exeest or isna local.",
-       "userrights-nologin": "Ye maun [[Special:UserLogin|log in]] wi aen admeenistrater accoont tae assign uiser richts.",
-       "userrights-notallowed": "Ye dinna hae permeession tae eik or remuiv uiser richts.",
        "userrights-changeable-col": "Groops that ye can chynge",
        "userrights-unchangeable-col": "Groops ye canna chynge",
        "userrights-conflict": "Conflict o uiser richts chynges! Please luikower n confirm yer chynges.",
-       "userrights-removed-self": "Ye'v successfulie remuived yer ain richts. N sae, ye'r naw langer able tae access this page.",
        "group": "Groop:",
        "group-user": "Uisers",
        "group-autoconfirmed": "Autæconfirmed 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-passwordreset": "See passwaird reset wab-mails",
        "newuserlogpage": "Uiser cræftin log",
        "newuserlogpagetext": "This is ae log o uiser cræftins.",
        "rightslog": "Uiser richts log",
        "uploaddisabledtext": "File uplaids ar disabled.",
        "php-uploaddisabledtext": "File uplaids ar disabled in PHP.\nPlease check the file_uploads settin.",
        "uploadscripted": "This file hauds HTML or script code that micht be wranglie interpretit bi ae wab brouser.",
-       "uploadscriptednamespace": "This SVG file contains aen illegal namespace \"$1\"",
+       "uploadscriptednamespace": "This SVG file contains aen illegal namespace \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "The XML in the uplaided file coudna be parsed.",
        "uploadvirus": "The file hauds a virus! Details: $1",
        "uploadjava": "The file is ae ZIP file that contains ae Java .class file.\nUplaidin Java files isna permitit cause thay can cause secureetie restreections tae be bypassed.",
        "feedback-thanks": "Thanks! Yer feedback haes been posted til the page \"[$2 $1]\".",
        "searchsuggest-search": "Rake",
        "searchsuggest-containing": "containin...",
-       "api-error-badaccess-groups": "Ye'r na permittit tae uplaid files til this wiki.",
        "api-error-badtoken": "Inby mistak: Bad token.",
-       "api-error-copyuploaddisabled": "Uplaidin bi URL is disabled oan this server.",
-       "api-error-duplicate": "Thaur {{PLURAL:$1|is anither file|ar some ither files}} awreadie oan the site wi the same content.",
-       "api-error-duplicate-archive": "Thaur {{PLURAL:$1|wis anither file|were some ither files}} awreadie oan the site wi the same content, but {{PLURAL:$1|it wis|thay were}} delytit.",
-       "api-error-empty-file": "The file that ye haunnit in wis tuim.",
        "api-error-emptypage": "Cræftin new, tuim pages isna permittit.",
-       "api-error-fetchfileerror": "Internal mistak: Sommit went wrang while fetchin the file.",
-       "api-error-fileexists-forbidden": "Ae file wi the name \"$1\" awreadie exeests, n canna be owerwritten.",
-       "api-error-fileexists-shared-forbidden": "Ae file wi the name \"$1\" awreadie exeests in the shaired file reposeetair, n canna be owerwritten.",
-       "api-error-file-too-large": "The file that ye haunnit in wis ower muckle.",
-       "api-error-filename-tooshort": "The filename is ower short.",
-       "api-error-filetype-banned": "This type o file is banned.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|isna ae permittit file type|arna permittit file types}}. Permittit {{PLURAL:$3|file type is|file types ar}} $2.",
-       "api-error-filetype-missing": "The filename is missin aen extension.",
-       "api-error-hookaborted": "The modeefication that ye gave makin ae gae wis abortit bi aen extension.",
-       "api-error-http": "Internal mistak: Onable tae connect til server.",
-       "api-error-illegal-filename": "The filename isna permitit.",
-       "api-error-internal-error": "Internal mistak: Sommit went wrang wi processin yer uplaid oan the wiki.",
-       "api-error-invalid-file-key": "Internal mistak: File wisna foond in temparie storage.",
-       "api-error-missingparam": "Internal mistak: Missin boonds oan request.",
-       "api-error-missingresult": "Internal mistak: Coudna determine gif the copie succeeded.",
-       "api-error-mustbeloggedin": "Ye maun be loggit in tae uplaid files.",
-       "api-error-mustbeposted": "Internal mistak: Request needs HTTP POST.",
-       "api-error-noimageinfo": "The uplaid succeeded, bit the server didna gie us onie information aneat the file.",
-       "api-error-nomodule": "Internal mistak: Naw uplaid module set.",
-       "api-error-ok-but-empty": "Internal mistak: Naw response fae server.",
-       "api-error-overwrite": "Owerwritin aen exeestin file isna permitit.",
-       "api-error-stashfailed": "Internal mistak: Server failed tae store temparie file.",
        "api-error-publishfailed": "Internal mistak: Server failed tae publeesh temparie file.",
-       "api-error-stasherror": "Thaur wis ae mistak while uplaidin the file tae stash.",
-       "api-error-stashedfilenotfound": "The stashed file wis no foond whan attemptin tae uplaid it fae the stash.",
-       "api-error-stashpathinvalid": "The path that the stashed file shid hae been foond at wis no valid.",
-       "api-error-stashfilestorage": "Thaur wis ae mistak in storin the file in the stash.",
-       "api-error-stashzerolength": "The server coudna stash the file, cause it haed zero langth.",
-       "api-error-stashnotloggedin": "Ye maun be loggit in tae hain files in the uplaid stash.",
-       "api-error-stashwrongowner": "The file that ye were attemptin tae access in the stash disna belang tae ye.",
-       "api-error-stashnosuchfilekey": "The file key that ye were attemptin tae access in the stash disna exeest.",
-       "api-error-timeout": "The server didna respond wiin the expectit time.",
-       "api-error-unclassified": "Aen onkent mistake occurred.",
-       "api-error-unknown-code": "Onknawn mistak: \"$1\".",
-       "api-error-unknown-error": "Internal mistak: Sommit went wrang whan uplaidin yer file.",
+       "api-error-stashfailed": "Internal mistak: Server failed tae store temparie file.",
        "api-error-unknown-warning": "Onknawn warnishment: \"$1\".",
        "api-error-unknownerror": "Onknawn mistak: \"$1\".",
-       "api-error-uploaddisabled": "Uplaidin is disabled oan this wiki.",
-       "api-error-verification-error": "This file micht be rotten, or hae the wrang extension.",
        "duration-seconds": "$1 {{PLURAL:$1|seicont|seiconts}}",
        "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
        "duration-hours": "$1 {{PLURAL:$1|hoor|hoors}}",
index ba5685a..9549557 100644 (file)
        "statistics-articles": "موادي صفحا",
        "statistics-pages": "صفحا",
        "statistics-files": "چاڙهيل فائيل",
+       "statistics-edits": "{{SITENAME}} جي ٺھڻ کان صفحن ۾ ڪيل سموريون ترميمون",
        "statistics-edits-average": "سراسري ترميمون في صفحو",
        "statistics-users": "کاتيدار [[Special:ListUsers|يُوزرس]]",
        "statistics-users-active": "سرگرم يُوزرس",
index 86d1f66..5676eee 100644 (file)
@@ -81,6 +81,7 @@
        "mypage": "پەڕە",
        "mytalk": "وەتوویش",
        "navigation": "ڕێدەرکردن",
+       "and": "&#32;و",
        "qbfind": "پیا بکە",
        "qbbrowse": "بگەرد",
        "qbedit": "وێراشتە",
        "actions": "کردارەگان",
        "namespaces": "شوونناوەگان",
        "variants": "شێوەزارەگان",
+       "navigation-heading": "منۆێ ڕێدەرکردن",
        "errorpagetitle": "غەڵەت",
        "returnto": "بەورەو ئڕاێ $1.",
+       "tagline": "لە {{SITENAME}}",
        "help": "یارمەتی",
        "search": "مینە",
        "searchbutton": "مینە",
        "jumptonavigation": "ڕێدەرکردن",
        "jumptosearch": "مینە",
        "aboutsite": "سەبارەت وە {{SITENAME}}",
+       "aboutpage": "Project:لەوارەی",
        "copyrightpage": "{{ns:project}}:مافەیل لەوەرگرتن",
        "currentevents": "ڕووداوەیل ئێرەنگەیی",
        "currentevents-url": "Project:ڕووداوەیل ئێرەنگەیی",
        "nstab-mediawiki": "پەیام",
        "nstab-help": "پەڕەێ کۆمەک",
        "nstab-category": "پول",
+       "mainpage-nstab": "دەسپێک",
        "missing-article": "دەیتابەیسەگە نەتۊەنست دەق پەڕەێگ وە ناو «$1» $2 پێیابکەێد ک ئەشێ پێیابکردیاتاد.\n\nئیە فرەتر لە مدووێ وەدۊاچین بەستیارێگ جیاواز یادیرۆک کۆنەێ پەڕەێگ سڕیاێ ڕوو دەێد.\n\nئەگەر لەێوا نیە، ئەوە گەھا گرفتێگ لەێ نەرمامێرە پێیاکردیەسە.\nتکایە ئیە وە ئاماژەدان وە ناونیشان URLـەگەیەو وە [[Special:ListUsers/sysop|وەڕێوەوەرێگ]] ڕاپۆرت بدە.",
        "missingarticle-rev": "(نسخە#: $1)",
        "badtitle": "ناونیشان خراو",
        "loginlanguagelabel": "زوان: $1",
        "pt-login": "بچووە ناو",
        "pt-login-button": "بچووە ناو",
+       "pt-createaccount": "ھەژمار درس بکە",
        "oldpassword": "تێپەڕوشەێ قەدیمی:",
        "newpassword": "تێپەڕوشەێ نوو:",
        "retypenew": "تێپەڕوشەێ نوو دوبارە بنۊسەو:",
        "searchprofile-images-tooltip": "مینە ئڕاێ پەڕگەگان",
        "searchprofile-everything-tooltip": "لە گشت ناوەرۆکێگ مینە بکە (تەنانەت پەڕەگان وتوویشیش)",
        "searchprofile-advanced-tooltip": "مینە لەناو شوونناوە دڵخوازەگان",
+       "search-result-size": "$1 ({{PLURAL:$2|یەک وشە|$2 وشە}})",
        "search-redirect": "(ڕەوانەکەر $1)",
        "search-section": "(بەش $1)",
        "search-suggest": "ئایا مەبەستت ئیە بۊ: $1",
        "group-all": "(گشت)",
        "right-read": "خوەنین پەڕەگان",
        "right-edit": "وێراشتەکردن پەڕەگان",
+       "right-writeapi": "ئەوکاربردن API ئەڕاێ نۊساین",
        "newuserlogpage": "پێرست درسکردن ئەوکاربەر",
        "action-edit": "ئەی پەڕە وێراشتە بکە",
        "nchanges": "$1 {{PLURAL:$1|گووڕانکاری}}",
        "rcshowhidepatr": "وێراشتە نەگەردیاێەگان $1",
        "rcshowhidemine": "وێراشتەگانم $1",
        "rclinks": "دۊایین $1 گووڕانکاری $2 ڕووژ ویەردە نیشان بدە<br />$3",
+       "diff": "جیاوازی",
        "hist": "دیرۆک",
        "hide": "بشارەو",
        "minoreditletter": "بێجگە",
+       "newpageletter": "ن",
+       "boteditletter": "بۆت",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گووڕانکاری",
        "rc-enhanced-expand": "وردەکاریەگان نیشان بدە",
        "rc-enhanced-hide": "وردەکاریەگان بشارەو",
        "recentchangeslinked": "گووڕانکاریە پەیوەندیدارەگان",
        "statistics-pages": "پەڕەیل",
        "pageswithprop-submit": "بچوو",
        "brokenredirects-edit": "وێراشتە",
+       "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}",
        "prefixindex": "گشت پەڕەگان وە پێشگرەو",
        "protectedpages-page": "پەڕە",
        "protectedpages-unknown-timestamp": "نەناسریاێ",
        "undelete-show-file-submit": "بەڵێ",
        "namespace": "شوونناوەگان",
        "invert": "ھەڵوژیاێەگان وەزێزەو بکە",
+       "blanknamespace": "(سەرەکی)",
        "contributions": "بەشدارییەگان {{GENDER:$1|ئەوکاربەر}}",
        "contributions-title": "بەشداریەگان ئەوکاربەر $1",
        "mycontris": "بەشداریەیل",
        "tooltip-pt-mycontris": "پێرست بەشداریەیلت",
        "tooltip-pt-login": "پێشنیار ئەوپیت کریەێد بچیدە ناو؛ ھەرچەن زووری نیە",
        "tooltip-pt-logout": "دەرچین",
+       "tooltip-pt-createaccount": "داوەت لەلیت بووت ک ھەژمارێگ درس بکەیت و بچیتە ناو، هەرچەن ئیە وە مەیل خوەتە",
        "tooltip-ca-talk": "وەتوویش سەبارەت وە ناوەڕۆک پەڕە",
        "tooltip-ca-edit": "تۊەنی وێراشتەێ ئەی پەڕەیە بکەید. تکایە وەر لە پاشدەسکردن دوگمەێ پێشدۊنن ئەوکاربوەێن.",
        "tooltip-ca-addsection": "بەشێگ نوو دەس پی بکە",
        "tooltip-feed-atom": "خواردەمەنی ئەتۆم ئڕاێ ئەی پەڕە",
        "tooltip-t-contributions": "پێرست بەشداریەگان ئەی ئەوکاربەر",
        "tooltip-t-emailuser": "ئیمەیلێگ بنارە ئڕاێ ئەی ئەوکاربەرە",
+       "tooltip-t-upload": "پەڕگەێگ بار بکە",
        "tooltip-t-specialpages": "پێرست گشت پەڕە تایوەتەگان",
        "tooltip-t-print": "نسخەێ چاپی ئەی پەڕە",
        "tooltip-t-permalink": "بەسیار ھەمیشەیی وە ئەی وەشان لە ئەی پەڕە",
        "tooltip-ca-nstab-main": "دۊنن پەڕەێ ناوەڕۆک",
        "tooltip-ca-nstab-user": "پەڕەێ ئەوکاربەر تەماشا بکە",
-       "tooltip-ca-nstab-special": "ئیە پەڕەێگ تایبەتە، نیەتۊەنی خوەێ ئەی پەڕە وێراشتە بکەید",
+       "tooltip-ca-nstab-special": "ئیە پەڕەێگ تایبەتە و وێراشتە نیەکریەێت",
        "tooltip-ca-nstab-project": "دۊنن پەڕەێ پرۆژە",
        "tooltip-ca-nstab-image": "دۊنن پەڕەێ پەڕگە",
        "tooltip-ca-nstab-template": "دۊنن قاڵبەگە",
        "tooltip-rollback": "«گەڕانن» گووڕانکاری/گووڕانکاریەگان ئەی پەڕە وە یەک کرتە گەڕانێدەو ئڕاێ دۊایین بەشداریکەر",
        "tooltip-undo": "«بەتاڵکردن» ئەی گووڕانکاریە گووڕنێدەو و فۆرم وێراشتەکردن لە شێوەی پێشدۊنن وازەو کەێد. ئەی جوورە پووڕێد مدووێگ لە کورتەێ وێراشتە بنۊسریەێد.",
        "tooltip-summary": "کۆرتەێگ لە لی بنۊسە",
+       "pageinfo-toolboxlink": "زانیاری پەڕە",
        "pageinfo-redirectsto-info": "زانیاری",
        "pageinfo-contentpage-yes": "بەڵێ",
        "pageinfo-protect-cascading-yes": "بەڵێ",
        "file-nohires": "رەزۆلوشن سەرتر لەیە لە وەردەستەو نیە.",
        "svg-long-desc": "پەڕگەێ SVG، وە ناو $1 × $2 پیکسڵ، قەوارەێ پەڕگە: $3",
        "show-big-image": "پەڕگەێ رەسەن",
+       "show-big-image-preview": "قەوارەێ ئەی پێشدۊنینە: $1.",
+       "show-big-image-other": "{{PLURAL:$2|ڕزێلووشن|ڕزێلووشنەیل}} تر: $1.",
+       "show-big-image-size": "$1 لە $2 پیکسەڵ",
        "ilsubmit": "مینە",
        "bad_image_list": "فۆرمەت وە شێوەێ خوارەسە:\n\nتەنیا ئەو باوەتەیلە ک پێرست کریانە (واتە ئەو ھێڵەیلە ک وە * دەس پێ کەن) لە وەر چاون.\nیەکەم بەسیار لە سەر ھەر ھێڵێگ، ئەشێ بەسیار فایلێگ خراو بوود.\nگشت بەسیارەگان دۊاێ ئەوە لە ئەو ھێڵە، چۊ نائاسایی(ئستسنا) تیەنە ئەژمار.",
        "metadata": "متادەیتا",
        "specialpages": "پەڕە تایوەتەگان",
        "external_image_whitelist": " #ئەی ھێڵە ھەر وە ئەی جوورە ک ھەس، وەر بدەین<pre>\n#رستە وەنەزمەگان (regular expression) (تەنیا ئەو بەشە کە لە نێوان // جێ گرێد) لە خوارەو بنەین\n#ئیانە وەرد نیشانی ئینترنتی وێنەیل دەرەکی بەسیار دریای (hotlinked) چەترگیەن (تەتبیق دریەن).\n#ئەوانە ک چەترگیانە، چۊ وێنە نیشان دریەن؛ وەگەرنە تەنیا بەسیارێگ وە وێنە نیشان دەریەێد.\n#ئەو ھێڵەیلە وە # دەس پێ کەن، جوور شرۆڤە (comments) گیریەنە وەر چەو\n#ئەی ھێڵەیلە وە گەورە و بۊچگی پیتەگان ھەستیارە (case-insensitive)\n\n#گشت رستە وەنەزمەگان (regex) لە ژۊەر ئەی ھێڵە بنەین. ئەی ھێڵ ھەر وە ئەی جوورە کە ھەس، وەر بدەین</pre>",
        "tag-filter": "پاڵووین [[Special:Tags|تاگ]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|تاگ|تاگەیل}}]]: $2)",
        "tags-active-yes": "بەڵێ",
        "tags-active-no": "نە",
        "tags-edit": "وێراشتە",
        "htmlform-no": "نە",
        "htmlform-yes": "بەڵێ",
+       "logentry-newusers-create": "ھەژمار ئەوکاربەری $1 {{GENDER:$2|درس کریا}}",
        "feedback-message": "پەیام:",
-       "searchsuggest-search": "Ù\85Û\8cÙ\86ە",
+       "searchsuggest-search": "Ù\84Û\95 {{SITENAME}} Ù\85Û\8cÙ\86Û\95 Ø¨Ú©ە",
        "expand_templates_ok": "باشە",
        "pagelang-name": "پەڕە",
        "pagelang-language": "زوان",
index c3817d5..687d41f 100644 (file)
        "passwordreset-emaildisabled": "Bataga alhaaley n' ka kaŋ wikiyoo ga.",
        "passwordreset-username": "Goykaw maa:",
        "passwordreset-domain": "Zunbudoo:",
-       "passwordreset-capture": "Cebe batagaa kaŋ hun woo ra?",
-       "passwordreset-capture-help": "Nda war na bataa woo šilbay, batagaa (nda šiiyan šennikufal) ga cebe war se nd'a ga sanbandi goykaa do.",
        "passwordreset-email": "Bataga aderesu:",
        "passwordreset-emailtitle": "Kontu šilbawey {{SITENAME}} ga",
        "passwordreset-emailtext-ip": "Boro foo (sanda war da, nda IP aderesu $1) ceeci ka war\n šenniufaloo barmay {{SITENAME}} ($4) se. Goykaa woo {{PLURAL:$3|kontoo ti}\n kaŋ ga hanga bataga aderesoo woo:\n\n $2\n\n{{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}}  ga buu {{PLURAL:$5|zaari foo|zaari}} ra.\nWar ga hima ka huru nda šennifulal taaga dam sohõ. Nda boro waani ka ceeci ka woo tee\n nda war honga war šennikufal žeenaa, nda war ši boona koyne\n ka šennikufal barmay,\n war ga hin ka šaawaroo woo murayy nda soobay ka goy nda war\n šennikufal žeenaa. \\",
        "saveprefs": "Gaabu",
        "restoreprefs": "Tilasu kayandiyaney kul yeeti (dunbey kul ra)",
        "prefs-editing": "Goo ma fasal",
-       "rows": "Sorrawey:",
-       "columns": "Soofey:",
        "searchresultshead": "Ceeci",
        "stub-threshold": "Šiifa <a href=\"#\" class=\"stub\">zaa dobu</a> takari kayandiyan (cebsi hinna) se:",
        "stub-threshold-disabled": "Ga kay",
        "userrights-reason": "Dalil:",
        "userrights-no-interwiki": "War ši nda fonda ka goykaw alhakey fasal wiki tanayaŋ ga.",
        "userrights-nodatabase": "Bayhayhugu $1 ši bara wal'a šii gandaa ra. \\",
-       "userrights-nologin": "War ga hima ka [[Special:UserLogin|huru]] nda juwalkaw kontu ka goykaw alhakey noo.",
-       "userrights-notallowed": "War ši nda fondo ka goykey alhakey dam wala k'i kaa.",
        "userrights-changeable-col": "Kondawey kaŋ war ga hin k'i barmay",
        "userrights-unchangeable-col": "Kondawey kaŋ war ga hin k'i barmay",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Cerehooyan goykaw alhadey barmawey ra! Taare war barmawey guna boryo nd'a tabatandi.",
-       "userrights-removed-self": "War na war alhakey kaa ka timme. Adiši, war ši hin ka duu moɲoo woo koyne.",
        "group": "Konday:",
        "group-user": "Goykey",
        "group-autoconfirmed": "Goykaw boŋtabatantey",
        "right-siteadmin": "Bayrahugoo kufal nd'a feeri",
        "right-override-export-depth": "Moɲey kaataray kaŋ ra moo dobantey hala guusu 5 alkadar ga",
        "right-sendemail": "Bataga sanba goykaw taney do",
-       "right-passwordreset": "Šennikufal yeetiyan batagawey guna",
        "newuserlogpage": "Goykaw teeyan ceebandu tiira",
        "newuserlogpagetext": "Goykaw teeyaney ceebandu tiira ti woo.",
        "rightslog": "Goykaw alhakey ceebandu tiira",
        "uploaddisabledtext": "Tuku zijandiyaney n' ka kay.",
        "php-uploaddisabledtext": "Tuku zijandiyaney n' ka kay PHP ra.\nTaare file_uploads kayandiyanoo koroši.",
        "uploadscripted": "Tukoo woo goo nda HTML wala šigira ašariya kaŋ ga hima kaŋ maanaa dere interneti ceecikaw se.",
-       "uploadscriptednamespace": "SVC tukoo woo goo nda maafarru \"$1\" kaŋ ši alhukum ra.",
+       "uploadscriptednamespace": "SVC tukoo woo goo nda maafarru \"<nowiki>$1</nowiki>\" kaŋ ši alhukum ra.",
        "uploadinvalidxml": "XML kaŋ goo tuku zijantaa ra mana hin ka fesu-fesandi.",
        "uploadvirus": "Tukoo goo nda wirisi!\nŠilbayhayey: $1",
        "uploadjava": "Tukoo ti ZIP tuku kaŋ goo nda Java .class tuku.\nJava tukey zijandiyan ši duu fondo zama i ga hin ka saajaw-sahãnte jejebuhayey hoo.",
        "feedback-thanks": "Foo nda goy! War willandoo n' ka wallafandi \"[$2 $1]\" moɲoo ga.",
        "searchsuggest-search": "Ceeci",
        "searchsuggest-containing": "goo nda…",
-       "api-error-badaccess-groups": "War ši nda fondo ka tukey zijandi wikiyoo woo ga.",
        "api-error-badtoken": "Kunahere firka: Tokore laala.",
-       "api-error-copyuploaddisabled": "URL zijandiyan n' ka kay feršikaa woo ga.",
-       "api-error-duplicate": "{{PLURAL:$1|ti ti tuku tana $2}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|ti ti tuku tana}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da, amma {{PLURAL:$1|an' ka|in' ka}} tuusandi.",
-       "api-error-empty-file": "Tukoo kaŋ war n'a sanba mma koonu.",
        "api-error-emptypage": "Boro ši hin ka moo taaga, koonuyaŋ tee.",
-       "api-error-fetchfileerror": "Kunahere firka: Haya foo mana boori tuku zaayan waate.",
-       "api-error-fileexists-forbidden": "Tuku nda \"$1\" maa ga bara ka ben, nda haya ši hin ka hantumandi a boŋ.",
-       "api-error-fileexists-shared-forbidden": "Tuku nda \"$1\" maa ga bara ka ben tuku jišidoo žemnate ra, nda haya ši hin ka hantumandi a boŋ.",
-       "api-error-file-too-large": "Tukoo kaŋ war n'a sanba mma hansa ka beeri.",
-       "api-error-filename-tooshort": "Tukumaaɲoo ga hansa ka duura.",
-       "api-error-filetype-banned": "Tuku dumoo woo n' ka barrandi.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|manti tuku dumi duɲante|manti tuku dumi duɲanteyaŋ}}. {{PLURAL:$3|Tuku dumi ti|Tuku dumi ti}} $2 ka duɲe.",
-       "api-error-filetype-missing": "Dobuyan foo ga kuma tukumaaɲoo ra.",
-       "api-error-hookaborted": "Dobuyan foo na barmayyanoo kaŋ war ceeci k'a tee say.",
-       "api-error-http": "Kunahere firka: Ši hin ka dobu feršikaa ga.",
-       "api-error-illegal-filename": "Tukumaaɲoo ši nda fondo.",
-       "api-error-internal-error": "Kunahere firka: Haya foo mana boori kaŋ war ga soobay ka haya zijandi wikiyoo ga.",
-       "api-error-invalid-file-key": "Kunahere firka: Tukoo mana duwandi waati-duura jišidoo ra.",
-       "api-error-missingparam": "Kunahere firka: Kayandiyan hãantey ga kuma.",
-       "api-error-missingresult": "Kunahere firka: Mana hin ka tabatandi wala bereyanoo tee ka boori.",
-       "api-error-mustbeloggedin": "War ga hima ka huru to tukey zijandey.  \\",
-       "api-error-mustbeposted": "Kunahere firka: Hãayan ga HTTP WALLAFIYAN waažibandi. \\",
-       "api-error-noimageinfo": "Zijandiyanoo boori, amma feršikaa man'ir noo alhabar kul tukoo ga.",
-       "api-error-nomodule": "Kunahere firka: Zijandiyan dunbu kul mana kayandi.",
-       "api-error-ok-but-empty": "Kunahere firka: Zaabi kul ši hun feršikaa do.",
-       "api-error-overwrite": "Boro ši hin ka hantum tuku barante boŋ.",
-       "api-error-stashfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku yeeti.",
        "api-error-publishfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku wallafi.",
-       "api-error-stasherror": "Firka bangay kaŋ tuku ga zijandi titilaa boŋ.",
-       "api-error-stashedfilenotfound": "Tuku titilantaa mana duwandi waatoo kaŋ boro ceeci k'a zijandi ka hun titilaa ga.",
-       "api-error-stashpathinvalid": "Fondaa kaŋ ga tuku titilantaa hima ka duwandi ši boori.",
-       "api-error-stashfilestorage": "Firka bangay waatoo kaŋ tukoo ga jisandi titilaa ra.",
-       "api-error-stashzerolength": "Feršikaa mana hin ka tukoo deke, zama nga kuuyanoo ti yaada.",
-       "api-error-stashnotloggedin": "War ga hima ka tukey gaabu zijandi titilaa ra.",
-       "api-error-stashwrongowner": "War ši tukoo din may kaŋ war cindi k'a ceeci titilaa ra.",
-       "api-error-stashnosuchfilekey": "Tukoo kaŋ war cindi k'a ceeci titilaa ra ši bara.",
-       "api-error-timeout": "Feršikaa mana tuuru waatoo kaŋ ga hima ra.",
-       "api-error-unclassified": "Firka šibayante bangay.",
-       "api-error-unknown-code": "Firka šibayante: \"$1\".",
-       "api-error-unknown-error": "Kunahere firka: Haya foo mana boori kaŋ war ceeci ka war tukoo zijandi.",
+       "api-error-stashfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku yeeti.",
        "api-error-unknown-warning": "Yaamar šibayante: \"$1\".",
        "api-error-unknownerror": "Firka šibayante: \"$1\".",
-       "api-error-uploaddisabled": "Zijandiyan n' ka kay wikiyoo woo ga. \\",
-       "api-error-verification-error": "A ga hin ka tee tukoo woo laybu, wal'a goo nda dobuyan laala.",
        "duration-seconds": "{{PLURAL:$1|Segondu}} $1",
        "duration-minutes": "{{PLURAL:$1|Miniti}} $1",
        "duration-hours": "{{PLURAL:$1|Guuru}} $1",
index 389398d..eea4a6a 100644 (file)
@@ -12,7 +12,8 @@
                        "KWiki",
                        "Matma Rex",
                        "Srdjan m",
-                       "Conquistador"
+                       "Conquistador",
+                       "Xð"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "unprotectthispage": "Promijeni zaštitu za ovu stranicu",
        "newpage": "Nova stranica / Нова страница",
        "talkpage": "Razgovaraj o ovoj stranici - Разговарај о овој страници",
-       "talkpagelinktext": "Razgovor",
+       "talkpagelinktext": "razgovor",
        "specialpage": "Posebna stranica",
        "personaltools": "Lični alati",
        "articlepage": "Vidi stranicu sadržaja",
        "internalerror_info": "Interna greška: $1",
        "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
-       "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
+       "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
        "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
-       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „<nowiki>$1</nowiki>“",
        "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati zaobilaženje sigurnosnih ograničenja.",
index 1204519..fd6462a 100644 (file)
        "category_header": "ၼႃႈလိၵ်ႈၼႂ်းလိူင်ႈ \"$1\"",
        "subcategories": "ၵိင်ႇၽႄလိူင်ႈ",
        "category-media-header": "သိုဝ်ႇၼႂ်းလိူင်ႈ \"$1\"",
-       "category-empty": "<em> á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\81¸á\80\84á\80ºá\82\87á\81¼á\82\86á\82\89 á\80¢á\80\99á\80ºá\82\87á\80\99á\80®á\80¸á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80\9eá\80­á\80¯á\80\9dá\80ºá\82\88á\80¢á\80®á\82\88သင်ဝႆႉ</em>",
+       "category-empty": "<em> á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\9aá\81¢á\80\99á\80ºá\80¸á\80\9cá\80µá\80\9dá\80º á\80¢á\80\99á\80ºá\82\87á\80\95á\82\86á\82\87á\80\99á\80®á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80\9eá\80­á\80¯á\80\9dá\80ºá\82\87သင်ဝႆႉ</em>",
        "hidden-categories": "{{PLURAL:$1|လိူင်ႈဢၼ်လပ်ႉဝႆႉ |လိူင်ႈၸိူဝ်း ဢၼ်လပ်ႉဝႆႉ}}",
        "hidden-category-category": "လိူင်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "category-subcat-count": "{{PLURAL:$2|ၼႂ်းလိူင်ႈဢၼ်ၼႆႉ မီးၵိင်ႇၽႄလိူင်ႈၼႆႉ ၸိူင်ႉၼႆၵွၺ်း|ၼႂ်းလိူင်ႈၼႆႉ မီး This category has the following {{PLURAL:$1|ၵိင်ႇၽႄလိူင်ႈ|$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "searcharticle": "သိုပ်ႇၵႂႃႇ",
        "history": "ပိုၼ်းၼႃႈလိၵ်ႈ",
        "history_short": "ပိုၼ်း",
+       "history_small": "ပိုၼ်း",
        "updatedmarker": "ပဵၼ်ဢၢပ်ႉတိတ်ႉဝႆႉ ၸဵမ်မိူဝ်ႈၶႃႈၵႂႃႇဢႅဝ်ႇၵမ်းလိုၼ်းသုတ်း",
        "printableversion": "တွၼ်ႈတႃႇဢိတ်ႇဢွၵ်ႇ",
        "permalink": "ႁဵင်းၵွင်ႉ မၼ်ႈၵိုမ်း",
        "unprotectthispage": "လႅၵ်ႈလၢႆႊ ၵၢၼ်ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
        "newpage": "ၼႃႈလိၵ်ႈမႂ်ႇ",
        "talkpage": "ဢုပ်ႇလိူၺ်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
-       "talkpagelinktext": "á\80\90á\80½á\81¼á\80ºá\82\8aဢုပ်ႇ",
+       "talkpagelinktext": "á\80\90á\80½á\81¼á\80ºá\82\88ဢုပ်ႇ",
        "specialpage": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "personaltools": "ၶိူင်ႈ​သုၼ်ႇ​လဵ​ဝ်",
        "articlepage": "တူၺ်း ၼႃႈလိၵ်ႈ ၼမ်းၼႂ်း",
        "views": "လူတူၺ်း",
        "toolbox": "ၶိူင်ႈၵမ်ႉၵႅမ်",
        "tool-link-userrights": "လႅၵ်ႈလၢႆႈ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ၸုမ်း",
+       "tool-link-userrights-readonly": "တူၺ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ၸုမ်း",
        "tool-link-emailuser": "သူင်ႇဢီးမေးလ်ဢၼ်ၼႆႉ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
        "userpage": "တူၺ်းၼႃႈလိၵ်ႈၽူႈၸႂ်ႉတိုဝ်း",
        "projectpage": "တူၺ်းၼႃႈလိၵ်ႈ ပရေႃးၵျႅၵ်ႉ",
        "viewsourceold": "တူၺ်း ငဝ်ႈငႃႇ",
        "editlink": "မႄးထတ်း",
        "viewsourcelink": "တူၺ်း ငဝ်ႈငႃႇ",
-       "editsectionhint": "á\80\99á\80°á\81¼á\80ºá\82\89á\80\99á\82\84á\80¸ á\80\90á\80½á\81¼á\80ºá\82\8a :$1",
+       "editsectionhint": "á\80\99á\80°á\81¼á\80ºá\82\89á\80\99á\82\84á\80¸ á\80\90á\80½á\81¼á\80ºá\82\88 :$1",
        "toc": "ၼမ်းၼႂ်း",
        "showtoc": "ၼႄ",
        "hidetoc": "သိူင်ႇ",
        "enterlockreason": "ပေႃႉသႂ်ႇပၼ် လွင်ႈတၢင်းတႃႇ တေၶတ်းဝႆႉ၊ ႁႂ်ႈပႃးပၼ် ၸဵမ်ၶၢဝ်းယၢမ်း လၢမ်းဢၼ်ဝႃႈ လွင်ႈၶတ်းဝႆႉၼႆႉ တေဢၢပ်ႈၶိုၼ်းပိုတ်ႇပၼ် မိူဝ်ႈလႂ် ဢၼ်ဝႃႈၼၼ်ႉ။",
        "readonlytext": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ယၢမ်းလဵဝ် ထုၵ်ႇၶတ်းဝႆႉတႃႇ တေထႅမ်သႂ်ႇဢၼ်မႂ်ႇ လႄႈ တႃႇမူၼ်ႉမႄး တၢင်ႇလွင်ႈတၢင်ႇၸိူဝ်း၊ မၼ်းတေဢၢပ်ႈပဵၼ်လူၺ်ႈ လွင်ႈဝႃႈ တိုၵ်ႉမူၼ်ႉမႄး ယွင်ၶေႃႈမုၼ်း ၼင်ႇၵႆႉႁဵတ်း။ ဝၢႆးသေၼၼ်ႉတႄႉ တေၶိုၼ်းႁဵတ်းၵၢၼ် မိူၼ်ၵဝ်ႇယူႇ။\n\nဢၼ်ပဵၼ် ၽူႈၵုမ်းၵမ်ပိူင်ႈသၢင်ႈ ၵေႃႉဢၼ်လႆႈ ၶတ်းၼႆႉဝႆႉၼၼ်ႉ မၼ်းပၼ်လွင်ႈသပ်းလႅင်းဝႆႉဝႃႈ : $1",
        "missing-article": "ယွင်ၶေႃႈမုၼ်း ဢမ်ႇသွၵ်ႈႁႃႁၼ်လႆႈ ၽိုၼ်ၼႃႈလိၵ်ႈ ဢၼ်ထုၵ်ႇလီသွၵ်ႈထူပ်းႁၼ် ဢၼ်မီးၸိုဝ်ႈဝႃႈ \"$1\" $2 ။\n\nၼႆႉမၼ်းဢၢပ်ႈပဵၼ်ဝႆႉ ဢၼ်ၸိူဝ်းၼၼ်ႉ မၼ်းၵဝ်ႇၵႄႇၼႃႇလႄႈသင် ဢၼ်ပဵၼ် ပိုၼ်းႁဵင်းၵွင်ႉ ၸူးၼႃႈလိၵ်ႈၼၼ်ႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈယဝ်ႉလႄႈသင် ​ၼႆဢေႃႈ။\n\nပေႃးဢမ်ႇၸႂ်ၸိူင်ႉၼၼ်တႄႉ ၸဝ်ႈၵဝ်ႇ တေလႆႈႁၼ် လွင်ႈယုင်ႈယၢင်ႈၼႆႉ တေၼႄဝႆႉ တီႈၼႂ်း သွပ်ႉၾ်ဝႄး ယူႇ။\nၶႅၼ်းတေႃႈ လဝ်ႈထိုင်ၼႆႉၸူး ၵႃႈတီႈ  [[Special:ListUsers/sysop|administrator]] သေ မၢႆတွင်းဝႆႉပႃး ႁဵင်းလိၵ်ႈ URL မၼ်းသေၶႃႈလႄႈ။",
-       "missingarticle-rev": "(á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\80­á\80¯á\81¼á\80ºá\80¸#: $1)",
+       "missingarticle-rev": "(á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88#: $1)",
        "missingarticle-diff": "(ၼိူင်း: $1, $2)",
        "readonly_lag": "ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းထုၵ်ႇၶတ်းၵႂႃႇ ႁင်းမၼ်း ၽွင်းမိူဝ်ႈ သႃႇပိူဝ်ႇယွင်ၶေႃႈမုၼ်း ဢၼ်ၵႅမ်မၼ်း ထုၵ်ႇတီႉၸပ်းၸူး သႃႇပိူဝ်ႇ​ယွင်ၶေႃႈမုၼ်း ငဝ်ႈမၼ်း။",
        "nonwrite-api-promise-error": "ဢၼ်ပဵၼ်​ႁူဝ်ၶေႃႈ HTTP ၼင်ႇ 'Promise-Non-Write-API-Action' ၼၼ်ႉထုၵ်ႇ သူင်ႇၸူးယဝ်ႉသေတႃႉ လွင်ႈတုၵ်းယွၼ်း မၼ်းတႄႉ တိုၵ်ႉမီးယူႇတီႈ API write module ။",
        "cannotdelete": "ၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် ၾၢႆႇ \"$1\" ၼႆႉ ဢမ်ႇၸၢင်ႈ မွတ်ႇပႅတ်ႈလႆႈ။\nမၼ်းဢၢပ်ႈပဵၼ် ၵူၼ်းသေၵေႃႉၵေႃႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။",
        "cannotdelete-title": "ဢမ်ႇၸၢင်ႈ မွတ်ႇပႅတ်ႈ ၼႃႈ လိၵ်ႈ \"$1\"",
        "delete-hook-aborted": "လွင်ႈမွတ်ႇပႅတ်ႈ ထုၵ်ႇ ၵိုတ်းပႅတ်ႈ။\nမၼ်းဢမ်ႇမီး လွင်ႈ သပ်းလႅင်းၼႄသင်ဝႆႉ။",
-       "no-null-revision": "á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\81µá\80±á\82\83á\82\87á\80\9eá\81¢á\80\84á\80ºá\82\88 á\80\90á\80°á\80\9dá\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ပဝ်ႇမႂ်ႇ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈ \"$1\"",
+       "no-null-revision": "á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\81µá\80±á\82\83á\82\87á\80\9eá\81¢á\80\84á\80ºá\82\88 á\80\90á\80°á\80\9dá\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ပဝ်ႇမႂ်ႇ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈ \"$1\"",
        "badtitle": "ႁူဝ်ၶေႃႈႁၢႆႉၸႃႉ",
        "badtitletext": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈဢၼ် တုၵ်းယွၼ်းဝႆႉၼႆႉ မၼ်းဢမ်ႇၸႂ်ႉလႆႈ၊ ပဝ်ႇဝႆ့ ဢမ်ႇၼၼ် မၼ်းၵွင်ႉၽိတ်းပိူင်ႈဝႆႉတင်း ၽႃႇသႃႇၵႂၢမ်းတၢင်ႇဢၼ် ဢမ်ႇၼၼ် ႁူဝ်ၶေႃႈၼႂ်းၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆ့။",
        "title-invalid-empty": "ၼႃႈလိၵ်ႈဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းဢမ်ႇပႃးဝႆႉႁူဝ်ၶေႃႈမၼ်း ဢမ်ႇၼၼ် မၼ်းတေပႃးဝႃႈ ၸိုဝ်ႈဢၼ်ပဵၼ် လွၵ်းပဝ်ႇဝႆႉၼၼ်ႉၵူၺ်း။",
        "invalidtitle-knownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ လွၵ်းၸိုဝ်ႈ \"$2\" လႄႈ တူဝ်လိၵ်ႈ \"$3\"",
        "invalidtitle-unknownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ ဢမ်ႇလႆႈႁူႉ တၢင်းၼမ်လွၵ်းၸိုဝ်ႈ $1 လႄႈ တူဝ်လိၵ်ႈ \"$2\"",
        "exception-nologin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
+       "virus-unknownscanner": "ဢမ်ႇႁူႉၸၵ်း တူဝ်ၶႃႈမႅင်း:",
        "cannotlogoutnow-title": "ဢမ်ႇၸၢင်ႈ လွၵ်ႉဢွၵ်ႇ ယၢမ်းလဵဝ်",
        "cannotlogoutnow-text": "တေဢမ်ႇၸၢင်ႈ လွၵ်ႉၶဝ်ႈ ၽွင်းမိူဝ်ႈၸႂ်ႉ $1",
        "welcomeuser": "ႁပ်ႉတွၼ်ႈယူႇ, $1!",
        "nav-login-createaccount": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
        "userlogin": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
        "userloginnocreate": "လွၵ်ႉဢိၼ်ႇ",
-       "logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
-       "userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
+       "logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
+       "userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
        "notloggedin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
        "userlogin-noaccount": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ?",
        "userlogin-joinproject": "ႁူမ်ႈ {{SITENAME}}",
        "pt-login-button": "လွၵ်ႉဢိၼ်ႇ",
        "pt-login-continue-button": "သိုပ်ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
        "pt-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
-       "pt-userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
+       "pt-userlogout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
        "php-mail-error-unknown": "ဢမ်ႇႁူႉ လွင်ႈၽိတ်းပိူင်ႈ ၵႃႈတီႈ PHP's mail() function ၼၼ်ႉ။",
        "user-mail-no-addy": "ဢမ်ႇပႃး ႁဵင်းလိၵ်ႈဢီးမေးလ်သေ ၶတ်းၸႂ်သူင်ႇ ဢီးမေးလ်",
        "user-mail-no-body": "ၶတ်းၸႂ်သူင်ႇဢီးမေးလ် လူၺ်ႈ လွင်ႈတၢင်းပဝ်ႇ ဢမ်ႇၼၼ် ပွင်ႈလိၵ်ႈ ဢၼ်ဢမ်ႇမီး တီႈပွင်ႇ",
        "botpasswords-updated-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ ပဵၼ် ဢၢပ်ႉတိတ်ႉယဝ်ႈ။",
        "botpasswords-deleted-title": "ၶေႃႈလပ်ႉပွတ်ႉၼၼ်ႉ မွတ်ႇပႅတ်ႈယဝ်ႉယဝ်ႈ။",
        "botpasswords-deleted-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ မွတ်ႇပႅတ်ႈယဝ်ႉယဝ်ႈ။",
-       "botpasswords-newpassword": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ တႃႇတေၶဝ်ႈ လွၵ်ႉဢိၼ်ႇၸွမ်း  <strong>$1</strong> ပဵၼ် <strong>$2</strong>. <em>ၶႅၼ်းတေႃႈ မၢႆတွင်းၼႆႉဝႆႉ တွၼ်ႈတႃႇ ပဵၼ် ၽိုၼ်ဢိင်မိူဝ်းၼႃႈ</em>",
+       "botpasswords-newpassword": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ တႃႇတေၶဝ်ႈ လွၵ်ႉဢိၼ်ႇၸွမ်း  <strong>$1</strong> ပဵၼ် <strong>$2</strong>. <em>ၶႅၼ်းတေႃႈ မၢႆတွင်းၼႆႉဝႆႉ တွၼ်ႈတႃႇ ပဵၼ် ၽိုၼ်ဢိင်မိူဝ်းၼႃႈ</em><br>(တွၼ်ႈတႃႇ ပွတ်ႉၸိူဝ်းဢၼ်ၵဝ်ႇ ဢၼ်လူဝ်ႇ ၸိုဝ်ႈလွၵ်ႉဢိၼ်ႇ ဢၼ်တေလႆႈမိူၼ်ၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း၊ ၸဝ်ႈၵဝ်ႇၸၢင်ႈၸႂ်ႉ <strong>$3</strong> ၼင်ႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း လႄႈ <strong>$4</strong>ၼင်ႇ ၶေႃႈလပ်ႉ)",
        "botpasswords-no-provider": "ၵၼ်တူဝ်ၵမ်ႉထႅမ်ၶေႃႈလပ်ႉပွတ်ႉၼႆ မၼ်းဢမ်ႇၸႂ်ႉလႆႈ။",
        "botpasswords-restriction-failed": "ၵၼ်ၵႅတ်ႇၶေႃႈလပ်ႉပွတ်ႉ ၼႆႉ ႁႄႉၵင်ႈလွင်ႈ လွၵ်ႉဢိၼ်ႇဢၼ်ၼႆႉ။",
        "botpasswords-invalid-name": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်ႈ ဢၼ်မၵ်းမၼ်ႈဝႆႉၼႆႉ မၼ်းဢမ်ႇၶဝ်ႈပႃးဝႆႉ တူဝ်ၸႅၵ်ႇၶေႃႈလပ်ႉ ပွတ်ႉ (\"$1\") ။",
        "passwordreset-emailelement": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း:\n$1\n\nၶေႃႈလပ်ႉ ၸူဝ်ႈၵႅပ်ႉ:\n$2",
        "passwordreset-emailsentemail": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ဢၶွင်ႉၸဝ်ႈၵဝ်ႇ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
        "passwordreset-emailsentusername": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
+       "passwordreset-nosuchcaller": "ၽူႈႁွင်ႉမႃး ဢမ်ႇမီးဝႆႉ:$1",
        "passwordreset-invalidemail": "ႁဵင်းလိၵ်ႈ ဢီႈမေးလ် ၽိတ်းဝႆႉ။",
        "passwordreset-nodata": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းလႄႈ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢမ်ႇလႆႈၵမ်ႉထႅမ်ဝႆႉ သေဢၼ်။",
        "changeemail": "လႅၵ်ႈလၢႆႈ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
        "editingsection": "မႄးထတ်း $1 (ၵၼ်)",
        "editconflict": "မႄးထတ်း လွင်ႈယုင်ႈယၢင်ႈ : $1",
        "yourtext": "လိၵ်ႈၸဝ်ႈၵဝ်ႇ",
-       "storedversion": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်ဢဝ်ၶိုၼ်း",
+       "storedversion": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ဢဝ်ၶိုၼ်း",
        "yourdiff": "ၸိူဝ်းပႅၵ်ႇပိူင်ႈ",
        "longpageerror": "<strong>လွင်ႈၽိတ်းပိူင်ႈ : လိၵ်ႈၸိူဝ်းဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈသႂ်ႇပၼ်မႃးၼၼ်ႉ တၢင်းယၢဝ်းမၼ်း မီး {{PLURAL:$1|ၼိုင်ႈ kilobyte|$1 kilobytes}}, မၼ်းတိူဝ်းယၢဝ်ၢးလိူဝ်သေ  {{PLURAL:$2|ၼိုင်ႈ kilobyte|$2 kilobytes}}.</strong>\nမၼ်းတေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉပၼ်လႆႈ။",
        "readonlywarning": "<strong>ၽၢင်ႉ : ယွင်ၶေႃႈမုၼ်းၼႆႉ ထုၵ်ႇၶတ်းဝႆႉ တွၼ်ႈတႃႇ ၵၢၼ်မူၼ်ႉ​​မေး၊ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉ ၵၢၼ်လႅၵ်ႈလၢႆႈ ၸဝ်ႈၵဝ်ႇ ယၢမ်းလဵဝ်</strong>\nၸဝ်ႈဝ်ႇ တေလူဝ်ႇ ထုတ်ႇ ၵေႃႇပီႇ သေ ပႃႉသႂ်ႇ ၽဵတ်ႉသႂ်ႇဝႆႉ တီႈၼႂ်း ၾၢႆႇလိၵ်ႈ သေ သိမ်းဝႆႉ တွၼ်ႈတႃႇၶိုၼ်းၸႂ်ႉဝၢႆးလင်။\nၵေႃႉၵုမ်းထိင်ပိူင်သၢင်ႈ ၵေႃႉဢၼ်ၶတ်းဝႆႉၼႆႉ မၼ်းပၼ်လွင်ႈတၢင်းမၼ်းဝႆႉဝႃႈ : $1",
        "permissionserrors": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
        "permissionserrorstext": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇႁဵတ်းဢၼ်ၼၼ်ႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ {{PLURAL:$1|လွင်ႈတၢင်း|လွင်ႈတၢင်းၸိူဝ်း}} ၼႆႉ:",
        "permissionserrorstext-withaction": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇ $2, တွၼ်ႈတႃႇ ၸိူဝ်း ဢၼ်ပဵၼ် {{PLURAL:$1|reason|လွင်ႈတၢင်း}}:",
-       "contentmodelediterror": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\80¢á\81¼á\80ºၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
+       "contentmodelediterror": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
        "recreate-moveddeleted-warn": "<strong>ၶေႃႈၽၢင်ႉပၼ် : ၸဝ်ႈၵဝ်ႇ ၶိုၼ်းၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢၼ်လႆႈ မွတ်ႇပႅတ်ႈၵႂႃႇဝႆႉၼၼ်ႉ။</strong>\n\nၸဝ်ႈၵဝ်ႇ ထုၵ်ႇလီဝူၼ်ႉတူၺ်းဝႃႈ ၸွင်ႇမၼ်းသၢင်ႇထုၵ်ႇ တွၼ်ႈတႃႇတေသိုပ်ႇ မႄးထတ်း ၼႃႈလိၵ်ႈၼႆႉဢၼ်ဝႃႈၼၼ်ႉ။\nသဵၼ်ႈလၢႆ မွတ်ႇပႅတ်ႈလႄႈ ၶၢႆႉဢွင်ႈ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၵႃႈတီႈၼႆႈ တွၼ်ႈတႃႇ ႁႂ်းငၢႆႈလူမ်ၸႂ် :",
        "moveddeleted-notice": "ၼႃႈလိၵ်ႈၼႆႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။ လွင်ႈမွတ်ႇပႅတ်ႈလႄႈ လွင်ႈၶၢႆႉသၢႆမၢႆ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၼင်ႇပႃႈတႂ်ႈၼႆႉယူႇ။ မၼ်းပဵၼ် တွၼ်ႈတႃႇ ႁဵတ်းၽိုၼ်ဢိင်ယဝ်ႉ။",
        "moveddeleted-notice-recent": "ယိၼ်းၶီၸွမ်ႈယူႇ၊ ၼႃႈလိၵ်ႈၼႆႉ တိုၵ်ႉႁႃထုၵ်ႇမွတ်ႇပႅတ်ႈ (ၼႂ်းၶၢဝ်းတၢင်း မိူဝ်ႈပူၼ်ႉမႃး 24 ၸူဝ်ႈမူင်း) ၼႆႉၵူၺ်း။ သဵၼ်ႈမၢႆ မွတ်ႇပႅတ်ႈ လႄႈ ၶၢႆႉဢွင်ႈတီႈ ၸိူဝ်းၼၼ်ႉ လႆႈၵမ်ႉထႅမ်ဝႆႉပၼ်ၼင်ႇၽၢႆႇတႂ်ႈ ႁႂ်ႈၸၢင်ႈပဵၼ် ၵၢၼ်ၽိုၼ်ဢိင်။",
        "defaultmessagetext": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ပိူင်ႇၵႅဝ်ႈ",
        "invalid-content-data": "ၶေႃႈမုၼ်းၶဝ်ႈပႃး ၽိတ်းပိူင်ႈဝႆႉ",
        "content-not-allowed-here": "\"$1\" ၶေႃႈၶဝ်ႈပႃးၼႆႉ ဢမ်ႇၶႂၢင်းပၼ်ဝႆႉ တီႈၼႃႈ လိၵ်ႈ [[$2]]",
+       "editpage-invalidcontentmodel-title": "ပိူင်ႈၵေႃႇသၢင်ႈ လမ်းၼႂ်း ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉ",
+       "editpage-invalidcontentmodel-text": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း \"$1\" ဢမ်ႇလႆႈၵမ်ႉထႅမ်ဝႆႉ",
        "editpage-notsupportedcontentformat-title": "ပိူင်ၶေႃႈၶဝ်ႈပႃး ၼႆႉ ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉပၼ်။",
        "editpage-notsupportedcontentformat-text": "ပိူင်ၶေႃႈၶဝ်ႈပႃး $1 ၼႆႉ မၼ်းဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ် တင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး $2",
        "content-model-wikitext": "လိၵ်ႈဝီႇၶီႇ",
        "post-expand-template-inclusion-warning": "<strong>ၶေႃႈၽၢင်ႉ</strong> - ပိူင်ဢဝ်မႃးႁူမ်ႈၼၼ်ႉယႂ်ႇပူၼ်ႉၼႃႇ။\nပိူင်မၢင်ၼႃႈတေဢမ်ႇႁူမ်ႈပႃးၸွမ်း။",
        "viewpagelogs": "တူၺ်းသၢႆမၢႆ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
        "nohistory": "တီႈၼႆႈ ဢမ်ႇမီး ပိုၼ်းထတ်းသၢင်ႈ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
-       "currentrev": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၵမ်းလိုၼ်းသုတ်း",
-       "currentrev-asof": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° á\81µá\80\99á\80ºá\80¸á\80\9cá\80­á\80¯á\81¼á\80ºá\80¸á\80\9eá\80¯á\80\90á\80ºá\80¸á\81¼á\80\84á\80ºá\82\87  $1",
-       "revisionasof": "á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼင်ႇ $1",
-       "revision-info": "ၶူၼ်ႉလူၼင်ႇ  $1 ၼင်ႇ {{GENDER:$6|$2}}$7",
-       "previousrevision": "â\86\90 á\81¸á\80­á\80°á\80\9dá\80ºá\80¸ဢၼ်ၵဝ်ႇ",
+       "currentrev": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၵမ်းလိုၼ်းသုတ်း",
+       "currentrev-asof": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\81µá\80\99á\80ºá\80¸á\80\9cá\80­á\80¯á\81¼á\80ºá\80¸á\80\9eá\80¯á\80\90á\80ºá\80¸ á\80\99á\80­á\80°á\80\9dá\80ºá\82\88  $1",
+       "revisionasof": "á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼင်ႇ $1",
+       "revision-info": "{{GENDER:$6|$2}}$7 ၵေႃႉ ၶူၼ်ႉၶႆႈမိူဝ်ႈ  $1",
+       "previousrevision": "â\86\90 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ၵဝ်ႇ",
        "nextrevision": "ၵၢၼ်ၶူၼ်ႉလူဢၼ်မႂ်ႇ",
-       "currentrevisionlink": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၵမ်းလိုၼ်းသုတ်း",
+       "currentrevisionlink": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၵမ်းလိုၼ်းသုတ်း",
        "cur": "ယၢမ်းလဵဝ်",
        "next": "ၵႂႃႇၼႃႈ",
        "last": "ဢွၼ်တၢင်း",
        "histlast": "မႂ်ႇသုတ်း",
        "historysize": "({{PLURAL:$1|1 ပၢႆႉ|$1 ပၢႆႉ}})",
        "historyempty": "(ပဝ်ႇ)",
-       "history-feed-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "history-feed-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "history-feed-description": "ပိုၼ်းၶူၼ်ႉလူ တႃႇၼႃႈလိၵ်ႈၼႆႉ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇ",
        "history-feed-item-nocomment": "$1 တီႈ $2",
-       "history-edit-tags": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81¶á\82\85á\80\95á\80ºá\80¸á\80\90á\80­á\80\84á\80º á\81¶á\80½á\80\84á\80º á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၸိူဝ်းလိူၵ်ႈဝႆႉၼၼ်ႉ။",
+       "history-edit-tags": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\81¶á\82\85á\80\95á\80ºá\80¸á\80\90á\80­á\80\84á\80º á\81¶á\80½á\80\84á\80º á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၸိူဝ်းလိူၵ်ႈဝႆႉၼၼ်ႉ။",
        "rev-deleted-comment": "(ႁူဝ်ႁုပ်ႈၵၢၼ်ထတ်းသၢင် ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
        "rev-deleted-user": "(ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
        "rev-deleted-event": "(သဵၼ်ႈမၢႆ ႁူဝ်ယွႆႈ ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
        "rev-deleted-user-contribs": "[ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇၼၼ် မၢႆဢၢႆႇပီႇ ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ  - ၵၢၼ်မႄးထတ်း ၸိူဝ်းၼၼ်ႉ ထုၵ်ႇလပ်ႉဝႆႉ ၵႃႈတီႈ ၵၢၼ်ႁူမ်ႈသၢင်ႈ]",
-       "rev-deleted-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။",
-       "rev-suppressed-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
-       "rev-deleted-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။\nပေႃးဝႃႈ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမီးၵၢင်ၸႂ် ၶႂ်ႈသိုပ်ႇ ႁဵတ်းၵႂႃႇၼႆ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉ  [$1 တူၺ်း လွင်ႈၶူၼ်ႉလူၼႆႉ] ။",
-       "rev-suppressed-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\91á\80¯á\81µá\80ºá\82\87 <strong>á\80\90á\80µá\81µá\80ºá\80¸á\81µá\80­á\80¯á\80\90á\80ºá\80¸</strong> á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9aá\80\9dá\80ºá\82\89á\81\8b\ná\80\9cá\80½á\80\84á\80ºá\82\88á\82\81á\80°á\80\9dá\80ºá\80\9aá\80½á\82\86á\82\88á\80\99á\81¼á\80ºá\80¸ á\80\90á\80±á\81¸á\81¢á\80\84á\80ºá\82\88á\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81µá\82\83á\82\88á\80\90á\80®á\82\88 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] á\81¼á\82\86á\82\88á\80\9aá\80°á\82\87á\81\8b\ná\80\95á\80±á\82\83á\80¸á\80\9dá\82\83á\82\88 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89á\80\99á\80®á\80¸á\81µá\81¢á\80\84á\80ºá\81¸á\82\82á\80º á\81¶á\82\82á\80ºá\82\88á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87 á\82\81á\80µá\80\90á\80ºá\80¸á\81µá\82\82á\82\83á\82\87á\81¼á\82\86 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89  [$1 á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ၼႆႉ] ။",
-       "rev-deleted-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်ႈမၼ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
-       "rev-suppressed-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
-       "rev-deleted-no-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-deleted-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။",
+       "rev-suppressed-text-permission": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\89ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-deleted-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။\nပေႃးဝႃႈ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမီးၵၢင်ၸႂ် ၶႂ်ႈသိုပ်ႇ ႁဵတ်းၵႂႃႇၼႆ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉ  [$1 တူၺ်း လွင်ႈၶူၼ်ႉလူၼႆႉ] ။",
+       "rev-suppressed-text-unhide": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\91á\80¯á\81µá\80ºá\82\87 <strong>á\80\90á\80µá\81µá\80ºá\80¸á\81µá\80­á\80¯á\80\90á\80ºá\80¸</strong> á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9aá\80\9dá\80ºá\82\89á\81\8b\ná\80\9cá\80½á\80\84á\80ºá\82\88á\82\81á\80°á\80\9dá\80ºá\80\9aá\80½á\82\86á\82\88á\80\99á\81¼á\80ºá\80¸ á\80\90á\80±á\81¸á\81¢á\80\84á\80ºá\82\88á\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81µá\82\83á\82\88á\80\90á\80®á\82\88 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] á\81¼á\82\86á\82\88á\80\9aá\80°á\82\87á\81\8b\ná\80\95á\80±á\82\83á\80¸á\80\9dá\82\83á\82\88 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89á\80\99á\80®á\80¸á\81µá\81¢á\80\84á\80ºá\81¸á\82\82á\80º á\81¶á\82\82á\80ºá\82\88á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87 á\82\81á\80µá\80\90á\80ºá\80¸á\81µá\82\82á\82\83á\82\87á\81¼á\82\86 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80­á\80¯á\81µá\80ºá\82\89  [$1 á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႆႉ] ။",
+       "rev-deleted-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်ႈမၼ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-suppressed-text-view": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-deleted-no-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
        "rev-suppressed-no-diff": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၼႂ်ႈၵႃႈ ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။",
-       "rev-deleted-unhide-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
+       "rev-deleted-unhide-diff": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\90á\80±á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89á\81\8a á\80\9aá\80½á\81¼á\80ºá\82\89á\80\95á\80­á\80°á\80\9dá\80ºá\82\88á\80\9dá\82\83á\82\88 á\81¼á\82\82á\80ºá\82\88á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
        "rev-suppressed-unhide-diff": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ၵႂႃႇယဝ်ႉ။\nႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
-       "rev-deleted-diff-view": "á\81¼á\82\82á\80ºá\80¸á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇၸၢင်ႈတူၺ်းလႆႈ လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-deleted-diff-view": "á\81¼á\82\82á\80ºá\80¸á\81µá\82\83á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇၸၢင်ႈတူၺ်းလႆႈ လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
        "rev-suppressed-diff-view": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇ ၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
        "rev-delundel": "ၼႄ/သိူင်ႇ",
        "rev-showdeleted": "ၼႄ",
-       "revisiondelete": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88/ á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "revisiondelete": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88/ á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "revdelete-nooldid-title": "ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်ယိူင်းၸူးၼၼ်ႉ ၽိတ်းဝႆႉ",
        "revdelete-no-file": "ၾၢႆႇဢၼ်မၵ်းမၼ်ႈဝႆႉၼၼ်ႉ မၼ်းဢမ်ႇလႆႈမီးဝႆႉ",
-       "revdelete-show-file-confirm": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\9cá\80\95á\80ºá\82\89á\80\9cá\80½á\80\84á\80ºá\80¸á\80\9aá\80\9dá\80ºá\82\89á\82\81á\82\83á\82\88á\80\9dá\82\83á\82\88 á\80\90á\80±á\81¶á\82\82á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၶွင်ၾၢႆႇ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ။ \"<nowiki>$1</nowiki>\" ၵႃႇတီႈ $2 တေႃႇ $3?",
+       "revdelete-show-file-confirm": "á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\9cá\80\95á\80ºá\82\89á\80\9cá\80½á\80\84á\80ºá\80¸á\80\9aá\80\9dá\80ºá\82\89á\82\81á\82\83á\82\88á\80\9dá\82\83á\82\88 á\80\90á\80±á\81¶á\82\82á\80ºá\82\88á\80\90á\80°á\81ºá\80ºá\80¸ á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၶွင်ၾၢႆႇ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ။ \"<nowiki>$1</nowiki>\" ၵႃႇတီႈ $2 တေႃႇ $3?",
        "revdelete-show-file-submit": "ၸႂ်ႈယဝ်ႉ",
-       "revdelete-selected-text": "{{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° á\80¢á\81¼á\80ºá\80\9cá\80­á\80°á\81µá\80ºá\82\88á\80\9dá\82\86á\82\89\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\80¢á\81¼á\80ºá\80\9cá\80­á\80°á\81µá\80ºá\82\88á\80\9dá\82\86á\82\89\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|ၾၢႆပိူဝ်းသျိၼ်း ဢၼ်လိူၵ်ႈဝႆႉ|ၾၢႆႇပိူဝ်းသျိၼ်း ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်လိူၵ်ႈဝႆႉ|သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ၸိူဝ်းလိူၵ်ႈဝႆႉ}}:",
-       "revdelete-text-text": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၼႃႈလိၵ်ႈ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
+       "revdelete-text-text": "á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၼႃႈလိၵ်ႈ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
        "revdelete-text-file": "ၾၢႆႇပိူဝ်းသျိၼ်း ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၾၢႆႇ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
        "logdelete-text": "သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ သဵၼ်ႈမၢႆ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
        "revdelete-text-others": "သင်ၸိူဝ်ႉဝႃႈ ဢမ်ႇလႆႈ မၵ်ႈသႂ်ႇဝႆႉ လွင်ႈႁႄႉတၢပ်ႈသင်ၼႆတႄႉ ၽူႈၵုမ်းထိင်း မၢင်ၸိူဝ်းၼႆႉ တိုၵ်ႉတေဢဝ်ၸႂ်ႉလႆႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်လပ်ႉဝႆႉသေ တႃႇတေၶိုၼ်းဢမ်ႇမွတ်ႇ ဢၼ်ၼၼ်ႉ။",
        "revdelete-confirm": "ၶႅၼ်းတေႃႈ ၼႄႉၼွၼ်းပၼ်ဝႃႈ ၸဝ်ႈၵဝ်ႇ ယိူင်းဢၢၼ်း ၶႂ်ႈႁဵတ်းဢၼ်ၼႆႉယူႇတႄႉ ဢၼ်ဝႃႈၼၼ်ႉ၊ ယဝ်ႉၵေႃႈ ၸဝ်ႈၵဝ်ႇႁူႉပွင်ႇပႃးဝႃႈ လွင်ႈတေသိုပ်ႇပဵၼ်ၸွမ်းၽၢႆႇလင်လႄႈ လွင်ႈဝႃႈၸဝ်ႈၵဝ်ႇ ႁဵတ်းဢၼ်ၼႆႉၸွမ်းၼင်ႇ လွင်ႈလႆႈၸႂ်ၵၼ်တင်း \n [[{{MediaWiki:Policy-url}}|the policy]].",
        "revdelete-suppress-text": "လွင်ႈတဵၵ်းၵိုတ်း ၼႆႉ  <strong>ထုၵ်ႇလီ ၸႂ်ႉ</strong>  တွၼ်ႈတႃႇ လွင်ႈတၢင်း ၸိူင်ႉၼင်ႇ ပႃႈတႂ်ႈၼႆႉၵူၺ်း။\n* ၶေႃႈပူင်လွၼ်ႉၶၢဝ်ႇ ဢၼ်ဢၢပ်ႈပဵၼ်လႆႈ\n* လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ဢၼ်ဢမ်ႇဢၢပ်ႈ သၢင်ႇတေႃႇ\n*: <em>ႁဵင်းလိၵ်ႈႁိူၼ်း လႄႈ မၢႆၾူင်း၊ မၢႆၶႅပ်းၽၢင်တူဝ် ၸၵႂႃႇၸိူဝ်းၼႆႉ</em>",
        "revdelete-legend": "မၵ်းသႂ်ႇပၼ် လွင်ႈႁႄႉၵင်ႈ တႃႇႁၼ်လႆႈ",
-       "revdelete-hide-text": "á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "revdelete-hide-text": "á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "revdelete-hide-image": "လပ်ႉ ၶေႃႈပႃးၼႂ်း ၾၢႆႇ",
        "revdelete-hide-name": "လပ်ႉ ၶေႃႈယိူင်း လႄႈ ၽၢင်ၵိုၵ်း",
        "revdelete-hide-comment": "မႄးထတ်း ႁုဝ်ႁုပ်ႈ",
        "revdelete-radio-set": "လပ်ႉဝႆႉ",
        "revdelete-radio-unset": "ႁၼ်လႆႈ",
        "revdelete-suppress": "တဵၵ်းၵိုတ်းၶေႃႈမုၼ်း ၸိူဝ်းလုၵ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်ၶဝ် လႄႈ တၢင်ႇၸိူဝ်း",
-       "revdelete-unsuppress": "á\80\91á\80½á\81¼á\80ºá\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81µá\82\85á\80\90á\80ºá\82\87á\82\81á\82\84á\82\89 á\80¢á\81¼á\80ºá\80\99á\80®á\80¸á\80\90á\80®á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်ဢဝ်ဝႆႉၶိုၼ်းၼၼ်ႉ။",
+       "revdelete-unsuppress": "á\80\91á\80½á\81¼á\80ºá\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81µá\82\85á\80\90á\80ºá\82\87á\82\81á\82\84á\82\89 á\80¢á\81¼á\80ºá\80\99á\80®á\80¸á\80\90á\80®á\82\88 á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ဢဝ်ဝႆႉၶိုၼ်းၼၼ်ႉ။",
        "revdelete-log": "လွင်ႈတၢင်း :",
-       "revdelete-submit": "á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87á\82\81á\80µá\80\90á\80ºá\80¸ á\80\90á\80½á\81¼á\80ºá\82\88á\80\90á\82\83á\82\87 {{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\81¸á\80­á\80°á\80\9dá\80ºá\80¸}}ဢၼ်လိူၵ်ႈဝႆႉ",
+       "revdelete-submit": "á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87á\82\81á\80µá\80\90á\80ºá\80¸ á\80\90á\80½á\81¼á\80ºá\82\88á\80\90á\82\83á\82\87 {{PLURAL:$1|á\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88\81µá\81¢á\81¼á\80ºá\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88.}}ဢၼ်လိူၵ်ႈဝႆႉ",
        "revdelete-success": "လွင်ႈႁၼ်လႆႈ ၵၢၼ်ၶူၼ်ႉလူၼႆႉ ပဵၼ် ဢၢပ်ႉတိတ်ႉၵႂႃႇယဝ်ႉ။",
        "revdelete-failure": "လွင်ႈႁၼ်လႆႈ ၵၢၼ်ၶူၼ်ႉလူၼႆႉ ဢမ်ႇပႆႇပဵၼ် ဢၢပ်ႉတိတ်ႉလႆႈ။\n$1",
        "logdelete-success": "မၵ်းသႂ်ႇ လွင်ႈႁၼ်လႆႈ သဵၼ်ႈမၢႆ",
        "revdelete-otherreason": "တၢင်ႇၸိူဝ်း / လွင်ႈတၢင်း ထႅမ်သႂ်ႇထႅင်ႈ",
        "revdelete-reasonotherlist": "လွင်ႈတၢင်းတၢင်ႇၸိူဝ်း",
        "revdelete-edit-reasonlist": "မႄးထတ်း လွင်ႈတၢင်း တႃႇမွတ်ႇ",
-       "revdelete-offender": "á\81½á\80°á\82\88á\80\90á\82\85á\80\99á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 :",
+       "revdelete-offender": "á\81½á\80°á\82\88á\80\90á\82\85á\80\99á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 :",
        "suppressionlog": "သဵၼ်ႈမၢႆ တဵၵ်းၵိုတ်း",
        "mergehistory": "ပိုၼ်းၸိူဝ်း ႁူမ်ႈၼႃႈလိၵ်ႈ",
-       "mergehistory-box": "á\80¢á\80\9dá\80ºá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87á\81¶á\80½á\80\84á\80º သွင်ၼႃႈလိၵ်ႈၼႆႉ ႁူမ်ႈၵၼ်",
+       "mergehistory-box": "á\80¢á\80\9dá\80ºá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88á\80\90á\80®á\82\88 သွင်ၼႃႈလိၵ်ႈၼႆႉ ႁူမ်ႈၵၼ်",
        "mergehistory-from": "ၼႃႈလိၵ်ႈ ငဝ်ႈငႃႇ :",
        "mergehistory-into": "ၼႃႈလိၵ်ႈ ယိူင်းၸူး :",
        "mergehistory-list": "ပိုၼ်းမႄးထတ်း ဢၼ်ၸၢင်ႈႁူမ်ႈလႆႈ",
        "mergehistory-go": "ၼႄပၼ် ၵၢၼ်မႄးထတ်း ဢၼ်ၸၢင်ႈႁူမ်ႈၵၼ်လႆႈ",
-       "mergehistory-submit": "á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 ႁူမ်ႈၵၼ်",
+       "mergehistory-submit": "á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ႁူမ်ႈၵၼ်",
        "mergehistory-empty": "ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ဢၼ်တေၸၢင်ႈႁူမ်ႈၵၼ်လႆႈၼၼ်ႉ ဢမ်ႇမီး",
        "mergehistory-fail-bad-timestamp": "မိၵ်ႈၶၢဝ်းယၢမ်း ၼႆႉဢမ်ႇၸႂ်ႉလႆႈ",
        "mergehistory-fail-invalid-source": "ၼႃးလိၵ်ႈငဝ်ႈငႃႇ ၼႆႉ ဢမ်ႇၸႂ်ႉလႆႈ။",
        "mergelog": "သဵၼ်ႈမၢႆ ႁူမ်ႈၵၼ်",
        "revertmerge": "ၶိုၼ်းၸႅၵ်ႇဢွၵ်ႇ",
        "mergelogpagetext": "သဵၼ်ႈမၢႆ ၸိူဝ်းမီးတႂ်ႈၼႆႉ မၼ်းပဵၼ် သဵၼ်ႈမၢႆ ဢၼ်တိုၵ်ႉဢဝ်ပိုၼ်း ၼႃႈလိၵ်ႈဢၼ်ၼိုင်ႈ ၵႂႃႇလေႃႈၵၼ် ထႅင်ႈတၢင်ႇဢၼ်။",
-       "history-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°တွၼ်ႈတႃႇ \"$1\"",
-       "difference-title": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88 á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° á\80\90á\80\84á\80ºá\80¸ \"$1\"",
+       "history-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88တွၼ်ႈတႃႇ \"$1\"",
+       "difference-title": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\95á\82\85á\81µá\80ºá\82\87á\80\95á\80­á\80°á\80\84á\80ºá\82\88 á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\80\90á\80®á\82\88 \"$1\"",
        "difference-title-multipage": "လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ ၼႃႈလိၵ်ႈ \"$1\" လႄႈ \"$2\"",
        "difference-multipage": "(လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ ၼႃႈလိၵ်ႈ)",
        "lineno": "ထႅဝ် $1:",
-       "compareselectedversions": "á\81¼á\80­á\80°á\80\84á\80ºá\80¸á\81µá\81¼á\80ºá\80\90á\80°á\81ºá\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
-       "showhideselectedversions": "á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88 á\81µá\81¢á\81¼á\80ºá\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81¶á\80½á\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
+       "compareselectedversions": "á\81¼á\80­á\80°á\80\84á\80ºá\80¸á\81µá\81¼á\80ºá\80\90á\80°á\81ºá\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
+       "showhideselectedversions": "á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88 á\81µá\81¢á\81¼á\80ºá\82\81á\81¼á\80ºá\80\9cá\82\86á\82\88 á\81¶á\80½á\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းလိူၵ်ႈဝႆႉ",
        "editundo": "ၶိုၼ်ၶိုၼ်း",
        "diff-empty": "(ဢမ်ႇမီးလွင်ႈပႅၵ်ႇပိူင်ႈ)",
-       "diff-multi-sameuser": "({{PLURAL:$1|á\80\9cá\80½á\80\84á\80ºá\82\88á\80\99á\82\84á\80¸ á\80\95á\81¢á\81¼á\80ºá\81µá\81¢á\80\84á\80º |$1 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\82\84á\80¸ ပၢၼ်ၵၢင်}} ​ပေႃးတႃႇ ၽူႈၸႂ်တိုဝ်းမိူၼ်ၵၼ် တေဢမ်ႇၼႄပၼ်)",
+       "diff-multi-sameuser": "({{PLURAL:$1|á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 á\80\95á\81¢á\81¼á\80ºá\81µá\81¢á\80\84á\80º |$1 á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ပၢၼ်ၵၢင်}} ​ပေႃးတႃႇ ၽူႈၸႂ်တိုဝ်းမိူၼ်ၵၼ် တေဢမ်ႇၼႄပၼ်)",
        "searchresults": "ၶူၼ်ႉႁႃၺႃး",
        "searchresults-title": "ၶူၼ်ႉႁႃၺႃးတွၼ်ႈတႃႇ \"$1\"",
        "titlematches": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ၶူပ်းၵၼ်ယူႇ",
        "search-interwiki-caption": "ၼႃႈၵၢၼ် ပီႈၼွင်ႉၵၼ်",
        "search-interwiki-default": "ၽွၼ်းလႆႈ ၵႃႈတီႈ $1 :",
        "search-interwiki-more": "(လိူဝ်)",
+       "search-interwiki-more-results": "ၽွၼ်းလႆႈ ဢၼ်ၼမ်လိူဝ်",
        "search-relatedarticle": "ၸိူဝ်းၵပ်းၵၢႆႇ",
        "searchrelated": "ၸိူဝ်းၵပ်းၵၢႆႇ",
        "searchall": "တင်းမူတ်း",
        "recentchangescount": "တၢင်းၼမ်ၵၢၼ်မႄးထတ်း ဢၼ်တေၼႄဝႆႉၼင်ႇ ပိူင်ၵႅဝ်ႈ :",
        "prefs-help-recentchangescount": "ၼႆ့မၼ်းၶဝ်ႈပႃးဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ မႂ်ႇမႂ်ႇ၊ ပိုၼ်းၼႃႈလိၵ်ႈ လႄႈ သဵၼ်ႈမၢႆ။",
        "savedprefs": "လွင်ႈလႆႈၸႂ်ၸဝ်ႈၵဝ်ႇၸိူဝ်းၼၼ်ႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
-       "savedrights": "á\80\9eá\80¯á\81¼á\80ºá\82\87á\80\9cá\82\86á\82\88ၽူႈၸႂ်ႉတိုဝ်း {{GENDER:$1|$1}} ၼႆႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
+       "savedrights": "á\81¸á\80¯á\80\99á\80ºá\80¸ၽူႈၸႂ်ႉတိုဝ်း {{GENDER:$1|$1}} ၼႆႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
        "timezonelegend": "ၼႃႈလိၼ် ၶၢဝ်းယၢမ်း :",
        "localtime": "ၶၢဝ်းယၢဝ်း ၼႂ်းမိူင်း :",
        "timezoneuseserverdefault": "ၸႂ်ႉပိူင်ၵႅဝ်ႈ ဝီႇၶီႇ ($1)",
        "prefs-diffs": "လွင်ႈပႅၵ်ႇပိူင်ႈ",
        "prefs-help-prefershttps": "ငဝ်ႈၵုမ်းၵၢၼ်ၼႆႉ ပေႃးဝႃႈ ၶိုၼ်းၶဝ်ႈလွၵ်ႉဢိၼ်ႇထႅင်ႈၵမ်းၼင်ႇ ၸင်ႇတေလႅၵ်ႈလၢႆႈ။",
        "userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုတ်း",
-       "userrights-lookup-user": "á\81¸á\80\90á\80ºá\80¸á\81µá\81¢á\81¼á\80º á\81¸á\80¯á\80\99á\80ºá\80¸ၽူႈၸႂ်ႉတိုဝ်း",
+       "userrights-lookup-user": "á\80\9cá\80­á\80°á\81µá\80ºá\82\88 ၽူႈၸႂ်ႉတိုဝ်း",
        "userrights-user-editname": "ပေႃႇသႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
-       "editusergroup": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ {{GENDER:$1|á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸}} á\81¸á\80¯á\80\99်း",
+       "editusergroup": "á\80\95á\80­á\80¯á\80\90á\80ºá\82\87á\81¸á\80¯á\80\99á\80ºá\80¸ á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9d်း",
        "editinguser": "လႅၵ်ႈလၢႆႈသုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၶွင် {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "မႄးထတ်းၸိူဝ်းၸုမ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "userrights-editusergroup": "မႄးထတ်း ၸုမ်း{{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "userrights-viewusergroup": "တူၺ်း ၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
        "saveusergroups": "သိမ်း  ၸိူဝ်းၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
-       "userrights-groupsmember": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸ á\81¶á\80½á\80\84á\80º :",
-       "userrights-groupsmember-auto": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89 á\81¶á\80½á\80\84á\80º :",
+       "userrights-groupsmember": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸ á\80\90á\80®á\82\88 :",
+       "userrights-groupsmember-auto": "á\81½á\80°á\82\88á\81¶á\80\9dá\80ºá\82\88á\81¸á\80¯á\80\99á\80ºá\80¸á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89 á\80\90á\80®á\82\88 :",
        "userrights-reason": "လွင်ႈတၢင်း :",
        "userrights-no-interwiki": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇ မႄးထတ်း သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၵႃႈတီႈဝီႇၶီႇ တၢင်ႇဢၼ်။",
        "userrights-nodatabase": "ယွင်ၶေႃႈမုၼ်း $1 ၼႆႉဢမ်ႇမီး ဢမ်ႇၼၼ် မၼ်းဢမ်ႇၸႂ်ႈ လူဝ်ႇၵႄႇ။",
        "right-delete": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
        "right-bigdelete": "မွတ်ႇပႅတ်ႈၼႃႈ ဢၼ်ၸိူၵ်းမီးဝႆႉ ပိုၼ်းယႂ်ႇၵႂၢင်ႈ",
        "right-deletelogentry": "မွတ်ႇပႅတ်ႈ လႄႈ ဢမ်ႇမွတ်ႇပႅတ်ႈ သဵၼ်ႈမၢႆသႂ်ႇသေ မၵ်းမၼ်ႈဝႆႉ",
-       "right-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\82\84á\82\88 á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\80\95á\80­á\80°á\80\9dá\80ºá\80¸á\80\9eá\80»á\80­á\81¼á\80ºá\80¸ၼႃႈလိၵ်ႈ ၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ",
+       "right-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\80\9cá\82\84á\82\88 á\80¢á\80\99á\80ºá\82\87á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ၼႃႈလိၵ်ႈ ၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ",
        "right-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းသႂ်ႇဝႆႉ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇ၊ ဢမ်ႇတၢပ်ႈလူဝ်ႇ လိၵ်ႈဢၼ်ၵွင်ႉၵၢႆႇ ၶဝ်ဝႆႉ။",
-       "right-deletedtext": "á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9dá\82\86á\82\89â\80\8bá\80\9cá\82\84á\82\88 á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\95á\81¼á\80º á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\80\95á\80­á\80°á\80\9dá\80ºá\80¸á\80\9eá\80»á\80­á\81¼á\80ºá\80¸ ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
+       "right-deletedtext": "á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88á\80\9dá\82\86á\82\89â\80\8bá\80\9cá\82\84á\82\88 á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\95á\81¼á\80º á\81¼á\82\82á\80ºá\80¸á\81µá\82\84á\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
        "right-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
        "right-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈ",
-       "right-suppressrevision": "á\80\90á\80°á\81ºá\80ºá\80¸á\81\8a á\80\9eá\80­á\80°á\80\84á\80ºá\82\87á\80\9cá\80\95á\80ºá\82\89 á\80\9cá\82\84á\82\88 á\81¼á\82\84á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ၼႃႈလိၵ်ႈၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
+       "right-suppressrevision": "á\80\90á\80°á\81ºá\80ºá\80¸á\81\8a á\80\9eá\80­á\80°á\80\84á\80ºá\82\87á\80\9cá\80\95á\80ºá\82\89 á\80\9cá\82\84á\82\88 á\81¼á\82\84á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ၼႃႈလိၵ်ႈၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
        "right-viewsuppressed": "တူၺ်း ၶေႃႈၶူၼ်ႉလူ ဢၼ်သိူင်ႇဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
        "right-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆႇ သုၼ်ႇတူဝ်",
        "right-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
        "grant-blockusers": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်း လႄႈ ဢမ်ႇႁႄႉတတ်း",
        "grant-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
        "grant-createeditmovepage": "ၵေႃႇသၢင်ႈ၊ မႄးထတ်း လႄႈ ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈ",
-       "grant-delete": "á\80\99á\80½á\80\90á\80ºá\82\87 á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81\8a á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° လႄ သဵၼ်ႈမၢႆ သႂ်ႇၶဝ်ႈ",
+       "grant-delete": "á\80\99á\80½á\80\90á\80ºá\82\87 á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81\8a á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 လႄ သဵၼ်ႈမၢႆ သႂ်ႇၶဝ်ႈ",
        "grant-editinterface": "မႄးထတ်း လွၵ်းၸိုဝ်ႈ သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ လႄႈ ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript",
        "grant-editmycssjs": "မႄးထတ်း ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript ၸဝ်ႈၵဝ်ႇ",
        "grant-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၽူႈၸႂ်ႉတိုဝ်း ၶွင်ၸဝ်ႈၵဝ်ႇ",
        "grant-editpage": "မႄးထတ်း ၼႃႈလိၵ်ႈ မီးယူႇ ယၢမ်းလဵဝ်ၼႆႉ",
        "grant-editprotected": "မႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉ",
        "grant-highvolume": "ၵၢၼ်မႄးထတ်း ဢၼ်ယႂ်ႇၵႂၢင်ႈ",
-       "grant-oversight": "á\80\9cá\80\95á\80ºá\82\89á\80\9dá\82\86á\82\89 á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸ á\80\9cá\82\84á\82\88 á\80\90á\80µá\81µá\80ºá\80¸á\80\90á\80µá\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°",
+       "grant-oversight": "á\80\9cá\80\95á\80ºá\82\89á\80\9dá\82\86á\82\89 á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸ á\80\9cá\82\84á\82\88 á\80\90á\80µá\81µá\80ºá\80¸á\80\90á\80µá\80\84á\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
        "grant-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
        "grant-uploadeditmovefile": "လူတ်ႇၶိုၼ်ႈ၊  တၢင်တီႈ လႄႈ ၶၢႆႉၾၢႆႇ",
        "grant-uploadfile": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်မႂ်ႇ",
        "action-upload_by_url": "လုၵ်ႉၵႃႈတီႈ URL သေ လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
        "action-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
        "action-delete": "မွတ်ႇပႅတ်ႈၼႃႈလိၵ်ႈၼႆႉ",
-       "action-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89",
-       "action-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းမွတ်ႇပႅတ်ႈ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-deleterevision": "á\80\99á\80½á\80\90á\80ºá\82\87á\80\95á\82\85á\80\90á\80ºá\82\88 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88",
+       "action-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
        "action-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
-       "action-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈၼႆ့",
-       "action-suppressrevision": "á\80\90á\80°á\81ºá\80ºá\80¸á\80\91á\80\90á\80ºá\80¸á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\80\9cá\82\84á\82\88 á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\80¢á\80\9dá\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\82\81á\82\83ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
+       "action-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈ",
+       "action-suppressrevision": "á\80\91á\80\90á\80ºá\80¸á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ á\80\9cá\82\84á\82\88 á\81¶á\80­á\80¯á\81¼á\80ºá\80¸á\80¢á\80\9dá\80º á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "action-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆ သုၼ်ႇတူဝ်",
        "action-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
        "action-protect": "လႅၵ်ႈလၢႆႈၸၼ်ႉထၢၼ်ႈ ၵၢၼ်ႁႄႉၵင်ႈ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ",
        "action-import": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
        "action-importupload": "ဢဝ်ၼႃႈလိၵ်ႈၸိူဝ်း ၵႃႈတီႈၾၢႆႇလူတ်ႇၶိုၼ်ႈၼၼ်ႉ သႂ်ႇၶဝ်ႈ",
+       "action-patrol": "မၢႆ လွင်ႈမႄးထတ်း တၢင်ႇၸိူဝ်း ၼင်ႇ ထုၵ်ႇပႂ်ႉတူၺ်း",
+       "action-autopatrol": "လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ မၢႆဝႆႉယဝ်ႉၼင်ႇ ထုၵ်ႇပႂ်ႉတူၺ်း",
        "action-unwatchedpages": "တူၺ်းသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈတူၺ်း ဢမ်ႇပႆႇလႆႈတူၺ်းဝႆႉၼၼ်ႉ",
        "action-mergehistory": "ဢဝ်ပိုၼ်းၶွင်ၼႃႈလိၵ်ႈ ႁူမ်ႈၵၼ်",
        "action-userrights": "မႄးထတ်းသုၼ်ႇလႆႈ တႃႇၽူႈၸႂ်ႉတိုဝ်း တင်းသဵင်ႈ",
        "action-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
        "action-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
        "action-sendemail": "သူင်ႇ ဢီးမေးလ်",
+       "action-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၸဝ်ႈၵဝ်ႇ",
        "action-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
        "action-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
        "action-viewmyprivateinfo": "တူၺ်း လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ",
        "action-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
        "action-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ)တူင်ႉတိုၼ်ႇ တူဝ်တိင်",
        "action-applychangetags": "တိင်ၸပ်းၸွမ်းၼင်ႇ လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ",
+       "action-changetags": "ထႅမ်သႂ်ႇ လႄႈ ထွၼ်ပႅတ်ႈတိင်ၸိူဝ်းလႃႈလီႈ ၸပ်းသႂ်ႇဝႆႉ တီႈ ၵၢၼ်ၶူၼ်ႉၶႆႈ ဢၼ်လႂ် ဢၼ်ၼၼ်ႉလႄႈ သဵၼ်ႈမၢႆတင်းသဵင်ႈ။",
        "action-deletechangetags": "မွတ်ႇပႅတ်ႈ တိင်ႇၸိူဝ်းမီးယူႇ ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
+       "action-purge": "လၢႆႈလၢင်ႉ ၼႃႈလိၵ်ႈၼႆႉ",
        "nchanges": "$1 {{PLURAL:$1|လႅၵ်ႈလၢႆႈ|ၸိူဝ်းလႅၵ်ႈလၢႆႈ}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ၸဵမ်မိူဝ်ႈ ၵႂႃႇဢႅတ်ႇပွၵ်ႈၵမ်းလိုၼ်း}}",
        "enhancedrc-history": "ပိုၼ်း",
        "recentchanges-legend-heading": "<strong>ဢပုမ်ႇ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (တူၺ်းပႃးထႅင်ႈ [[Special:NewPages|သဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ]])",
        "recentchanges-submit": "ၼႄ",
+       "rcfilters-activefilters": "တူဝ်ထွင် ဢၼ်တူင်ႉၼိုင်",
+       "rcfilters-restore-default-filters": "ဝႆႉၶိုၼ်း တူဝ်ထွင် ပိူင်ၵႅဝ်ႈ",
+       "rcfilters-clear-all-filters": "ၽဵဝ်ႈလၢင်ႉ တူဝ်ထွင်တင်းမူတ်း",
+       "rcfilters-search-placeholder": "ထွင်ဢဝ် လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းႁဵတ်းၵႂႃႇ (ပိုတ်ႇႁႃ ဢမ်ႇၼၼ် တႄႇပေႃႉ)",
+       "rcfilters-invalid-filter": "ထွင်ႁႃ ၽိတ်းပိူင်ႈ",
+       "rcfilters-empty-filter": "ဢမ်ႇမီးတူဝ်ထွင် ဢၼ်တူင်ႉၼိုင်။ ၵၢၼ်ၶဝ်ႈႁူမ်ႈတၢင်းသဵင်ႈၵေႃႈၼႄဝႆႉယူႇ။",
+       "rcfilters-filterlist-title": "တူဝ်ထွင်",
+       "rcfilters-filterlist-noresults": "ဢမ်ႇႁၼ်မီးတူဝ်ထွင်",
+       "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-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-filtergroup-automated": "ၶဝ်ႈႁူမ်ႈႁင်းၵႂႃႇႁင်းမၼ်း",
+       "rcfilters-filter-bots-label": "ပွတ်ႉ",
+       "rcfilters-filter-bots-description": "ၶိူင်ႈႁဵတ်းႁင်းၶေႃ ၵေႃႉႁဵတ်းသၢင်ႈဝႆႉ လွင်ႈမႄးထတ်း",
+       "rcfilters-filter-humans-label": "ၵူၼ်း (ဢမ်ႇၸႂ်ႈပွတ်ႉ)",
+       "rcfilters-filter-humans-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": "လႅၵ်ႈလၢႆႈ တွၼ်ႈၵၼ်",
        "rclistfrom": "ၼႄ လွင်ႈ​လႅၵ်ႈလၢႆႈဢၼ်မႂ်ႇ တႄႇတီႈ $2, $3",
        "rcshowhideminor": "$1 လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
        "rcshowhideminor-show": "ၼႄ",
        "watchthisupload": "ပႂ်ႉတူၺ်းၾၢႆႇဢၼ်ၼႆႉ",
        "upload-dialog-title": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
        "upload-dialog-button-cancel": "ဢမ်ႇႁဵတ်း",
+       "upload-dialog-button-back": "ႁူၼ်လင်",
        "upload-dialog-button-done": "ယဝ်ႉ",
        "upload-dialog-button-save": "ၵဵပ်းသိမ်း",
        "upload-dialog-button-upload": "လူတ်ႇၶိုၼ်ႈ",
        "backend-fail-connect": "ဢမ်ႇၸၢင်ႈၵွင်ႉသိုပ်ႇၸူး ဢွင်ႈသိမ်းသုတ်းလင် \"$1\" ။",
        "backend-fail-internal": "လွင်ႈၽိတ်းပိူင်ႈ ဢၼ်ဢမ်ႇႁူႉလွင်ႈမၼ်း လႆႈပဵၼ်ဝႆႉ ၵႃႈတီႈၼႂ်း ဢွင်ႈသိမ်းသုတ်းလင် \"$1\" ။",
        "backend-fail-contenttype": "ဢမ်ႇၸၢင်ႈတႅပ်းတတ်းလိူင်ႈၾၢႆႇ ဢၼ်တႃႇတေသိမ်းၵႃႈတီႈ \"$1\" ။",
-       "backend-fail-batchsize": "ဢွင်ႈတီႈသိမ်းသုတ်းလင် ထုၵ်ႇပၼ်ဝႆႉ ၸုမ်းၾၢႆႇ $1 ၾၢႆႇ\n{{PLURAL:$1|ၵၢၼ်ႁဵတ်း|ၵၢၼ်ႁဵတ်း}}; တီႈမၵ်းၶၢၼ်းမၼ်းပဵၼ် $2\n{{PLURAL:$2|ၵၢၼ်ႁဵတ်း|ၵၢၼ်ႁဵတ်း}}.",
+       "backend-fail-batchsize": "ဢွင်ႈတီႈသိမ်းသုတ်းလင် ထုၵ်ႇပၼ်ဝႆႉ ၸုမ်းၾၢႆႇ $1 ၾၢႆႇ\n{{PLURAL:$1|ၵၢၼ်ႁဵတ်း}}; တီႈမၵ်းၶၢၼ်းမၼ်းပဵၼ် $2\n{{PLURAL:$2|ၵၢၼ်ႁဵတ်း}}။",
        "backend-fail-usable": "ဢမ်ႇၸၢင်ႈလူ ဢမ်ႇၼၼ် ဢမ်ႇၸၢင်ႈတႅမ်ႈ ၾၢႆႇ \"$1\" ယွၼ်ႉပိူဝ်ႈဝႃႈ ၵၢၼ်လူတ်းပွႆႇ ဢမ်ႇတဵမ်ထူၼ်ႈ ဢမ်ႇၼၼ် ႁၢမ်းဝႆႉ ဢွင်ႈတီႈသိမ်း။",
        "filejournal-fail-dbconnect": "ဢမ်ႇၸၢင်ႈၵွင်ႉသိုပ်ႇၸူး ယေးၶေႃႈမုၼ်း ၵျႃႇၼႄႇ တွၼ်ႈတႃႇ ဢွင်ႈတီႈသိမ်းသုတ်းလင် \"$1\" ။",
        "filejournal-fail-dbquery": "ဢမ်ႇၸၢင်ႈဢၢပ်ႉတိတ်ႉ ယေးၶေႃႈမုၼ်း ၵျႃႇၼႄႇ တွၼ်ႈတႃႇ ဢွင်ႈတီႈသိမ်းသုတ်းလင် \"$1\" ။",
        "filehist-help": "တဵၵ်းၼိူဝ် ဝၼ်းထိ/ၶၢဝ်းယၢမ်း တႃႇႁၼ်ၾၢႆႇ ၼႂ်းဝၼ်းၼၼ်ႉ",
        "filehist-deleteall": "မွတ်ႇပႅတ်ႈမူတ်း",
        "filehist-deleteone": "မွတ်ႇပႅတ်ႈ",
-       "filehist-revert": "á\80\95á\80­á\81¼á\80ºá\82\87á\80\95á\80½á\81µá\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸",
+       "filehist-revert": "ပိၼ်ႈၶိုၼ်း",
        "filehist-current": "ယၢမ်းလဵဝ်",
        "filehist-datetime": "ဝၼ်းထီႉ/ၶၢဝ်းယၢမ်း",
        "filehist-thumb": "ႁၢင်ႈလဵၵ်ႉ",
        "shared-repo-from": "လုၵ်ႉတီႈ $1",
        "shared-repo": "ယွင်ဢၼ်ၽႄႈၸႂ်ႉဝႆႉ",
        "upload-disallowed-here": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ တႅမ်တၢင်သႂ်ႇၼိူဝ် ၾၢႆႇဢၼ်ၼႆႉ",
-       "filerevert": "á\81¶á\80°á\81¼á\80ºá\82\89á\80\95á\80­á\81¼á\80ºၸူး $1",
+       "filerevert": "á\80\95á\80­á\81¼á\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ၸူး $1",
        "filerevert-legend": "ၶူၼ်ႉပိၼ်ႇၾၢႆႇ",
-       "filerevert-intro": "ၸဝ်ႈၵဝ်ႇ ၶူၼ်ႉပိၼ်ႇတေၶူၼ်ႉပိၼ်ႇ ၾၢႆႇ <strong>[[Media:$1|$1]]</strong> ၸူး  [$4 မၢႆဢွၵ်ႇ ၼင်ႇ $3, $2].",
+       "filerevert-intro": "ၸဝ်ႈၵဝ်ႇတေပိၼ်ႈၶိုၼ်း ၾၢႆႇ <strong>[[Media:$1|$1]]</strong> ၸူး  [$4 မၢႆဢွၵ်ႇ ၼင်ႇ $3, $2].",
        "filerevert-comment": "လွင်ႈတၢင်း :",
-       "filerevert-defaultcomment": "á\81¶á\80°á\81¼á\80ºá\82\89á\80\95á\80­á\81¼á\80ºá\82\87 ၸူး မၢႆဢွၵ်ႇ ၼင်ႇ $2, $1 ($3)",
+       "filerevert-defaultcomment": "á\80\95á\80­á\81¼á\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ ၸူး မၢႆဢွၵ်ႇ ၼင်ႇ $2, $1 ($3)",
        "filerevert-submit": "ၶူၼ်ႉပိၼ်ႇ",
-       "filerevert-success": "<strong>[[Media:$1|$1]]</strong>á\81¼á\82\86á\82\89á\80\91á\80¯á\81µá\80ºá\82\87á\81¶á\80°á\81¼á\80ºá\82\89á\80\95á\80­á\81¼á\80ºá\82\87ၸူး [$4 မၢႆဢွၵ်ႇၼင်ႇ ၶွင် $3, $2].",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong>á\81¼á\82\86á\82\89á\80\91á\80¯á\81µá\80ºá\82\87á\80\95á\80­á\81¼á\80ºá\82\88á\81¶á\80­á\80¯á\81¼á\80ºá\80¸ၸူး [$4 မၢႆဢွၵ်ႇၼင်ႇ ၶွင် $3, $2].",
        "filedelete": "မွတ်ႇပႅတ်ႈ $1",
        "filedelete-legend": "မွတ်ႇပႅတ်ႈ ၾၢႆႇ",
        "filedelete-intro": "ၸဝ်ႈၵဝ်ႇ တေမွတ်ႇပႅတ်ႈၾၢႆႇ  <strong>[[Media:$1|$1]]</strong> ဢၼ်ၵိုၵ်းဝႆႉ ပိုၼ်းမၼ်းတင်းသဵင်ႈတင်းမူတ်း။",
        "unusedtemplates": "လွၵ်းပိူင် ဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ",
        "unusedtemplateswlh": "ႁဵင်းၵွင်ႉ တၢင်ႇၸိူဝ်း",
        "randompage": "ဢဝ်ၼႃႈလိၵ်ႈသၢင်ႇထုၵ်ႇဝႃႈ",
-       "randompage-nopages": "တၢင်းၽၢႆႇတႂ်ႈၼၼ်ႉ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈသင်\n{{PLURAL:$2|လွၵ်းၸိုဝ်ႈ|လွၵ်းၸိုဝ်ႈ}}: $1.",
+       "randompage-nopages": "တၢင်းၽၢႆႇတႂ်ႈၼၼ်ႉ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈသင်\n{{PLURAL:$2|လွၵ်းၸိုဝ်ႈ}}: $1 ။",
        "randomincategory": "ၼႃႈလိၵ်ႈၵမ်ႉသၢင်ႇတေႃႇ ၵႃႈတီႈၼႂ်း လိူင်ႈ",
        "randomincategory-invalidcategory": "\"$1\" ၼႆႉ ပဵၼ်ၸိုဝ်ႈလိူင်ႈ ဢၼ်ဢမ်ႇပဵၼ်လႆႈ။",
        "randomincategory-nopages": "မၼ်းဢမ်ႇမီးဝႆ ၼႃႈလိၵ်ႈသင် ၵႃႈတီႈၼႂ်း [[:Category:$1|$1]] လိူင်ႈ။",
        "withoutinterwiki-summary": "ၼႃႈလိၵ်ႈၸိူဝ်းပႃႈတႂ်ႈၼႆႉ မၼ်းဢမ်ႇၵွင်ႉဝႆႉၸူး မၢႆဢွၵ်ႇၽႃႇသႃႇၵႂၢမ်း တၢင်ႇၸိူဝ်း",
        "withoutinterwiki-legend": "တူဝ်ၼမ်းၼႃႈ",
        "withoutinterwiki-submit": "ၼႄ",
-       "fewestrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\82\81á\82\83 ဢၼ်ဢေႇသေပိူၼ်ႈ",
+       "fewestrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ဢေႇသေပိူၼ်ႈ",
        "nbytes": "$1 {{PLURAL:$1|ၿႆႉ|ၿႆႉ}}",
        "ncategories": "{{PLURAL:$1|လိူင်ႈ|လိူင်ႈတင်းလၢႆ}}",
        "ninterwikis": "$1 {{PLURAL:$1|ဝီႇၶီႇၽၢႆႇၼႂ်း|ဝီႇၶီႇၸိူဝ်းၽၢႆႇၼႂ်း}}",
        "nlinks": "$1 {{PLURAL:$1|ႁဵင်းၵွင်ႉ|ႁဵင်းၵွင်ႉၼမ်}}",
        "nmembers": "$1 {{PLURAL:$1|member|ၽူႈၶဝ်ႈၸုမ်း}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$1|member|ၽူႈၶဝ်ႈၸုမ်း}}",
-       "nrevisions": "$1 {{PLURAL:$1|â\80\8bá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°|á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°}}",
+       "nrevisions": "$1 {{PLURAL:$1|â\80\8bá\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88}}",
        "nimagelinks": "ၸႂ်ႈဝႆႉ တီႈ $1 {{PLURAL:$1|page|ၼႃႈလိၵ်ႈ}}",
        "ntransclusions": "ၸႂ်ႉဝႆႉၵႃႈတီႈၼိူဝ် $1 {{PLURAL:$|page|ၼႃႈလိၵ်ႈ}}",
        "specialpage-empty": "တွၼ်ႈတႃႇ ၶေႃႈပွင်ႇၼႄ ဢၼ်ၼႆႉၼႆႉ မၼ်းဢမ်ႇမီး ၽွၼ်းလႆႈ။",
        "mostcategories": "ၼႃႈလိၵ်ႈၸိူဝ်း မီးလိူင်ႈၼမ်သေပိူၼ်ႈ",
        "mostimages": "ၾၢႆႇ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၸူး ၼမ်သေပိူၼ်ႈ",
        "mostinterwikis": "ၼႃႈလိၵ်ႈ ၸိူဝ်းမီး ဝီႇၶီႇၼႂ်ႈ ၼမ်သေပိူၼ်ႈ",
-       "mostrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80° ဢၼ်ၼမ်သေပိူၼ်ႈ",
+       "mostrevisions": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\99á\80®á\80¸ á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88 ဢၼ်ၼမ်သေပိူၼ်ႈ",
        "prefixindex": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ၸိူဝ်းဢၼ်ပႃး တူဝ်ၼမ်းၼႃႈ",
        "prefixindex-namespace": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ဢၼ်ပႃး တူဝ်ၼမ်းၼႃႈ ($1 လွၵ်းၸိုဝ်ႈ)",
        "prefixindex-submit": "ၼႄ",
        "allpagessubmit": "ၶူၼ်ႉႁႃ",
        "allpagesprefix": "ၼႃးလိၵ်ႈဢၼ်ၼႄ ဢိၵ်ႇတင်း ၶေႃႈလူင်ႈၼႃႈ",
        "categories": "လိူင်ႈ",
+       "sp-deletedcontributions-contribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
+       "linksearch": "သွၵ်ႈႁႃ ႁဵင်းၵွင်ႉၽၢႆႇၼွၵ်ႈ",
+       "linksearch-pat": "လၢႆးသွၵ်ႈႁႃႈ :",
+       "linksearch-ns": "ဢွင်ႈတီႈၸိုဝ်ႈ",
+       "linksearch-ok": "ၶူၼ်ႉႁႃ",
+       "linksearch-line": "$1 ၼႆႉ ၵွင်ႉဝႆႉၵႃႈတီႈ $2",
+       "listusersfrom": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတႄႇမႃးတီႈ :",
+       "listusers-submit": "ၼႄ",
+       "listusers-noresult": "ဢမ်ႇႁၼ် ၽူႈၸႂ်ႉတိုဝ်း",
+       "listusers-blocked": "(ႁႄႉတတ်းဝႆႉ)",
+       "activeusers": "သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတူင်ႉၼိုင်",
+       "activeusers-intro": "ၼႆႉတႄႉပဵၼ် သဵၼ်ႈမၢႆၽူႈၸႂ်ႉတိုဝ်း ၵေႃႉၸိူဝ်းဢၼ်မီး လွင်ႈတူင်ႉၼိုင် ၼႂ်းၵႄႈ ၵမ်းလိုၼ်းသုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်းလိူဝ်}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|တူင်ႉၼိုင်|တူင်ႉၼိုင််}} in the last {{PLURAL:$3|ဝၼ်း|$3 ဝၼ်း}}",
+       "activeusers-from": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတႄႇမႃးတီႈ :",
+       "activeusers-groups": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပိူင်ႇၸူးၸုမ်း:",
+       "activeusers-excludegroups": "ပၢၵ်ႈဝႆႉ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပိူင်ႇၸူးၸုမ်း:",
+       "activeusers-noresult": "ဢမ်ႇႁၼ် ၽူႈၸႂ်ႉတိုဝ်း",
+       "activeusers-submit": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးလွင်ႈတူင်ႉၼိုင်",
+       "listgrouprights": "သုၼ်ႇၸုမ်းၽူႈၸႂ်ႉတိုဝ်း",
+       "listgrouprights-summary": "ၸိူဝ်းၽၢႆႇတႂ်ႈၼႆႉ ပဵၼ်သဵၼ်ႈမၢႆၸုမ်းၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းဢၼ်မၵ်းမၢႆဝႆႉတီႈ ဝီႇၶီႇဢၼ်ၼႆႉ၊ မၵ်းမၼ်ႈဝႆႉပၼ်ၸွမ်း သုၼ်ႇႁဵတ်းတွၼ်ႈတႃႇၶဝ်။ ၸိူဝ်းၼၼ်ႉတႄႉ တေၸၢင်ႈပဵၼ်လႆႈ [[{{MediaWiki:Listgrouprights-helppage}}|လွၼ်ႉၶၢဝ်ႇ ၸိူဝ်းထႅမ်သႂ်ႇဝႆႉ​ထႅင်ႈ]]",
+       "listgrouprights-key": "ၶေႃႈၶႆႈလၢတ်ႈ:\n* <span class=\"listgrouprights-granted\">သုၼ်ႇ ဢၼ်ၶႂၢင်းပၼ်ဝႆႉ</span>\n* <span class=\"listgrouprights-revoked\">သုၼ် ဢၼ်ယႃႉပႅတ်ႈဝႆႉ</span>",
+       "listgrouprights-group": "ၸုမ်း :",
+       "listgrouprights-rights": "သုၼ်ႇ",
+       "listgrouprights-helppage": "ၸွႆႈထႅမ်:သုၼ်ႇၸုမ်း",
+       "listgrouprights-members": "(သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း)",
+       "listgrouprights-addgroup": "ထႅမ်သႂ်ႇ {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}}: $1",
+       "listgrouprights-removegroup": "ထွၼ်ပႅတ်ႈ {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}}: $1",
+       "listgrouprights-addgroup-all": "ထႅမ်သႂ်ႇ ၸုမ်းတင်းသဵင်ႈ",
+       "listgrouprights-removegroup-all": "ထွၼ်ပႅတ်ႈ ၸုမ်းတင်းသဵင်ႈ",
+       "listgrouprights-addgroup-self": "ထႅမ် {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}} သႂ်ႇၸူး ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ: $1",
+       "listgrouprights-removegroup-self": "ထွၼ်ပႅတ်ႈ {{PLURAL:$2|ၸုမ်း}} ၵႃႈတီႈ ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ: $1",
+       "listgrouprights-addgroup-self-all": "ထႅမ်ၸုမ်းတင်းသဵင်ႈ သႂ်ႇတီႈ ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ",
+       "listgrouprights-removegroup-self-all": "ထွၼ်ၸုမ်းတင်းသဵင်ႈပႅတ်ႈ ၵႃႈတီႈ ဢၶွင်ႉၶွင်ၸဝ်ႈၵဝ်ႇ",
+       "listgrouprights-namespaceprotection-header": "လွင်ႈမၵ်းၶၢၼ်း ဢွင်ႈၸိုဝ်ႈ",
+       "listgrouprights-namespaceprotection-namespace": "ဢွင်ႈတီႈၸိုဝ်ႈ",
+       "listgrouprights-namespaceprotection-restrictedto": "သုၼ်ႇ ၸိူဝ်းပၼ်သုၼ်ႇ ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇမႄးထတ်း",
+       "listgrants": "ပၼ်သုၼ်ႇ",
+       "listgrants-summary": "ၸိူဝ်းၽၢႆႇတႂ်ႈၼႆႉ ပဵၼ်သဵၼ်ႈမၢႆ ၸိူဝ်းပၼ်သုၼ်ႇ ဢၼ်ဢိၵ်ႇတင်း သုၼ်ႇႁဵတ်းလႆႈ တႃႇ ၽူႈၸႂ်ႉတိုဝ်း။ ၽူႈၸႂ်ႉတိုဝ်းၶဝ် ၸၢင်ႈၼႄႉၼွၼ်းပၼ်ဢႅပ်ႉ တွၼ်ႈတႃႇၸႂ်ႉတိုဝ်း ဢၶွင်ႉၶွင်ၶဝ်၊ ၵူၺ်းၵႃႈဝႃႈ ဢိင်ၼိူဝ် ၽူႈၸႂ်ႉတိုဝ်း ပၼ်သုၼ်ႇဢႅပ်ႉၵႃႈႁိုဝ်ၵေႃႈ တေမီး လွင်ႈမၵ်းၶၢၼ်းမွၵ်ႈၼၼ်ႉ။ ဢႅပ်ႉၼိုင်ႈဢၼ်ၼႆႉ မၼ်းတေၸၢင်ႈ ႁဵတ်းသၢင်ႇၼင်ႇ တူဝ်ၽူႈၸႂ်ႉတိုဝ်းသေတႃႉ မၼ်းတေဢမ်ႇမီးသုၼ်ႇၸႂ်ႉၼင်ႇ တူဝ်ၽူႈၸႂ်ႉတိုဝ်း ၸၢင်ႈၸႂ်ႉၼၼ်ႉ။\nၼၼ်ႉတႄႉ တေၸၢင်ႈပဵၼ်လႆႈ  [[{{MediaWiki:Listgrouprights-helppage}}|လွၼ်ႉၶၢဝ်ႇ ဢၼ်ထႅမ်သႂ်ႇဝႆႉထႅင်ႈ]] ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ သုၼ်ႇဢၼ်လႂ်ဢၼ်ၼၼ်ႉ။",
+       "listgrants-grant": "ပၼ်သုၼ်ႇ",
+       "listgrants-rights": "သုၼ်ႇ",
+       "trackingcategories": "တွၼ်ႈၵၼ် ၸွမ်းႁွႆး",
+       "trackingcategories-msg": "တွၼ်ႈၵၼ် ၸွမ်းႁွႆး",
+       "trackingcategories-name": "ၸိုဝ်ႈ လိၵ်ႈပွင်ႇၶၢဝ်ႇ",
+       "restricted-displaytitle-ignored": "ၼႃႈလိၵ်ႈ ၸိူဝ်းၶၢမ်ႈဝႆႉ တႃႇၼႄႁူဝ်ၶေႃႈ",
+       "restricted-displaytitle-ignored-desc": "ၼႃႈလိၵ်ႈ ဢၼ်ၶၢမ်ႈဝႆႉ  <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းဢမ်ႇမီး လွင်ႈငမ်ႇမႅၼ်ႈၵၼ်တင်း ႁူဝ်ၶေႃႈတႄႉတႄႉ ၶွင်ၼႃႈလိၵ်ႈ။",
+       "trackingcategories-nodesc": "​ၶေႃႈသပ်းလႅင်း ဢမ်ႇၶဝ်ႈပႃးဝႆႉ။",
+       "trackingcategories-disabled": "တွၼ်ႈၵၼ်ၼႆ့ ဢိုတ်းၸႂ်ႉဝႆႉ",
+       "mailnologin": "ဢမ်ႇသူင်ႇ ႁဵင်းလိၵ်ႈ",
+       "mailnologintext": "ၸဝ်ႈၵဝ်ႇ တေလႆႈ [[Special:UserLogin|လွၵ်ႉဢိၼ်ႇ]]ဝႆႉ သေ တီႈၼႂ်း [[Special:Preferences|preferences]]ၼၼ်ႉ တေလႆႈမီး ႁဵင်းလိၵ်ႈ ဢီးမေးလ် ၸဝ်ႈၵဝ်ႇ ဢၼ်ၸႂ်ႉလႆႈ တွၼ်ႈတႃႇသူင်ႇ ဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ။",
+       "emailuser": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ",
+       "emailuser-title-target": "သူင်ႇဢီးမေးလ်ဢၼ်ၼႆႉ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "emailuser-title-notarget": "ၽူႈၸႂ်ႉတိုဝ်း ဢီးမေးလ်",
+       "defemailsubject": "{{SITENAME}} ဢီးမေးလ်ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း \"$1\"",
+       "usermaildisabled": "ဢီးမေးလ် ၽူႈၸႂ်ႉတိုဝ်း ဢိုတ်းၸႂ်ႉဝႆႉ",
+       "usermaildisabledtext": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈသူင်ႇ ဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ ၸိူဝ်းမီးဝႆႉ တီႈၼိူဝ် ဝီႇၶီႇၼႆႉ",
+       "noemailtitle": "ဢမ်ႇမီး ႁဵင်းလိၵ်ႈဢီးမေးလ်",
+       "noemailtext": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ဢမ်ႇလႆႈမၵ်းမၼ်ႈဝႆႉ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်ၸႂ်ႉလႆႈ။",
+       "nowikiemailtext": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇလိူၵ်ႈဝႆႉ တွၼ်ႈတႃႇ ဢမ်ႇႁၢပ်ႉဢဝ် ဢီးမေးလ် ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း။",
+       "emailnotarget": "ဢမ်ႇမီးဝႆႉ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ၽိတ်းပိူင်ႈဝႆႉတွၼ်ႈတႃႇ ၽူႈႁပ်ႉဢဝ်။",
+       "emailtarget": "ထႅမ်သႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း တႃႇ ၽူႈႁပ်ႉဢဝ်",
+       "emailusername": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "emailusernamesubmit": "တၢင်ႇၼႄ",
+       "email-legend": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း  {{SITENAME}} တၢင်ႇၸိူဝ်း",
+       "emailfrom": "မႃးတီႈ :",
+       "emailto": "ထိုင်:",
+       "emailsubject": "လွင်ႈတၢင်း :",
+       "emailmessage": "ၶေႃႈၽၢၵ်ႇ",
+       "emailsend": "သူင်ႇ",
+       "emailccme": "ဢဝ်ၶေႃႈၽၢၵ်ႇၵဝ်ၶႃႈ ၶိုၼ်းထုတ်ႇသူင်ႇဢီးမေးလ်ပၼ် ၵဝ်ၶႃႈ",
+       "emailccsubject": "ထုတ်ႇဢဝ် ၶေႃႈၽၢၵ်ႇၸဝ်ႈၵဝ်ႇၸူး $1: $2",
+       "emailsent": "ဢီးမေးလ် သူင်ႇယဝ်ႉယဝ်ႈ",
+       "emailsenttext": "ဢီးမေးလ်ၸဝ်ႈၵဝ်ႇ ထုၵ်ႇသူင်ႇပၼ်ၵႂႃႇယဝ်ႉ။",
+       "emailuserfooter": "ဢီးမေးလ်ၼႆႉ  \"{{int:emailuser}}\" ၵၢၼ်တီႈ  {{SITENAME}} ၵေႃႉ {{GENDER:$1|သူင်ႇ}} $1 ၸူး  {{GENDER:$2|$2}}။ သင်ၸိူဝ်ႉဝႃႈ  {{GENDER:$2|ၸဝ်ႈၵဝ်ႇ}} ၶႂ်ႈတွပ်ႇပၼ်ၶိုၼ်း ဢီးမေးလ်ဢၼ်ၼႆႉၼႆ ဢီးမေးလ် {{GENDER:$2|ၸဝ်ႈၵဝ်ႇ}} တေထုၵ်ႇ သူင်ႇပၼ်ၵႂႃႇၸူး {{GENDER:$1|ၽူႈသူင်ႇ ၵေႃႉငဝ်ႈတိုၼ်း}}၊ ႁဵင်းလိၵ်ႈဢီးမေးလ် {{GENDER:$2|ၸဝ်ႈၵဝ်ႇ}} တေၵႂႃႇ ဢွၵ်ႇၼႄတီႈ  {{GENDER:$1|ၶဝ်}}ယဝ်ႈ။",
+       "usermessage-editor": "တူဝ်သူင်ႇၶေႃႈၶၢဝ်ႇ ပိူင်သၢင်ႈ",
+       "watchlist": "�သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
        "mywatchlist": "သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistfor2": "တွၼ်ႈတႃႇ $1 $2",
+       "nowatchlist": "တီႈၼႂ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇၼၼ်ႉ ဢမ်ႇမီးဝႆႉသင်။",
+       "watchlistanontext": "ၶႅၼ်းတေႃႈ လွၵ်ႉဢိၼ်ႇ တွၼ်ႈတႃႇတူၺ်း ဢမ်ႇၼၼ် မႄးထတ်း လွင်ႈတၢင်း ၸိူဝ်းမီး တီႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ၸဝ်ႈၵဝ်ႇ။",
+       "watchnologin": "ဢမ်ႇလႆႈၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆ့",
+       "addwatch": "ထႅမ်သႂ်ႇၸူး သဵၼ်ႈမၢႆ ပႂ်ႉတူၺ်း",
        "watch": "ပႂ်ႉတူၺ်း",
+       "watchlist-hide": "သိူင်ႇ",
+       "watchlist-submit": "ၼႄ",
+       "wlshowtime": "ပွင်ႈၶၢဝ်းယၢမ်း တွၼ်ႈတႃႇ ဢွၵ်ႇၼႄ:",
+       "wlshowhideminor": "လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
+       "wlshowhidebots": "ပွတ်ႉ",
+       "wlshowhideliu": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတၢင်ႇမၢႆၽၢင်ဝႆႉ",
+       "wlshowhideanons": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈ",
+       "wlshowhidepatr": "ၵၢၼ်မႄးထတ်း ဢၼ်ထုၵ်ႇပႂ်ႉတူၺ်း",
+       "wlshowhidemine": "ၵၢၼ်မႄးထတ်း ၵဝ်ၶႃႈ",
+       "wlshowhidecategorization": "ပၢႆးၼႃႈလိၵ်ႈ",
+       "watchlist-options": "ၵၼ်လိူၵ်ႈသၢင်ႈ တူဝ်ပႂ်ႉတူၺ်း",
+       "watching": "တိုၵ်ႉတူၺ်းယူႇ...",
+       "unwatching": "ဢမ်ႇတူၺ်းဝႆႉ...",
+       "enotif_impersonal_salutation": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း",
+       "enotif_subject_deleted": "ၼႃႈလိၵ်ႈ {{SITENAME}}  $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|မူတ်ႇပႅတ်ႈ}} ဢေႃႈ။",
+       "enotif_subject_created": "ၼႃႈလိၵ်ႈ {{SITENAME}}  $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} ဢေႃႈ",
+       "enotif_subject_moved": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၶၢႆႉဝႆႉ}} ဢေႃႈ",
+       "enotif_subject_restored": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႇ {{GENDER:$2|ဝႆႉတမ်းၶိုၼ်း}} ဢေႃႈ",
+       "enotif_subject_changed": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|လႅၵ်ႈလၢႆႈဝႆႉ}} ဢေႃႈ",
+       "enotif_body_intro_deleted": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ  ထုၵ်ႇ $2 ၵေႃႇ {{GENDER:$2|မွတ်ႇပႅတ်ႈဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATE ၼၼ်ႉ၊ တူၺ်း တီႈ $3.",
+       "enotif_body_intro_created": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATEၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၢၼ်ၶူၼ်ႉၶႆႈ ယၢမ်းလဵဝ်ၼႆႉၼႆ တူၺ်းတီႈ $3 ၼၼ်ႉၶႃႈလႄႈ။",
+       "enotif_body_intro_moved": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၶၢႆႉဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATE ၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၼ်ၶိုၼ်းဢၢၼ်ႇဢၼ် ယၢမ်းလဵဝ်ၼႆႉၼႆ တူၺ်းတီႈ  $3 ၼၼ်ႉၶႃႈလႄႈ။",
+       "enotif_body_intro_restored": "ၼႃႈလိၵ်ႈ {{SITENAME}}  $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|တမ်းဝႆႉၶိုၼ်း}} မိူဝ်ႈ $PAGEEDITDATE  ၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၢၼ်ၶူၼ်ႉၶႆႈ ယၢမ်းလဵဝ်ၼႆႉၼႆတူၺ်း တီႈ $3 ၼၼ်ႉၶႃႈလႄႈ။",
+       "enotif_body_intro_changed": "ၼႃးလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|လႅၵ်ႈလၢႆႈဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATE ၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၼ်ၶိုၼ်းဢၢၼ်ႇဢၼ် ယၢမ်းလဵဝ်ၼႆႉၼႆ တူၺ်းတီႈ  $3 ၼၼ်ႉၶႃႈလႄႈ။",
+       "enotif_lastvisited": "ၸဵမ်မိူဝ်ႈ ဝၢႆးသေ ၸဝ်ႈၵဝ်ႇ မႃးဢႅဝ်ႇ ပွၵ်ႇလိုၼ်းသုတ်းၼၼ်ႉ မီးလွင်ႈလႅၵ်ႈလၢႆႈသင်ၼႆ တူၺ်းတီႈ $1 ၼႆႈၶႃႈလႄႈ။",
+       "enotif_lastdiff": "တွၼ်ႈတႃႇတူၺ်း လွင်ႈလႅၵ်ႈလၢႆႈဢၼ်ၼႆႉ တူၺ်း တီႈ $1 ၼႆႈၶႃႈလႄႈ။",
+       "enotif_anon_editor": "ၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇသႂ်ႇၸိုဝ်ႈ $1",
+       "deletepage": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
+       "confirm": "ၼႄႉၼွၼ်း",
+       "excontent": "လမ်းၼႂ်း ပဵၼ်: \"$1\"",
+       "excontentauthor": "လမ်းၼႂ်း ပဵၼ်: \"$1\", လႄႈ ၽူႈၶဝ်ႈႁူမ်ႈၼႆႉသမ်ႉပဵၼ်  \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|တွၼ်ႈဢုပ်ႇ]])",
+       "exbeforeblank": "လမ်းၼႂ်း မိူဝ်ႈပႆႇပဝ်ႇဝႆႉၼၼ်ႉပဵၼ် : \"$1\"",
+       "delete-confirm": "မွတ်ႇပႅတ်ႈ $1",
+       "delete-legend": "မွတ်ႇပႅတ်ႈ",
+       "historywarning": "<strong>ၶေႃႈၽၢင်ႉ:</strong> ၼႃႈလိၵ်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇဝႃႈ တေမွတ်ႇပႅတ်ႈၼၼ်ႉ မၼ်းမီးဝႆႉပိုၼ်း  $1 {{PLURAL:$1|ၶူၼ်ႉၶႆႈ|ၶူၼ်ႉၶႆႈ.}}:",
+       "historyaction-submit": "ၼႄ",
        "dellogpage": "မွတ်ႇပႅတ်ႈ သၢႆမၢႆ",
+       "reverted": "ပိၼ်ႈၶိုၼ်းၸူး မၢႆဢွၵ်ႇ ၸိူဝ်းဢွၵ်ႇၸဝ်ႉ",
        "rollbacklink": "ထွႆပွၵ်ႈၶိုၼ်း",
        "rollbacklinkcount": "ၵိင်ႈၶိုၼ်းလင် $1 {{PLURAL:$1|edit|မႄးထတ်း}}",
+       "cantrollback": "ဢမ်ႇၸၢင်ႈ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း;\nၽူႈၶဝ်ႈႁူမ်ႈ ​ၵမ်းလိုၼ်းသုတ်းၼႆႉ မၼ်းၵူၺ်းပဵၼ် ၽူႈတႅမ်ႈလိၵ်ႈ တႃႇ ၼႃႈလိၵ်ႈၼႆႉ။",
+       "revertpage": " [[Special:Contributions/$2|$2]] ([[User talk:$2|တွၼ်ႈဢုပ်ႇ]]) ၵေႃႉပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ၸူး မၢႆဢွၵ်ႇ ၵမ်းလိုၼ်းသုတ်း ဢၼ် [[User:$1|$1]] ၵေႃႉႁဵတ်းဝႆႉ",
+       "rollback-success": "$1 ၵေႃႉ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ;\n$2 လႅၵ်ႈလၢႆႈဝႆႉၸူး လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်း။",
+       "changecontentmodel": "လႅၵ်ႈလၢႆႈ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင်ၼႃႈလိၵ်ႈ",
+       "changecontentmodel-legend": "လႅၵ်ႈလၢႆႈ ပိူင်ႈၵေႃႇသၢင်ႈ လမ်းၼႂ်း",
+       "changecontentmodel-title-label": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ",
+       "changecontentmodel-model-label": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ဢၼ်မႂ်ႇ",
+       "changecontentmodel-reason-label": "လွင်ႈတၢင်း :",
+       "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 {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} ၼႃႈလိၵ်ႈ $3 ဢၼ်ၸႂ်ႉတိုဝ်းဝႆႉ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း \"$5\" ဢၼ်ဢမ်ႇၸႂ်ႈ ပိူင်ၵႅဝ်ႈ",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|လႅၵ်ႈလၢႆႈဝႆႉ}} ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင်ႈၼႃႈလိၵ်ႈ $3 တႄႇ \"$4\" တေႃႇ \"$5\"",
+       "logentry-contentmodel-change-revertlink": "ပိၼ်ႈၶိုၼ်း",
+       "logentry-contentmodel-change-revert": "ပိၼ်ႈၶိုၼ်း",
        "protectlogpage": "မၢႆတမ်း ၵၢၼ်ႁေႉၵင်ႈ",
-       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} မွတ်ႇပႅတ်ႈယဝ်ႉ",
+       "protect-default": "ၶႂၢင်းပၼ် ၽူႈၸႂ်ႉတိုဝ်း တၢင်းသဵင်ႈ",
+       "protect-fallback": "ၶႂၢင်းပၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တင်း လွင်ႈၶႂၢင်းပၼ် \"$1\" ၼၼ်ႉၵူၺ်း",
+       "protect-level-autoconfirmed": "ၶႂၢင်းပၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႄႉၼွၼ်းႁင်းၵူၺ်းၼၼ်ႉ ၵူၺ်း",
+       "protect-level-sysop": "ၶႂၢင်းပၼ် ၽူႈၵုမ်းၵၢၼ်ၵူၺ်း",
+       "protect-othertime": "တၢင်ႇၶၢဝ်း :",
+       "protect-othertime-op": "တၢင်ႇၶၢဝ်း",
+       "restriction-edit": "မႄးထတ်း",
+       "restriction-move": "ၶၢႆႉ",
+       "restriction-create": "ၵေႃႇသၢင်ႈ",
+       "restriction-upload": "လူတ်ႇၶိုၼ်ႈ",
+       "restriction-level-sysop": "ႁႄႉၵၼ်ဝႆႉ တဵမ်ထူၼ်ႈ",
+       "restriction-level-autoconfirmed": "ႁႄႉၵင်ႈဝႆႉ ၵမ်ႈၽွင်ႈ",
+       "restriction-level-all": "ၵူႈၸၼ်ႉထၢၼ်ႈ",
+       "undelete": "တူၺ်းၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undeletepage": "တူၺ်း လႄႈ ဝႆႉၶိုၼ်း ၼႃႈလိၵ်ႈၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undeletepagetitle": "<strong>ၽၢႆႇတႂ်ႈၼႆႉ ၶဝ်ႈပႃးဝႆႉ လွင်ႈၶူၼ်ႉၶႆႈ ၸိူဝ်းမွတ်ႇဝႆႉ [[:$1|$1]]</strong>.",
+       "viewdeletedpage": "တူၺ်းၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undelete-fieldset-title": "ၶိုၼ်းဝႆႉ လွင်ႈၶူၼ်ႉၶႆႈ",
+       "undeleterevisions": "$1 {{PLURAL:$1|ၶူၼ်ႉၶႆႈ|ၶူၼ်ႉၶႆႈ.}} မွတ်ႇပႅတ်ႈယဝ်ႉ",
+       "undelete-revision": "လွင်ႈၶူၼ်ႉၶႆႈ ၸိူဝ်းဢၼ် $3 ၵေႃႉမွတ်ႇဝႆႉ ၶွင်ႇ $1 (ၼင်ႇ $4, တီႈ $5)",
+       "undelete-nodiff": "ဢမ်ႇႁၼ် လွင်ႈၶူၼ်ႉၶႆႈ ဢၼ်ပူၼ်ႉမႃး။",
+       "undeletebtn": "ဝႆႉၶိုၼ်း",
        "undeletelink": "တူၺ်း/ၶိုၼ်းမိူၼ်ၵဝ်ႇ",
        "undeleteviewlink": "တူၺ်း",
+       "undeleteinvert": "လွင်ႈလိူၵ်ႈသၢင်ႈ ပိၼ်ႈၽူၼ်",
+       "undeletecomment": "လွင်ႈတၢင်း :",
+       "undeletedrevisions": "{{PLURAL:$1|1 ၶူၼ်ႉၶႆႈ|$1 ၸိူဝ်းၶူၼ်ႉၶႆႉ}} ဢဝ်ဝႆႉၶိုၼ်းယဝ်ႉ",
+       "undeletedfiles": "ဝႆႉၶိုၼ်း {{PLURAL:$1|1 ၾၢႆႇ}} ယဝ်ႉ",
+       "undelete-search-title": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undelete-search-box": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
+       "undelete-search-prefix": "ၼႄ ၼႃႈလိၵ်ႈ ၸိူဝ်းတႄႇဝႆႉတင်း :",
+       "undelete-search-submit": "ၶူၼ်ႉႁႃ",
        "namespace": "ဢွင်ႈတီႈၸိုဝ်ႈ",
        "invert": "ပဵၼ်ႇၽၢႆႇ လွင်ႈလိူၵ်ႈသၢင်ႈ",
        "tooltip-invert": "လိူၵ်ႈပၼ် လွၵ်းၼႆႉဝႃႈ တႃႇတေလပ်ႉဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ ဢၼ်ႁဵတ်းၸူး ၼႃႈလိၵ်ႈၸိူဝ်းၼႆႉ ၸွမ်းၼင်ႇ ၸိုဝ်ႈ ၸိူဝ်းလိူၵ်ႈဝႆႉ (လႄႈ ၸွမ်းၼင်ႇၸိုဝ်ႈ ၸိူဝ်းဢၼ်လိူၵ်ႈဝႆႉယဝ်ႉၼၼ်ႉ)",
        "anoncontribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
        "month": "တႄႇဢဝ်လိူၼ် (လႄႈ ဢၼ်ပူၼ်ႉမႃး):",
        "year": "တႄႇဢဝ်ပီ (လႄႈ ဢၼ်ပူၼ်ႉမႃး):",
+       "sp-contributions-newbies-sub": "တွၼ်ႈတႃႇဢၶွင်ႉ ဢၼ်မႂ်ႇ",
+       "sp-contributions-blocklog": "မၢႆတမ်းၵၢၼ်​ႁေႉတတ်း",
+       "sp-contributions-suppresslog": "လွင်ႈၶဝ်ႈႁူမ်ႈ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်ႁူမ်ႇလပ်ႉဝႆႉ",
+       "sp-contributions-deleted": "လွင်ႈၶဝ်ႈႁူမ်ႈ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်မွတ်ႇဝႆႉ",
+       "sp-contributions-uploads": "လူတ်ႇၶိုၼ်ႈ",
+       "sp-contributions-logs": "မၢႆတမ်း",
+       "sp-contributions-talk": "တွၼ်ႈဢုပ်ႇ",
+       "sp-contributions-userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုတ်း",
+       "sp-contributions-blocked-notice": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
+       "sp-contributions-blocked-notice-anon": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
+       "sp-contributions-search": "ၶူၼ်ႉႁႃ တႃႇ လွင်ႈၶဝ်ႈႁူမ်ႈ",
+       "sp-contributions-username": "ႁဵၼ်းလိၵ်ႈ ဢၢႆႇၽီ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "sp-contributions-toponly": "ၵူၺ်းၼႄပၼ် ၵၢၼ်မႄးထတ်း ၸိူဝ်းၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်း",
+       "sp-contributions-newonly": "ၵူၺ်းၼႄပၼ် ၵၢၼ်မႄးထတ်း ၸိူဝ်းပဵၼ် လွင်ႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "sp-contributions-hideminor": "သိူင်ႇဝႆႉ လွင်ႈမႄးထတ်း ဢိတ်းဢီႈ",
+       "sp-contributions-submit": "ၶူၼ်ႉႁႃ",
        "whatlinkshere": "ႁဵင်းၵွင်ႉ ဢၼ်မီးတီႈၼႆႉ ပဵၼ်သင်",
        "whatlinkshere-title": "ၼႃႈလိၵ်ႈၸိူဝ်းလိင်ႉၸူး \"$1\"",
        "whatlinkshere-page": "ၼႃႈလိၵ်ႈ",
        "linkshere": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>[[:$1]]</strong>:",
+       "nolinkshere": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>[[:$1]]</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
        "isredirect": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
        "istemplate": "တူဝ်ၶဝ်ႈပႃး",
        "isimage": "ၾၢႆႇၵွင်ႉ",
        "whatlinkshere-hideredirs": "$1 လၢႆႈၽၢႆႇ",
        "whatlinkshere-hidetrans": "သိူင်ႇတူဝ်ၶဝ်ႈပႃး",
        "whatlinkshere-hidelinks": "$1 လိင်ႉၵွင်ႉ",
+       "whatlinkshere-hideimages": "$1 ၾၢႆႇၵွင်ႉ",
        "whatlinkshere-filters": "တူဝ်ထွင်",
+       "whatlinkshere-submit": "သိုပ်ႇၵႂႃႇ",
+       "autoblockid": "ႁႄႉတတ်းႁင်းမႂ်း #$1",
+       "block": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "unblock": "ပိုတ်ႇႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "blockip": "ႁႄႉတတ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "blockip-legend": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "ipaddressorusername": "ႁဵၼ်းလိၵ်ႈ ဢၢႆႇၽီ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "ipbexpiry": "ၶၢဝ်းယၢမ်းသုတ်းသဵင်ႈ:",
+       "ipbreason": "လွင်ႈတၢင်း :",
+       "ipbreason-dropdown": "*လွင်ႈတၢင်းႁႄႉတတ်း ဢၼ်ၵဵဝ်ႈလူၺ်ႈတင်းၼမ်\n** ထႅမ်သႂ်ႇ လွၼ်ႉၶၢဝ်ႇ ဢၼ်ၽိတ်းပိူင်ႈ\n** ထွၼ်ပႅတ်ႈ ၸိူဝ်းၶဝ်ႈပႃး ၼႂ်းၼႃႈလိၵ်ႈ\n** ႁဵတ်းႁဵင်းၵွင်ႉဢၼ်မီးမႅင်း တီႈၽၢႆႇၼွၵ်ႈ\n** ထႅမ်သႂ်ႇ ဢၼ်ဢမ်ႇမီးလွင်ႈမီးတၢင်း/လွင်ႈဢူၼ်ဢၢၼ် တီႈၼႂ်းၼႃႈလိၵ်ႈ\n** လွင်ႈႁဵတ်းသၢင်ႈ တၢင်းလွၵ်ႇငိူတ်ႈ/ပၼ်လွင်ႈတၢင်းသုၵ်ႉယုင်ႈၸႂ်\n** လူလၢႆ ဢၶွင်ႉလၢႆဢၼ်\n** ၸႂ်ႉဝႆႉၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း မဵဝ်းဢမ်ႇႁပ်ႉၶၢမ်ႇလႆႈ",
+       "ipb-hardblock": "ႁႄႉၵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းလွၵ်ႉဢိၼ်ႇဝႆႉ ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း ၵႃႈတီႈ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇဢၼ်ၼႆႉ",
+       "ipbcreateaccount": "ႁႄႉၵင်ႈ လွင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "ipbemailban": "ႁႄႉၵင်ႈ လွင်ႈၽူႈၸႂ်ႉတိုဝ်း သူင်ႇဢီးမေးလ်",
+       "ipbenableautoblock": "ႁႄႉတတ်း ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇ ဢၼ်ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ၸႂ်ႉၵႂႃႇၵမ်းလိုၼ်းသုတ်း လႄႈ ၸိူဝ်းၵပ်းၵၢႆႇ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇ ဢၼ်ၶဝ် ၶတ်းၸႂ်တႃႇတေ မႄးထတ်း ၵႃႈတီႈ",
+       "ipbsubmit": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ",
+       "ipbother": "တၢင်ႇၶၢဝ်း :",
+       "ipboptions": "2 မူင်း:2 hours,1 ဝၼ်း:1 day,3 ဝၼ်း:3 days,1 ဝူင်ႈ:1 week,2 ဝူင်ႈ:2 weeks,1 လိူၼ်:1 month,3 လိူၼ်:3 months,6 လိူၼ်:6 months,1 ပီ:1 year,ဢမ်ႇၼႄႉၼွၼ်း:infinite",
+       "ipbhidename": "သိူင်ႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်ႈ ၵႃႈတီႈ ၵၢၼ်မႄးထတ်းလႄႈ သဵၼ်ႈမၢႆ",
+       "ipbwatchuser": "တူၺ်းၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်းလႄႈ ၼႃႈလိၵ်ႈဢုပ်ႇဢူဝ်းၵၼ် တွၼ်ႈတႃႇ ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ",
+       "ipb-disableusertalk": "ႁႄႉၵၼ် ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ၽွင်းမိူဝ်ႈ မၼ်းထုၵ်ႇႁႄႉတတ်းဝႆႉ ယႃႇႁႂ်ႈ မၼ်းမႄးထတ်းလႆႈ ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်း ႁင်းၶဝ်",
+       "ipb-change-block": "ၶိုၼ်းႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၸႂ်ႉ ၵၢၼ်ႈတင်ႈၸိူဝ်းၼႆႉ",
+       "ipb-confirm": "ၼႄႉၼွၼ်း လွင်ႈႁႄႉတတ်း",
+       "badipaddress": "ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇ ၽိတ်းပိူင်ႈဝႆႉ",
+       "blockipsuccesssub": "လွင်ႈႁႄႉတတ်း ၶႅမ်ႉလႅပ်ႈယဝ်ႉ",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ထုၵ်ႇႁႄႉတတ်းဝႆႉယဝ်ႉ။<br />\nတူၺ်း  [[Special:BlockList|သဵၼ်ႈမၢႆႁႄႉတတ်း]] တွၼ်ႈတႃႇ ၶိုၼ်းလိုမ်ႉတူၺ်း လွင်ႈႁႄႉတတ်း။",
+       "ipb-blockingself": "ၸဝ်ႈၵဝ်ႇ တေႁႄႉတတ်းတူဝ်ၸဝ်ႈၵဝ်ႇ! လွင်ႈဝႃႈ တေႁဵၼ်းၼၼ်ၼၼ်ႉ ​ၸဝ်ႈၵဝ်ႇ ၼႄႉၼွၼ်းယဝ်ႉႁႃႉ?",
+       "ipb-confirmhideuser": "ၸဝ်ႈၵဝ်ႇ တေႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ပိုတ်ႇၸႂ်ႉဝႆႉ \"သိူင်ႇၽူႈၸႂ်ႉတိုဝ်း\"။ ဢၼ်ၼႆႉ မၼ်းတေႁူမ်ႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းၼႆႉဝႆႉ ၵႃႈတီႈသဵၼ်ႈမၢႆတင်းသဵင်ႈလႄႈ တီႈသဵၼ်ႈၶပ်ႉ။ ၸဝ်ႈၵဝ်ႇ လပ်ႉလွင်းဝႃႈ တေႁဵတ်းၼၼ်ယူႇႁႃႉ?",
+       "ipb-confirmaction": "သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ လပ်ႉလွင်း​လီဝႃႈ ၶႂ်ႈႁဵတ်းၼၼ်ယူႇၼႆၸိုင် ၶႅၼ်းတေႃႈၵႂႃႇ ပၼ်မၢႆၶၼ် တီႈ လွၵ်း \"{{int:ipb-confirm}}\"  ဢၼ်မီးၽၢႆႇတႂ်ႈၼၼ်ႉလႄႈ။",
+       "ipb-edit-dropdown": "မႄးထတ်း လွင်ႈတၢင်း ႁႄႉတတ်း",
+       "ipb-unblock-addr": "ဢမ်ႇႁႄႉတတ်း $1",
+       "ipb-unblock": "ဢမ်ႇႁႄႉတတ်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇၼၼ်ႉ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇ",
+       "ipb-blocklist": "တူၺ်း ၸိူဝ်းႁႄႉတတ်းဝႆႉ ယၢမ်းလဵဝ်",
+       "ipb-blocklist-contribs": "ၶဝ်ႈႁူမ်ႈတႃႇ {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "ၵိုတ်း $1",
+       "unblockip": "ဢမ်ႇႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "unblockiptext": "တွၼ်ႈတႃႇ ဝႆႉၶိုၼ်း ၵၢၼ်သုၼ်ႇတႅမ်ႈ ဢၼ်လႆႈ ႁႄႉတတ်းဝႆႉ ႁဵင်းလိၵ်ႈ ဢမ်ႇၼၼ် ၽူႈၸႂ်ႉတိုဝ်းၼၼ်ႉၼႆ ၸႂ်ႉပၼ် လွၵ်ႈထႅမ်သဵၼ်ႈ ၽၢႆႇတႂ်ႈၼႆႉလႄႈ။",
+       "ipusubmit": "ထွၼ်ပႅတ်ႈ လွင်ႈႁႄႉတတ်းဢၼ်ၼႆႉ�",
+       "unblocked": "[[User:$1|$1]] ၼႆႉ ထုၵ်ႇဢမ်ႇႁႄႉတတ်းယဝ်ႉ။��",
+       "unblocked-range": "$1 ၼႆႉ ထုၵ်ႇဢမ်ႇႁႄႉတတ်းယဝ်ႉ။�������",
+       "unblocked-id": "လွင်ႈႁႄႉတတ်း $1 ၼႆႉ ထုၵ်ႇထွၼ်ပႅတ်ႈယဝ်ႉ။���",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] ၼႆႉ ထုၵ်ႇဢမ်ႇႁႄႉတတ်းယဝ်ႉ။",
+       "blocklist": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်းဝႆႉ�",
+       "ipblocklist": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်းဝႆႉ�",
+       "ipblocklist-legend": "သွၵ်ႈႁႃ ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ထုၵ်ႇႁႄႉတတ်းဝႆႉ�",
+       "blocklist-userblocks": "သိူင်ႇဢၶွင်ႉ ႁႄႉတတ်း�",
+       "blocklist-tempblocks": "သိူင်ႇ လွင်ႈႁႄႉတတ်းၸူဝ်ႈၵႅပ်ႉ",
+       "blocklist-addressblocks": "သိူင်ႇ လွင်ႈႁႄႉတတ်း ဢၢႆႇၽီႇဢၼ်လဵဝ်",
+       "blocklist-rangeblocks": "သိူင်ႇလွင်ႈႁႄႉတတ်း ၶပ်ႉယႆ�",
+       "blocklist-timestamp": "ၸုမ်ႈၶၢဝ်းယၢမ်း",
+       "blocklist-target": "တီႈယိူင်း",
+       "blocklist-expiry": "ဢႃႇယုသဵင်ႈ",
+       "blocklist-by": "လွင်ႈႁႄႉတတ်း ၽူႈၵုမ်းၵၢၼ်",
+       "blocklist-params": "ႁႄႉတတ်း ပိူင်မၵ်းမၼ်ႈ�",
+       "blocklist-reason": "လွင်ႈတၢင်း",
+       "ipblocklist-submit": "ၶူၼ်ႉႁႃ",
+       "ipblocklist-localblock": "လွင်ႈႁႄႉတတ်း ၼႂ်းလူဝ်ႇၵႄႇ�",
+       "ipblocklist-otherblocks": " {{PLURAL:$1|block|လွင်ႈႁႄႉတတ်း}} တၢင်ႇၸိူဝ်း",
+       "infiniteblock": "ဢမ်ႇမီးတီႈသုတ်း�",
+       "expiringblock": "ဢႃႇယုတေသဵင်ႈ ပေႃး $1 ၶၢဝ်းယၢမ်း $2�",
+       "anononlyblock": "တႃႇဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ ၵူၺ်း�",
+       "noautoblockblock": "ဢိုတ်းၸႂ်ႉ လွင်ႈႁႄႉတတ်းႁင်းၵူၺ်း",
+       "createaccountblock": "ဢိုတ်းၸႂ်ႉ ​လွင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "emailblock": "ဢိုတ်းၸႂ်ႉ ဢီးမေးလ်",
+       "blocklist-nousertalk": "ဢမ်ႇၸၢင်ႈမႄးထတ်း ၼႃႈလိၵ်ႈဢုပ်ႇၵုမ် ၸဝ်ႈၵဝ်ႇ",
+       "ipblocklist-empty": "သဵၼ်ႈမၢႆ ႁႄႉတတ်း ပဝ်ႇဝႆႉ။",
+       "ipblocklist-no-results": "ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီ ဢမ်ႇၼၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တုၵ်းယွၼ်းဝႆႉၼၼ်ႉ ဢမ်ႇလႆႈ ႁႄႉတႄးဝႆႉ။�",
        "blocklink": "ႁႄႉတတ်း",
        "unblocklink": "ဢမ်ႇႁႄႉႁၢမ်ႈ",
+       "change-blocklink": "လႅၵ်ႈလၢႆႈလွင်ႈႁႄႉတတ်း�",
        "contribslink": "ၶဝ်ႈႁူမ်ႈ",
+       "emaillink": "�သူင်ႇ ဢီးမေးလ်",
+       "autoblocker": "ယွၼ်ႉပိူဝ်ႈဝႃႈ ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇၸဝ်ႈၵဝ်ႇၼႆႉ ထုၵ်ႇၸႂ်ႉဝႆႉ ၼင်ႇ \"[[User:$1|$1]]\" လႄႈ ထုၵ်ႉႁႄးတတ်းၵႂႃႇ ႁင်းမၼ်း။\nလွင်ႈတၢင်း ဢၼ်ပၼ်ဝႆႉ တွၼ်ႈတႃႇ ႁႄႉတတ်း  $1 ၼႆႉတႄႉ ပဵၼ် \"$2\"�",
+       "blocklogpage": "�မၢႆတမ်းၵၢၼ်ႁႄႉတတ်း",
+       "blocklog-showlog": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ မိူဝ်ႈပူၼ်ႉမႃး ယၢမ်ႈထုၵ်ႇႁႄႉတတ်းဝႆႉယဝ်ႉ။\nမၢႆတမ်းၵၢၼ်ႁႄႉတတ်း တွၼ်ႈတႃႇဢိင်ပိုင်ႈၼၼ်ႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၽၢႆႇတႂ်ႈၼႆႉယူႇ :�",
+       "blocklog-showsuppresslog": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ မိူဝ်ႈပူၼ်ႉမႃး ယၢမ်ႈထုၵ်ႁႄႉတတ်းလႄႈ ထုၵ်ႇသိူင်ႇဝႆႉ။\nမၢႆတမ်းႁူမ်ႇဝႆႉ တွၼ်ႈတႃႇပိုင်ႈဢိင်ၼၼ်ႉ ၼႄဝႆႉပၼ် ၼင်ႇၽၢႆႇတႂ်ႈၼႆႉ :�",
+       "blocklogentry": "[[$1]] ၵေႃႉထုၵ်ႇႁႄႉတတ်းဝႆႉ တႃႇၶၢဝ်းယၢမ်းတေသုတ်းသဵင်ႈ $2 $3",
+       "reblock-logentry": "ၵၢၼ်တင်ႈ လွင်ႈႁႄႉတတ်း ဢၼ်လႅၵ်ႈလၢႆႈဝႆႉ တွၼ်ႈတႃႇ [[$1]] တင်း လွင်ႈၶၢဝ်းယၢမ်း သုတ်းသဵင်ႈ ၶွင် $2 $3",
+       "unblocklogentry": "ဢမ်ႇႁႄႉတတ်း $1",
+       "block-log-flags-anononly": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈၼၼ်ႉၵူၺ်း",
+       "block-log-flags-nocreate": "ဢိုတ်းၸႂ်ႉ ​လွင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "block-log-flags-noautoblock": "ဢိုတ်းၸႂ်ႉ လွင်ႈႁႄႉတတ်းႁင်းၵူၺ်း",
+       "block-log-flags-noemail": "ဢိုတ်းၸႂ်ႉ ဢီးမေးလ်",
+       "block-log-flags-nousertalk": "ဢမ်ႇၸၢင်ႈမႄးထတ်း ၼႃႈလိၵ်ႈဢုပ်ႇၵုမ် ၸဝ်ႈၵဝ်ႇ",
+       "block-log-flags-angry-autoblock": "ပိုတ်ႇၸႂ်ႉ လွင်ႈႁႄႉတတ်းႁင်းၵူၺ်း ဢၼ်ယုၵ်ႉသုင်ဝႆႉ",
+       "block-log-flags-hiddenname": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း သိူင်ႇဝႆႉ",
+       "range_block_disabled": "လွင်ႈ ၽူႈၵုမ်းၵၢၼ် ႁဵတ်းလႆႈ တႃႇၵေႃႇသၢင်ႈ ၶွပ်ႇဝိူင်းႁႄႉတတ်းၼၼ်ႉ ထုၵ်ႇဢိုတ်းၸႂ်ႉဝႆႉ။",
+       "ipb_expiry_invalid": "ၶၢဝ်းယၢမ်းသုတ်းသဵင်ႈ ၽိတ်းပိူင်ႈဝႆႉ။",
+       "ipb_expiry_old": "ၶၢဝ်းယၢမ်းသုတ်းသဵင်ႈၼႆႉ မီးဝႆႉ တီႈၶၢဝ်းပူၼ်ႉမႃး။",
+       "ipb_expiry_temp": "လွင်ႈႁႄႉတတ်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်သိူင်ႇဝႆႉၼၼ်ႉ တေလႆႈပဵၼ် ဢၼ်မၼ်ႈၵိုမ်း။",
+       "ipb_hide_invalid": "ဢမ်ႇၸၢင်ႈႁူမ်ႇလပ်ႉဝႆႉ ဢၶွင်ႉဢၼ်ၼႆႉ; မၼ်းမီးလိူဝ်ဝႆႉ {{PLURAL:$1|လွင်ႈမႄးထတ်း ဢၼ်ၼိုင်ႈ|$1 လွင်ႈမႄးထတ်းတင်းၼမ်}}။",
+       "ipb_already_blocked": "\"$1\" ၼႆႉ ထုၵ်ႇ ႁႄႉတတ်းဝႆႉယဝ်ႉ။",
+       "ipb-needreblock": "$1 ၼႆႉ ထုၵ်ႇႁႄႉတတ်းဝႆႉယဝ်ႉ။ ၸွင်ႇၸဝ်ႈၵဝ်ႇ ၶႂ်ႈလႅၵ်ႈလၢႆႈ ၵၼ်တင်ႈႁိုဝ်?",
+       "ipbnounblockself": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇ ပိုတ်ႇသေႃးၶိုၼ်းတႃႇၸဝ်ႈၵဝ်ႇ။",
+       "lockdb": "ၶတ်းယွင်ၶေႃႈမုၼ်း",
+       "unlockdb": "ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "lockdbtext": "လွင်ႈၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းတေယင်ႉၵိုတ်းဝႆႉၸူဝ်ႈၵႅပ်ႉ ၵပ်းၵၢႆႇလူၺ်ႈ လွင်ႈၽူႈၸႂ်ႉတိုဝ်းတင်းသဵင်ႈ မႄးထတ်းၼႃႈလိၵ်ႈ၊ လႅၵ်ႈလၢႆႈ ငဝ်ႈၵုမ်းပိူင်ၶဝ်၊ မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၶဝ် လႄႈ ၸိူဝ်းဢၼ်တေလူဝ်ႇ လႅၵ်ႈလၢႆႈ တီႈၼႂ်း ယွင်ၶေႃႈမုၼ်းၼၼ်ႉ။ ၶႅၼ်းတေႃႈ ၸဝ်ႈၵဝ်ႇ ၼႄ့ၼွၼ်းဝႃႈ ၸဝ်ႈၵဝ်ႇယိူင်းဢၢၼ်းဝႃႈ ၶႂ်ႈႁဵတ်းသင် ၼႆသေ သင်ၸိူဝ်ႉဝႃႈ လွင်ႈမႄးၶိုၼ်းၸဝ်ႈၵဝ်ႇ ယဝ်ႉတူဝ်ႈယဝ်ႉၼႆ ၸဝ်ႈၵဝ်ႇ တေၸၢင်ႈၶိုၼ်း ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်းလႆႈယူႇ။",
+       "unlockdbtext": "လွင်ႈပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းတေဝႆႉၶိုၼ်း လွင်ႈႁဵတ်းသၢင်ႈလႆႈ ၵပ်းၵၢႆႇလူၺ်ႈ ၽူႈၸႂ်ႉတိုဝ်းၶဝ် မႄးထတ်းၼႃႈလိၵ်ႈ၊ လႅၵ်ႈလၢႆႈ ငဝ်ႈၵုမ်းပိူင်ၶဝ်၊ မႄးထတ်း သဵၼ်ႈမၢႆ ပႂ်ႉတူၺ်းၶဝ် လႄႈ ၸိူဝ်းဢၼ်တေလူဝ်ႇ လႅၵ်ႈလၢႆႈ တီႈၼႂ်း ယွင်ၶေႃႈမုၼ်းၼၼ်ႉ။  ၶႅၼ်းတေႃႈ ၸဝ်ႈၵဝ်ႇ ၼႄ့ၼွၼ်းဝႃႈ ၸဝ်ႈၵဝ်ႇယိူင်းဢၢၼ်းဝႃႈ ၶႂ်ႈႁဵတ်းသင် ဢၼ်ဝႃႈၼၼ်ႉ။",
+       "lockconfirm": "ၸႂ်ႈယဝ်ႉ။ ၵဝ်ၶႃႈ ၶႂ်ႈၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း တႄႉတႄႉဢေႃႈ။",
+       "unlockconfirm": "ၸႂ်ႈယဝ်ႉ၊ ၵဝ်ၶႃႈ ၶႂ်ႈပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း တႄႉတႄႉဢေႃႈ။",
+       "lockbtn": "ၶတ်းယွင်ၶေႃႈမုၼ်း",
+       "unlockbtn": "ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "locknoconfirm": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈပၼ်မၢႆမႅၼ်ႈ တီႈတိူၵ်ႈၼႄႉၼွၼ်း။",
+       "lockdbsuccesssub": "ၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း ၶႅမ်ႉလႅပ်ႈယဝ်ႉ။",
+       "unlockdbsuccesssub": "လွင်ႈၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း ထွၼ်ပႅတ်ႈယဝ်ႉယဝ်ႈ",
+       "lockdbsuccesstext": "ၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း ဝႆႉယဝ်ႉယဝ်ႈ<br />\nဝၢႆးသေ လွင်ႈမႄးၶိုၼ်း ၸဝ်ႈၵဝ်ႇၼၼ်ႉ ယဝ်ႉတူဝ်ႈယဝ်ႈၼႆ ယႃႇပေလိုမ်း တႃႇ  [[Special:UnlockDB|ထွၼ်ပႅတ်ႈ သေႃး]] ။",
+       "unlockdbsuccesstext": "ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်း ဝႆႉယဝ်ႉယဝ်ႈ။",
+       "lockfilenotwritable": "ၾၢႆႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်းၼၼ်ႉ ဢမ်ႇၸၢင်ႈၶဝ်ႈတႅမ်ႈလႆႈ။\nလုၵ်ႉတီႈ သႃႇပိူဝ်ႇဝႅမ်ႉ သေ ဢၼ်ၼႆႉ မၼ်းလူဝ်ႇၶဝ်ႈတႅမ်ႈလႆႈတီႈ ၶတ်းသေႃး ဢမ်ႇၼၼ် ပိုတ်ႇသေႃး ယွင်ၶေႃႈမုၼ်းဢေႃႈ။",
+       "databaselocked": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ပေႃးၶတ်းသေႃးဝႆႉယဝ်ႉ။",
+       "databasenotlocked": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ဢမ်ႇလႆႈၶတ်းသေႃးဝႆႉ။",
+       "lockedbyandtime": "( {{GENDER:$1|$1}} ၵေႃႉ မိူဝ်ႈ $2 ၶၢဝ်းယၢမ်း $3)",
+       "move-page": "ၶၢႆႉ $1",
+       "move-page-legend": "ၶၢႆႉၼႃႈလိၵ်ႈ",
+       "movenologintext": "တွၼ်ႈတႃႇၶၢႆႉၼႃႈလိၵ်ႈၼႆႉ ၸဝ်ႈၵဝ်ႇ တေလႆႈပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တၢင်ႇ မၢႆၽၢင်ယဝ်ႉလႄႈ တေလႆႈ  [[Special:UserLogin|ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ]]။",
+       "movenotallowed": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈ။",
+       "movenotallowedfile": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇ ၶၢႆႉၾၢႆႇ။",
+       "cant-move-user-page": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း (ယၢၼ်ဢဝ်တီႈ ၼႃႈလိၵ်ႈၽႄ)။",
+       "cant-move-to-user-page": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈၸူး ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း (လိူဝ်သေ ၸူး ၼႃႈလိၵ်ႈၽႄ ၽူႈၸႂ်ႉတိုဝ်း)။",
+       "cant-move-category-page": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈလိူင်ႈ။",
+       "cant-move-to-category-page": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇၶၢႆႉ ၼႃႈလိၵ်ႈၸူး ၼႃႈလိၵ်ႈလိူင်ႈ။",
+       "cant-move-subpages": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တႃႇၶၢႆႉ ၼႃႈလိၵ်ႈၽႄ။",
+       "namespace-nosubpages": "ဢွင်ႈၸိုဝ်ႈ \"$1\" ဢမ်ႇၶႂၢင်းပၼ် ၼႃႈလိၵ်ႈၽႄ။",
+       "newtitle": "ႁူဝ်ၶေႃႈ ဢၼ်မႂ်ႇ :",
+       "move-watch": "တူၺ်း ၼႃႈလိၵ်ႈငဝ်ႈငႃႇ လႄႈ ၼႃႈလိၵ်ႈယိူင်းၸူး",
+       "movepagebtn": "ၶၢႆႉၼႃႈလိၵ်ႈ",
+       "pagemovedsub": "ၶၢႆႉၶႅမ်ႉလႅပ်ႈၵႂႃႇယဝ်ႉ",
+       "movepage-moved": "<strong>\"$1\" ၶၢႆႉၸူး \"$2\"</strong> ယဝ်ႉယဝ်ႈ",
        "movelogpage": "ၶၢႆႉသၢႆမၢႆ",
-       "revertmove": "ပိၼ်ႇပွၵ်ႈၶိုၼ်း",
+       "movenosubpage": "ၼႃးလိၵ်ႈဢၼ်ၼႆ့ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈၽႄ။",
+       "movereason": "လွင်ႈတၢင်း :",
+       "revertmove": "ပိၼ်ႈၶိုၼ်း",
+       "delete_and_move_confirm": "ၸႂ်ႈယဝ်ႉ၊ မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
+       "delete_and_move_reason": "မွတ်ႇပႅတ်ႈၼႆႉ တွၼ်ႈတႃႇႁဵတ်း သၢႆတၢင်း တႃႇၶၢႆႉမႃးတီႈ \"[[$1]]\"",
+       "immobile-source-namespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ၼႃႈလိၵ်ႈၸိူဝ်း မီႈတီႈၼႂ်း လွၵ်းၸိုဝ်ႈ \"$1\"။",
+       "immobile-target-namespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ၼႃႈလိၵ်ႈ ၶဝ်ႈၸူးတီႈၼႂ်း ဢွင်ႈၸိုဝ်ႈ \"$1\"။",
+       "immobile-target-namespace-iw": "ႁဵင်းၵွင်ႉဝီႇၶီႇၸူမ် ၼႆႉ မၼ်းပဵၼ် တီႈယိူင်းၽိတ်းပိူင်ႈ တွၼ်ႈတႃႇ ၶၢႆႉၼႃႈလိၵ်ႈ။",
+       "immobile-source-page": "ၼႃႈလိၵ်ႈၼႆႉ မၼ်းပဵၼ် ဢၼ်ဢမ်ႇၶၢႆႉလႆႈ။",
+       "immobile-target-page": "ဢမ်ႇၸၢင်ႈၶၢႆႉၸူး ႁူဝ်ၶေႃႈ ဢွင်ႈတီႈဝႆႉဢၼ်ၼၼ်ႉ။",
+       "imagenocrossnamespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉၾၢႆႇၸူး ဢွင်ႈၸိုဝ်း ဢမ်ႇမီးၾၢႆႇ။",
+       "nonfile-cannot-move-to-file": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ဢၼ်ဢမ်ႇမီးၾၢႆႇ ၸူး လွၵ်းၸိုဝ်ႈၾၢႆႇ။",
+       "imagetypemismatch": "သၢႆလင်ၾၢႆႇဢၼ်မႂ်ႇၼႆႉ မၼ်းဢမ်ႇၶူပ်းၵၼ်တတ်း လိူင်ႈသႅၼ်းမၼ်း။",
+       "imageinvalidfilename": "ၸိုဝ်ႈၾၢႆႇဢၼ်ယိူင်းၸူးၼၼ်ႉ မၼ်းၽိတ်းပိူင်ႈ။",
        "export": "သူင်ႇၼႃႈလိၵ်ႈဢွၵ်ႇ",
+       "exportall": "သူင်ႇဢွၵ်ႇ ၼႃႈလိၵ်ႈတင်းမူတ်း",
+       "export-submit": "သူင်ႇဢွၵ်ႇ",
+       "export-addcattext": "ထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈ ၵႃႈတီႈ တွၼ်ႈၵၼ်:",
+       "export-addcat": "ထႅမ်သႂ်ႇ",
+       "export-addnstext": "ထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈ ၵႃႈတီႈ ဢွင်ႈၸိုဝ်ႈ:",
+       "export-addns": "ထႅမ်သႂ်ႇ",
+       "export-download": "သိမ်းၼင်ႇၾၢႆႇ",
+       "export-templates": "ၶဝ်ႈပႃး လွၵ်းပိူင်",
+       "export-pagelinks": "ၶဝ်ႈပႃး ၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူးဝႆႉ လွင်ႈလိုၵ်ႉလမ်ႇၶွင် :",
+       "export-manual": "ထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈ ႁင်းၸဝ်ႈၵဝ်ႇ:",
+       "allmessages": "ၶေႃႈၶၢဝ်ႇ ပိူင်သၢင်ႈ",
+       "allmessagesname": "ၸိုဝ်ႈ",
+       "allmessagesdefault": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ပိူင်ႇၵႅဝ်ႈ",
+       "allmessagescurrent": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ယၢမ်းလဵဝ်",
+       "allmessagestext": "ဢၼ်ၼႆႉၼႆႉ ပဵၼ် သဵၼ်ႈမၢႆၶွင် ၶေႃႈၶၢဝ်ႇပိူင်သၢင်ႈ ဢၼ်ၸႂ်ႉလႆႈ တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဝီႇၶီႇမီႇတီႇယႃႇ။ ၶႅၼ်းတေႃႈ ဢႅဝ်ႇလႄႇတူၺ်း [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] လႄႈ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ မီးၵၢင်ၸႂ် တွၼ်ႈတႃႇ ၶဝ်ႈႁူမ်ႈ  ဢၼ်ၵဵဝ်ႇလူၺ်ႈ လွင်ႈပိၼ်ႇၽႃႇသႃႇ ဝီႇၶီႇမီႇတီႇယႃႇ [https://translatewiki.net translatewiki.net] ။",
+       "allmessagesnotsupportedDB": "ၼႃႈလိၵ်ႈၼႆႉ တေဢမ်ႇၸၢင်ႈၸႂ်ႉ ယွၼ်ႉပိူဝ်ႈဝႃႈ <strong>$wgUseDatabaseMessages</strong>ၼႆႉ ထုၵ်ႇဢိုတ်းၸႂ်ႉဝႆႉ။",
+       "allmessages-filter-legend": "တူဝ်ထွင်",
+       "allmessages-filter": "ထွင်ၼင်ႇ သၢႆငၢႆ လွင်ႈမႄးၵမ်ႉၸႂ်:",
+       "allmessages-filter-unmodified": "ဢၼ်ဢမ်ႇမူၼ်ႉမႄးဝႆႉ",
+       "allmessages-filter-all": "တင်းမူတ်း",
+       "allmessages-filter-modified": "မူၼ်ႉမႄးဝႆႉ",
+       "allmessages-prefix": "ထွင်တူၺ်းၼင်ႇ ၶေႃႈလူင်ႈၼႃႈ:",
+       "allmessages-language": "ၽႃႇသႃႇၵႂၢမ်း :",
+       "allmessages-filter-submit": "သိုပ်ႇၵႂႃႇ",
+       "allmessages-filter-translate": "ပိၼ်ႇၽႃႇသႃႇ",
        "thumbnail-more": "ႁၢင်ႈယႂ်ႇ",
+       "filemissing": "ၾၢႆႇႁၢႆဝႆႉ",
+       "thumbnail_error": "လွင်ႈၵေႃႇသၢင်ႈ ၵၢၼ်ၽိတ်းပိူင်ႈ ၽိုၼ်လိၵ်ႈ : $1",
+       "thumbnail_error_remote": "ၶေႃႈၶၢဝ်ႇ လွင်ႈၽိတ်းပိူင်ႈ ၵႃႈတီႈ $1: $2",
+       "djvu_page_error": "ၼႃႈလိၵ်ႈ DjVu ပူၼ်ႉဢွၵ်ႇၶွပ်ႇ",
+       "djvu_no_xml": "ဢမ်ႇၸၢင်ႈ ႁွင်ႉဢဝ် XML တွၼ်ႈတႃႇ ၾၢႆႇ DjVu",
+       "thumbnail-temp-create": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ ၾၢႆႇၽိုၼ်လိၵ်ႈ ၸူဝ်ႈၵႅပ်ႉ",
+       "thumbnail-dest-create": "ဢမ်ႇၸၢင်ႈသိမ်း ၽိုၼ်လိၵ်ႈ ၸူး ဢွင်ႈတီႈဝႆႉ",
+       "thumbnail_invalid_params": "ၶေႃႈၵိုၵ်း ၽိုၼ်လိၵ်ႈ ၽိတ်းပိူင်ႈဝႆႉ",
+       "thumbnail_toobigimagearea": "ၾၢႆႇ ဢၼ်သႅၼ်းမႂ်း ယႂ်ႇလိူဝ်သေ $1",
+       "thumbnail_dest_directory": "တႃႇၵေႃႇသၢင်ႈ ၾူဝ်ႇတႃႇ ဢွင်ႈတီႈဝႆႉၼၼ်ႉ ၽိတ်းပိူင်ႈဝႆႉ",
+       "thumbnail_image-type": "ပိူၼ်သႅၼ်း ၶႅပ်းႁၢင်ႈ ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉ",
+       "thumbnail_gd-library": "လွင်ႈႁၢင်ႈပွင် ႁူင်းႁွမ်တွမ် GD ဢမ်ႇယဝ်ႉတူဝ်ႈ: ၵၢၼ်သၢင်ႈ $1 ႁၢမ်းဝႆႉ",
+       "thumbnail_image-missing": "ၾၢႆႇဢၢပ်ႈလႅပ်ႈႁၢႆဝႆႉ : $1",
+       "thumbnail_image-failure-limit": "တွၼ်ႈတႃႇၶိုၼ်းတုမ်ႉတွပ်ႇပၼ် ၽိုၼ်လိၵ်ႈ ၼၼ်ႉ လွင်ႈၶတ်းၸႂ်မၼ်း လူႉလႅဝ်ၵႂႃႇ ၼမ်ၼႃႇဢႃးလႃး ($1 ဢမ်ႇၼၼ် ၼမ်လိူဝ်)။ ဝၢႆးလင်မႃး ၶႅၼ်းတေႃႈ ၶိုၼ်းၶတ်းၸႂ်တူၺ်းထႅင်ႈ လႄႈ။",
+       "import": "သႂ်ႇၶဝ်ႈ ၼႃႈလိၵ်ႈ",
+       "importinterwiki": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
+       "import-interwiki-text": "လိူၵ်ႈပၼ် ဝီႇၶီႇလႄႈ ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ တွၼ်ႈတႃႇ သႂ်ႇၶဝ်ႈ။\nဝၼ်းထီႉ ၶူၼ်ႉၶႆႉလႄႈ ၸိုဝ်ႈ ၽူႈမႄးထတ်း ၼၼ်ႉ တေဢဝ်သိမ်းဝႆႉ။\nၸိူဝ်းဢၼ်ဢဝ်တီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း မႃးသႂ်ႇၼၼ်ႉ တေမၢႆတမ်းဝႆႉ ၵႃႈတီႈ [[Special:Log/import|import log]] ။",
+       "import-interwiki-sourcewiki": "ငဝ်ႈငႃႇ ဝီႇၶီႇ:",
+       "import-interwiki-sourcepage": "ငဝ်ႈငႃႇ ၼႃႈလိၵ်ႈ:",
+       "import-interwiki-history": "ထုတ်ႇဢဝ် ပိုၼ်းၶူၼ်ႉၶႆႈတင်းသဵင်ႈ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ",
+       "import-interwiki-templates": "ၶဝ်ႈပႃး လွၵ်းပိူင်တင်းသဵင်ႈ",
+       "import-interwiki-submit": "သႂ်ႇၶဝ်ႈ",
+       "import-mapping-default": "သႂ်ႇၶဝ်ႈၸူး ဢွင်ႈဝႆႉ ပိူင်ၵႅဝ်ႈ",
+       "import-mapping-namespace": "သႂ်ႇၶဝ်ႈၸူး ဢွင်ႈၸိုဝ်ႈ:",
+       "import-mapping-subpage": "သႂ်ႇၶဝ်ႈၼင်ႇ ၼႃႈလိၵ်ႈၽႄ ၶွင် ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ:",
+       "import-upload-filename": "ၸိုဝ်ႈၾၢႆႇ:",
+       "import-comment": "ၶေႃႈႁၼ်ထိုင်:",
+       "importtext": "ၶႅၼ်းတေႃႈ ၸႂ်ႉတိုဝ်း  [[Special:Export|export utility]] သေ လုၵ်ႉတီႈ ငဝ်ႈငႃႇ ဝီႇၶီႇ​ သူင်ႇၾၢႆႇဢွၵ်ႇ။\nသိမ်းဢၼ်ၼႆႉ ၸူးတီႈ ၶွမ်ႇပိဝ်ႇတႃႇၸဝ်ႈၵဝ်ႇလႄႈ လူတ်ႇၶိုၼ်ႈဢၼ်ၼႆႉ တီႈၼႆႈ။",
+       "importstart": "တိုၵ်ႉဢဝ် ၼႃႈလိၵ်ႈသႂ်ႇယူႇ...",
+       "import-revision-count": "$1 {{PLURAL:$1|ၶူၼ်ႉၶႆႈ}}",
+       "importnopages": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းတႃႇသႂ်ႇၶဝ်ႈ",
+       "imported-log-entries": "သႂ်ႇၶဝ်ႈယဝ်ႉ $1 {{PLURAL:$1|မၢႆတမ်း ၶေႃႈသႂ်ႇၶဝ်ႈ}}.",
+       "importfailed": "လွင်ႈသႂ်ႇၶဝ်ႈ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ: <nowiki>$1</nowiki>",
+       "importunknownsource": "ဢမ်ႇႁူႉပိူင်သႅၼ်း ငဝ်ႈငႃႇ သႂ်ႇၶဝ်ႈ",
+       "importcantopen": "ဢမ်ႇၸၢင်ႈပိုတ်ႇ ၾၢႆႇသႂ်ႇၶဝ်ႈ",
+       "importbadinterwiki": "ႁဵင်းၵွင်ႉ ဝီႇၶီႇၸူမ် ဢၼ်ဢမ်ႇလီ",
+       "importsuccess": "သႂ်ႇၶဝ်ႈ ယဝ်ႉတူဝ်ႈယဝ်ႈ!",
+       "importnosources": "တီႈဢၼ်မၵ်းမၼ်ႈဝႆႉ တႃႇသႂ်ႇၶဝ်ႈၼၼ်ႉ မၼ်းဢမ်ႇမီး ဝီႇၶီႇ လႄႈ လွင်ႈလူတ်ႇၶိုၼ်ႈ ပိုၼ်းၵမ်းသိုဝ်ႈၼၼ်ႉ ထုၵ်ႇဢိုတ်းၸႂ်ႉဝႆႉ။",
+       "importnofile": "ၾၢႆႇသႂ်ႇၶဝ်ႈ ဢမ်ႇလႆႈလူတ်ႇၶိုၼ်ႈဝႆႉ။",
+       "importuploaderrorsize": "လွင်ႈလူတ်ႇၶိုၼ်ႈ ၾၢႆႇသႂ်ႇၶဝ်ႈ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ။\nၾၢႆႇၼၼ်ႉ ယႂ်ႇပူၼ်ႉလိူဝ် သႅၼ်းလူတ်ႇၶိုၼ်ႈ ဢၼ်ၶႂၢင်းပၼ်ဝႆႉ။",
+       "importuploaderrortemp": "လွင်ႈလူတ်ႇၶိုၼ်ႈ ၾၢႆႇသႂ်ႇၶဝ်ႈ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ။\nၾူဝ်ႈတႃႇၸႂ်ႉတူဝ်ႈၵႅမ်ႉၼၼ်ႉ ႁၢႆဝႆႉ။",
+       "import-parse-failure": "ပွင်ႈသႂ်ႇၶဝ်ႈ XML ဢမ်ႇၶႅမ်ႉလႅပ်ႈ",
+       "import-noarticle": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းတႃႇသႂ်ႇၶဝ်ႈ!",
+       "import-nonewrevisions": "ဢမ်ႇမီးၶေႃႈၶူၼ်ႉၶႆႈ ဢၼ်သႂ်ႇၶဝ်ႈဝႆႉ (ၶဝ်ႈၸိူဝ်းၼၼ်ႉ ပၼ်ဝႆႉယဝ်ႉ ႁိုဝ်ဢမ်ႇၼၼ် ထုၵ်ႇၶၢမ်ႈပႅတ်ႈ ယွၼ်ႉမီးလွင်ႈၽိတ်းပိူင်ႈ)။",
+       "xml-error-string": "$1 တီႈ ထႅဝ် $2, ယွင်း $3 (byte $4): $5",
+       "import-upload": "လူတ်ႇၶိုၼ်ႈ ၶေႃႈမုၼ်း XML",
+       "importlogpage": "သႂ်ႇၶဝ်ႈ မၢႆတမ်း",
+       "javascripttest": "လွင်ႈၵူတ်ႇထတ်း JavaScript",
+       "javascripttest-pagetext-unknownaction": "\"$1\" လွင်ႈတူင်ႉၼိုင် ဢၼ်ဢမ်ႇႁူႉၸၵ်း။",
+       "javascripttest-qunit-intro": "တူၺ်း [$1 ၽိုၼ်လိၵ်ႈ လွင်ႈၵူတ်ႇထတ်း] တီႈ mediawiki.org ။",
        "tooltip-pt-userpage": "ၼႃႈလိၵ်ႈသုၼ်ႇတူဝ်ၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-anonuserpage": "ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇ ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇ ဢၼ်ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမႄးထတ်း ၼင်ႇ",
        "tooltip-pt-mytalk": "ၼႃႈလိၵ်ႈသပ်းလႅင်းၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-anontalk": "လွင်ႈဢုပ်ႇဢူဝ်း ၵပ်းၵၢႆႇလွင်ႈမႄးထတ်း ၵႃႈတီႈ ႁဵင်းလိၵ်ႈဢၢႆႇၽီႇဢၼ်ၼႆႉ",
        "tooltip-pt-preferences": "{{GENDER:|ၸဝ်ႈၵဝ်ႇ}} ငဝ်ႈၵုမ်းပိူင်",
        "tooltip-pt-watchlist": "သဵၼ်ႈမၢႆၼႃႈလိၵ်ႈ ဢၼ်ပႂ်ႉတူၺ်း တႃႇလႅၵ်ႈလၢႆႈ",
        "tooltip-pt-mycontris": "သဵၼ်ႈမၢႆ ၶေႃႈလိၵ်ႈၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-anoncontribs": "သဵၼ်ႈမၢႆ လွင်ႈမႄးထတ်း ၸိူဝ်းႁဵတ်းဝႆႉ ၵႃႈတီႈ ႁဵင်းလိၵ်ႈ ဢၢႆႇၽီႇဢၼ်ၼႆႉ",
        "tooltip-pt-login": "ဢမ်ႇလွၵ်ႉဢိၼ်ႇၵေႃႈမူၼ်ႉမႄးလႆႈ ၵူၺ်း တိုၵ်းသူၼ်းႁႂ်ႈလွၵ်ႉဢိၼ်ႇ",
-       "tooltip-pt-logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80\9d်ႉ",
+       "tooltip-pt-logout": "á\80\9cá\80½á\81µá\80ºá\82\89á\80¢á\80½á\81µ်ႉ",
        "tooltip-pt-createaccount": "ၸဝ်ႈၵဝ်ႇထုၵ်ႇပၼ်ႁႅင်း တွၼ်ႈတႃႇၵေႃႇသၢင်ႈ ဢၶွင်ႉလႄႈ လွၵ်ႉဢိၼ်ႇ။ ႁူမ်ႈဝႃႈၼၼ်သေတႃႉ ဢမ်ႇၸႂ်ႈဝႃႈ ဢမ်ႇႁဵတ်းဢမ်ႇလႆႈၼင်ႇၵဝ်ႇ။",
        "tooltip-ca-talk": "ဢုပ်ႇဢူဝ်းလွင်ႈပႃးဝႆႉၼႂ်းၼႃႈလိၵ်ႈ",
        "tooltip-ca-edit": "မႄးထတ်း ၼႃးလိၵ်ႈၼႆႉ",
        "tooltip-ca-addsection": "တႄႇပွတ်းတွၼ်ႈမႂ်ႇ",
        "tooltip-ca-viewsource": "ၼႃႈ​လိၵ်ႈ​ၼႆႉ ထုၵ်ႇ​ႁေႉ​ၵင်ႈ​ဝႆႉ။ သူ​ၸၢင်ႊ​တူၺ်း​ င​ဝ်ႈငႃႇမၼ်းလႆႈ",
-       "tooltip-ca-history": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ပူၼ်ႉမႃး တႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-history": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ပူၼ်ႉမႃး တႃႇၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-ca-protect": "ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-unprotect": "လႅၵ်ႈလၢႆႈ လွင်ႈႁႄႉၵင်ႈ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-ca-delete": "ယႃႉ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-undelete": "ဢဝ်လွင်ႈမႄးထတ်း ဢၼ်ယဝ်ႉၼၼ်ႉ ဝႆႉၶိုၼ်းၸူး ၼႃႈလိၵ်ႈၼႆႉ၊ မိူဝ်ႈၼႃႈလိၵ်ႈၼၼ်ႉ ပႆႇတၼ်းထုၵ်ႇမွတ်ႇပႅတ်ႈၼၼ်ႉ။",
        "tooltip-ca-move": "ၶၢႆႉ ၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-ca-watch": "ဢဝ်ၼႃႈလိၵ်ႈၼႆႉ သႂ်ႇၼႂ်းသဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "tooltip-ca-unwatch": "ထွၼ်ပႅတ်ႈ ၼႃႈလိၵ်ႈၼႆႉ ၵႃႈတီႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ၸဝ်ႈၵဝ်ႇ",
        "tooltip-search": "ၶူၼ်ႉႁႃ {{SITENAME}}",
        "tooltip-search-go": "သင်ဝႃႈ မီးဝႆႉၸိုဝ်ႈ ၵႂႃႇၸူးၼႃႈလိၵ်ႈၸွမ်းၼင်ႇၸိုဝ်ႈၼႆႉ",
        "tooltip-search-fulltext": "​ႁႃ​ပၼ် ၼႃႈ​လိၵ်ႈ ဢၼ်​ပႃး​တူဝ်​လိၵ်ႈ ၸိူ​ဝ်းၼႆႉလႄႈ",
        "tooltip-t-recentchangeslinked": "ၵၢၼ်လႅၵ်ႈလၢႆႈၼႂ်းၼႃႈလိၵ်ႈ ဢၼ်လုၵ်ႉတီႈၼႃႈလိၵ်ႈၼႆႉသေ လိင်ႉဝႆႉ",
        "tooltip-feed-atom": "ၾိတ်ႉဢတွမ်ႊ(Atom) ၶွင်ႈၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-t-contributions": "သဵၼ်ႈမၢႆလွင်ႈၶဝ်ႈႁူမ်ႈ တွၼ်ႈတႃႇ {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်းၼႆ့}}",
+       "tooltip-t-emailuser": "သူင်ႇ ဢီးမေးလ်ၸူး {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း ၵေႃႉၼႆႉ}}",
+       "tooltip-t-info": "လွၼ်ႉၶၢဝ်ႇတၢင်ႇၸိူဝ်း ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
        "tooltip-t-upload": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
        "tooltip-t-specialpages": "ပိုတ်ႇၼႄသဵၼ်ႈ ၼႃႈ​လိၵ်ႈ ၶိုၵ်ႉ​တွၼ်း",
        "tooltip-t-print": "ၼႃႈလိၵ်ႈၼႆႉ မၼ်းပဵၼ်ပိူဝ်းသျိၼ်း ဢၼ်ဢိတ်ႇဢွၵ်ႇလႆႈ",
-       "tooltip-t-permalink": "á\82\81á\80µá\80\84á\80ºá\80¸á\81µá\80½á\80\84á\80ºá\82\89á\80\99á\81¼á\80ºá\82\88á\81µá\80­á\80¯á\80\99á\80ºá\80¸á\80\90á\82\83á\82\87á\81¸á\80°á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80\9cá\80°ဢၼ်ၼႆႉ",
+       "tooltip-t-permalink": "á\82\81á\80µá\80\84á\80ºá\80¸á\81µá\80½á\80\84á\80ºá\82\89á\80\99á\81¼á\80ºá\82\88á\81µá\80­á\80¯á\80\99á\80ºá\80¸á\80\90á\82\83á\82\87á\81¸á\80°á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\81¶á\82\86á\82\88ဢၼ်ၼႆႉ",
        "tooltip-ca-nstab-main": "တူၺ်းၼႃႈလိၵ်ႈလမ်းၼႂ်း",
        "tooltip-ca-nstab-user": "တူၺ်းၼႃႈလိၵ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "tooltip-ca-nstab-media": "တူၺ်း ၼႃႈလိၵ်ႈသိုဝ်ႇ",
        "tooltip-ca-nstab-special": "ၼႃႈလိၵ်ႈၼႆႉပဵၼ် ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း၊ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ မႄး​ထတ်းႁင်း ၸဝ်ႈၵဝ်ႇ ၶေႃၶေႃ။",
        "tooltip-ca-nstab-project": "တူၺ်းၼႃႈလိၵ်ႈ ပရေႃးၵျႅၵ်ႉ",
        "tooltip-ca-nstab-image": "တူၺ်းၼႃႈလိၵ်ႈၾၢႆႇ",
+       "tooltip-ca-nstab-mediawiki": "တူၺ်း ၶေႃႈၶၢဝ်ႇ ပိူင်သၢင်ႈ",
        "tooltip-ca-nstab-template": "တူၺ်း ပိူင်တမ်း",
+       "tooltip-ca-nstab-help": "တူၺ်းၼႃႈလိၵ်ႈ ၸွႆႈထႅမ်",
        "tooltip-ca-nstab-category": "တူၺ်းလိူင်ႈမၼ်း",
+       "tooltip-minoredit": "မၢႆဢၼ်ၼႆႉၼင်ႇ လွင်ႈမႄးထတ်း ဢိတ်းဢီႈ",
        "tooltip-save": "ၵဵပ်းသိမ်း လွင်ႈလႅၵ်ႈလၢႆႈ",
+       "tooltip-publish": "ပိုတ်ႇဢွၵ်ႇ လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ",
        "tooltip-preview": "လူင်ႈၼႃႈတူၺ်း လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ၊ ၶႅၼ်းတေႃႈၸႂ်ႉပၼ် မိူဝ်ႈပႆႇသိမ်း",
        "tooltip-diff": "ၼႄပၼ် လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းၵႂႃႇတီႈ တူဝ်လိၵ်ႈ",
-       "tooltip-rollback": "\"ႁူၼ်လင်ၶိုၼ်း\" ၼႆႉ မၼ်းတေဢဝ် ၼႃႈလိၵ်ႈၼႆႉ ၶိုၼ်းပိၼ်ႇဝၢႆႇၸူး ၸွမ်းၼင်ႇ ၽူႈႁူမ်ႈသၢင်ႈ ၵေႃႉလိုၼ်းသုတ်းၼၼ်ႉ ထတ်းသၢင်မႃး။",
+       "tooltip-compareselectedversions": "တူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ လွင်ႈၶူၼ်ႉဢၢၼ်ႇသွင်ဢၼ် ဢၼ်လိူၵ်ႈဝႆႉ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-watch": "ဢဝ်ၼႃႈလိၵ်ႈၼႆႉ သႂ်ႇၼႂ်းသဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "tooltip-watchlistedit-normal-submit": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ",
+       "tooltip-watchlistedit-raw-submit": "ဢၢပ်ႉတိတ်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "tooltip-recreate": "ႁူမ်ႈဝႃႈ မၼ်းထုၵ်ႇမွတ်ႇပႅတ်ႈယဝ်ႉၵေႃႈ ၶိုၼ်းၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "tooltip-upload": "တႄႇလူတ်ႇၶိုၼ်ႈ",
+       "tooltip-rollback": "\"ႁူၼ်လင်ၶိုၼ်း\" ၼႆႉ မၼ်းတေဢဝ် ၼႃႈလိၵ်ႈၼႆႉ ပိၼ်ႈၶိုၼ်းၸူး ၸွမ်းၼင်ႇ ၽူႈႁူမ်ႈသၢင်ႈ ၵေႃႉလိုၼ်းသုတ်းၼၼ်ႉ မႄးထတ်းမႃး။",
        "tooltip-undo": "\"Undo\" ၼႆ့ မၼ်းတေဢဝ် ၵၢၼ်ထတ်းသၢင်ဢၼ်ၼႆႉ ၶိုၼ်းပိၼ်ႇၸူးသေ ၶိုၼ်းပၼ် ပၼ် လၢႆးတူၺ်းလူင်ႈၼႃႈ တႃႇၵၢၼ်ထတ်းသၢင်ႈဢၼ်ၼႆႉ။ မၼ်းတေႁဵတ်းႁႂ်ႈၸဝ်ႈၵဝ်ႇ ထႅမ်သႂ်ႇ လွင်ႈတၢင်းမၼ်း ၵႃႈတီႈ လွၵ်းႁူဝ်ႁုပ်ႇမၼ်းၼၼ်ႉယူႇ။",
+       "tooltip-preferences-save": "သိမ်း ငဝ်ႈၵုမ်းပိူင်",
        "tooltip-summary": "ထႅမ်သႂ်ႇ ၶေႃႈသပ်းလႅင်း ဢၼ်ၵႅပ်ႈ",
+       "anonymous": "{{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ ၶွင် {{SITENAME}}",
+       "siteuser": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း $1",
+       "anonuser": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ $1",
+       "lastmodifiedatby": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇ $3 ၵေႃႉမူၼ်ႉမႄးဝႆႉမိူဝ်ႈ $2, $1။",
+       "spam_reverting": "လွင်ႈပိၼ်ႈၶိုၼ်း လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်းၼၼ်ႉ မၼ်းဢမ်ႇၶဝ်ႈပႃးဝႆႉ ႁဵင်းၵွင်ႉ ဢၼ်ၵွင်ႉၸူး $1",
        "simpleantispam-label": "ၵူတ်ႇထတ်း Anti-spam.\n<strong>ယႃႇပေ</strong>ထႅမ်ဢၼ်ၼႆႉသႂ်ႇ!",
+       "pageinfo-header-basic": "�လွၼ်ႉၶၢဝ်ႈ ပိုၼ်ႉထၢၼ်",
+       "pageinfo-header-edits": "ပိုၼ်းမႄးထတ်း",
+       "pageinfo-header-restrictions": "လွင်ႈႁႄႉၵင်ႈၼႃႈလိၵ်ႈ",
+       "pageinfo-header-properties": "ၼမ်ႉၸႂ်ႉ ၼႃႈလိၵ်ႈ",
+       "pageinfo-display-title": "ဢွၵ်ႇၼႄ ႁူဝ်ၶေႃႈ",
+       "pageinfo-default-sort": "​သေႃးၸႅၼ်ႇ ပိူင်ၵႅဝ်ႈ",
+       "pageinfo-length": "တၢင်းယၢဝ်း ၼႃႈလိၵ်ႈ (ၼင်ႇ bytes)",
+       "pageinfo-article-id": "မၢႆၽၢင် ၼႃႈလိၵ်ႈ",
+       "pageinfo-language": "ၽႃႇသႃႇ လမ်းၼႂ်း ၼႃႈလိၵ်ႈ",
+       "pageinfo-language-change": "လႅၵ်ႈလၢႆႈ",
+       "pageinfo-content-model": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၼႃႈလိၵ်ႈ",
+       "pageinfo-content-model-change": "လႅၵ်ႈလၢႆႈ",
+       "pageinfo-robot-index": "ၶႂၢင်းပၼ်ဝႆႉ",
+       "pageinfo-robot-noindex": "ဢမ်ႇၶႂၢင်းပၼ်ဝႆႉ",
+       "pageinfo-watchers": "တၢင်းၼမ် ၽူႈတူၺ်းၼႃႈလိၵ်ႈ",
+       "pageinfo-visiting-watchers": "တၢင်းၼမ်ၽူႈၶဝ်ႈတူၺ်း ၼႃႈလိၵ်ႈ ၵေႃႉဢၼ် တိုၵ်ႉႁႃၶဝ်ႈဢႅဝ်တီႈ လွင်ႈမႄးထတ်း ၸိူဝ်းပႆႇပေႃးႁိုင်",
+       "pageinfo-few-watchers": "ဢေႇလိူဝ်သေ $1 {{PLURAL:$1|ၽူႈၶဝ်ႈတူၺ်း}}",
+       "pageinfo-firstuser": "ၽူႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "pageinfo-firsttime": "ဝၼ်းထီႉ လွင်ႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "pageinfo-lastuser": "ၽူႈမႄးထတ်း ၵေႃႉလိုၼ်းသုတ်း",
+       "pageinfo-lasttime": "ဝၼ်းထီႉ လွင်ႈမႄးထတ်း လိုၼ်းသုတ်း",
+       "pageinfo-edits": "ႁူဝ်ႁုပ်ႈတၢင်းၼမ် လွင်ႈမႄးထတ်း",
+       "pageinfo-authors": "ႁူဝ်ႁုပ်ႈတၢင်းၼမ် ၽူႈတႅမ်ႈလိၵ်ႈ ပႅၵ်ႇပိူင်ႈ",
+       "pageinfo-recent-edits": "တၢင်းၼမ်လွင်ႈမႄးထတ်း ၸိူဝ်းပႆႇပေႃးႁိုင် (တီႈၼႂ်း ၶၢဝ်းပူၼ်ႉမႃး $1)",
+       "pageinfo-recent-authors": "တၢင်းၼမ် ၽူႈတႅမ်ႈလိၵ်ႈ ပႅၵ်ႇပိူင်ႈ ၸိူဝ်းဢၼ်ပႆႇပေႃးႁိုင်",
        "pageinfo-toolboxlink": "လွၼ်ႉၶၢဝ်ႇၼႃႈလိၵ်ႈ",
+       "pageinfo-redirectsto": "ဝိၼ်ႇၵႂႃႇၸူး",
+       "pageinfo-redirectsto-info": "လွၼ်ႉၶၢဝ်ႇ",
+       "pageinfo-contentpage": "ၼပ်ႉဢၢၼ်ႇဝႆႉၼင်ႇ ၼႃႈလိၵ်ႈလမ်းၼႂ်း",
+       "pageinfo-contentpage-yes": "ၸႂ်ႈယဝ်ႉ",
+       "pageinfo-protect-cascading": "လွင်ႈႁႄႉၵင်ႈၼႆႉ လႆႈလူင်းယူႇတီႈၼႆ",
+       "pageinfo-protect-cascading-yes": "ၸႂ်ႈယဝ်ႉ",
+       "pageinfo-protect-cascading-from": "လွင်ႈႁႄႉၵင်ႈၼႆႉ လႆလူင်းယူႇတီႈၼႆႈ",
+       "pageinfo-category-info": "လွၼ်ႉၶၢဝ်ႇ ထၢၼ်ႈၵၼ်",
+       "pageinfo-category-total": "တၢင်းၼမ် ၽူႈၶဝ်ႈၸုမ်း",
+       "pageinfo-category-pages": "တၢင်းၼမ်ၼႃႈလိၵ်ႈ",
+       "pageinfo-category-subcats": "တၢင်းၼမ် ထၢၼ်ႈၵၼ်ၽႄ",
+       "pageinfo-category-files": "တၢင်းၼမ်ၾၢႆႇ",
+       "pageinfo-user-id": "မၢႆတူဝ် ၽူႈၸႂ်ႉတိုဝ်း",
+       "markaspatrolleddiff": "မၢႆဝႆႉၼင်ႇ ပႂ်ႉယၢမ်း",
+       "markaspatrolledtext": "မၢႆဝႆႉၼႃႈလိၵ်ႈၼင်ႇ ပႂ်ႉယၢမ်း",
+       "markedaspatrolled": "မၢႆဝႆႉၼင်ႇ ပႂ်ႉယၢမ်း",
        "previousdiff": "ၵၢၼ်မႄးထတ်း ဢၼ်ၵဝ်ႇ",
        "nextdiff": "ထတ်းသၢင်ႈဢၼ်မႂ်ႇမႂ်ႇ",
        "file-info-size": "$1 × $2 pixels, တၢင်းလဵၵ်ႉတၢင်းယႂ်ႇ ၾၢႆႇ: $3, ယိူင်ႈ MIME: $4",
        "show-big-image-preview": "သႅၼ်းတႃႇတူၺ်းလူင်ႈၼႃႈ: $1.",
        "show-big-image-other": " {{PLURAL:$2|resolution|resolutions}}: $1 တၢင်ႇဢၼ်",
        "show-big-image-size": "$1 × $2 ၽိၵ်ႉသိူဝ်ႇ",
+       "ilsubmit": "ၶူၼ်ႉႁႃ",
+       "bydate": "ၼင်ႇ ဝၼ်းထီႉ",
+       "sp-newimages-showfrom": "ၼႄ ၾၢႆႇဢၼ်မႂ်ႇ ၸိူဝ်းတႄႇ မႃးမိူဝ်ႈ $2, $1",
+       "seconds": "{{PLURAL:$1|$1 ၶိတ်ႇ}}",
+       "minutes": "{{PLURAL:$1|$1 မဵတ်ႉ}}",
+       "hours": "{{PLURAL:$1|$1 မူင်း}}",
+       "days": "{{PLURAL:$1|$1 ဝၼ်း}}",
+       "weeks": "{{PLURAL:$1|$1 ဝူင်ႈ}}",
+       "months": "{{PLURAL:$1|$1 လိူၼ်}}",
+       "years": "{{PLURAL:$1|$1 ပီ}}",
+       "ago": "ပူၼ်ႉမႃး $1",
+       "just-now": "တိုၵ်ႉႁႃယၢမ်းလဵဝ်",
+       "hours-ago": "မိူဝ်ႈပူၼ်ႉမႃႈ $1 {{PLURAL:$1|မူင်း}}",
+       "minutes-ago": "မိူဝ်ႈပူၼ်ႉမႃး $1 {{PLURAL:$1|မဵတ်ႉ}}",
+       "seconds-ago": "မိူဝ်ႈပူၼ်ႉမႃး $1 {{PLURAL:$1|ၶိတ်ႇ}}",
+       "monday-at": "ဝၼ်းၸၼ် မိူဝ်ႈ $1",
+       "tuesday-at": "ဢၢင်းၵၢင်း မိူဝ်ႈ $1",
+       "wednesday-at": "ဝၼ်းပုတ်ႉ မိူဝ်ႈ $1",
+       "thursday-at": "ဝၼ်းၽတ်း မိူဝ်ႈ $1",
+       "friday-at": "ဝၼ်းသုၵ်း မိူဝ်ႈ $1",
+       "saturday-at": "ဝၼ်းသဝ် မိူဝ်ႈ $1",
+       "sunday-at": "ဝၼ်းဢႃးတိတ်ႉ မိူဝ်ႈ $1",
+       "yesterday-at": "မိူဝ်ႈဝႃး မိူဝ်ႈ $1",
        "metadata": "ၶေႃႈမုၼ်းၼႅပ်ႇ",
        "metadata-help": "ၾၢႆႇဢၼ်ၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉလွၼ်ႉၶၢဝ်ႇ ထႅမ်သႂ်ႇမႂ်ႇ၊ ဢၼ်ဢၢပ်ႈထုၵ်ႉတီႈ ၵွင်ႈထႆႇ digital ဢမ်ႇၼၼ် တူဝ်ၵူတ်ႇ scanner ​ထႅမ်သႂ်ႇသေ သၢင်ႈဝႆႉ ဢမ်ႇၼၼ် လႅၵ်ႈလၢႆႈဝႆႉ။\nသင်ၸိူဝ်ႉၾၢႆႇဢၼ်ၼႆႉ ထုၵ်ႇမႄးၶိုၼ်းဝႆႉၵႃႈတီႈ ၾၢႆႇငဝ်ႈတိုၼ်းမၼ်းၼႆ ၼႂ်းၵႃႈ ၸဝ်ႈၵဝ်ႇမႄးဝႆႉၼၼ်ႉ မၼ်းတေဢမ်ႇထၢင်ႇႁၢင်ႈလႆႈ ၵူႈလွင်ႈ။",
        "metadata-fields": "ၸိူဝ်းပဵၼ် လွၵ်းၶေႃႈမုၼ်းႁူဝ်ယွႆႈ တႃႇၶႅပ်းႁၢင်ႈ ဢၼ်မီးဝႆႉတီႈၼႂ်း ၶေႃႈၶၢဝ်ႇပွတ်း message ၼႆႉၼႆ မၼ်းတေၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈ ၼႃႈလိၵ်ႈၶႅပ်းႁၢင်ႈ ဢၼ်တေၼႄပၼ် ၽွင်းမိူဝ်ႈ လွၵ်းၶေႃႈမုၼ်းႁူဝ်ယွႆႈ လၼ်ႇၼႄပၼ်။\nဢၼ်ၵိုတ်းလိူဝ်ၸိူဝ်းၼၼ်ႉတႄႉ တေထုၵ်ႇလပ်ႉဝႆႉ ၸွမ်းၼင်ႇ ပိူင်ၵႅဝ်ႈမၼ်း။\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-datetimeoriginal": "ဝၼ်းလႄႈၶၢဝ်းယၢမ်း တမ်ႈတီႈ ၶေႃႈမုၼ်းမႂ်ႇ",
        "exif-datetimedigitized": "ဝၼ်းထီႉလႄႈ ၶၢဝ်းယၢမ်းတႃႇ digitizing",
        "exif-orientation-1": "သႃမၺ်း",
+       "exif-exposureprogram-1": "မိုဝ်းႁဵတ်း",
+       "exif-dc-contributor": "ၽူႈၶဝ်ႈႁူမ်ႈ",
        "namespacesall": "တင်းမူတ်း",
        "monthsall": "တင်းမူတ်း",
+       "confirm-rollback-top": "တေပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ၼႃႈလိၵ်ႈဢၼ်ၼႆႉၼႄႇ?",
+       "watchlistedit-normal-title": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistedit-normal-legend": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ တမ်ႈတီႈ သဵၼ်ႈမၢႆမႂ်ႉတူၺ်း",
+       "watchlistedit-normal-submit": "ထွၼ်ပႅတ်ႈ ႁူဝ်ၶေႃႈ",
        "watchlistedit-normal-done": "{{PLURAL:$1|A single title was|$1 titles were}} ဢဝ်ဢွၵ်ႇ တမ်ႈတီႈ သဵၼ်ႈဢၼ်ၸဝ်ႈၵဝ်ႇ ပႂ်ႉတူၺ်း",
+       "watchlistedit-raw-title": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းပိူင်လိူင်း",
+       "watchlistedit-raw-legend": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းပိူင်လိူင်း",
+       "watchlistedit-raw-titles": "ႁူဝ်ၶေႃႈ :",
+       "watchlistedit-raw-submit": "ဢၢပ်ႉတိတ်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistedit-raw-done": "သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းဢၢပ်ႉတိတ်ႉယဝ်ႉယဝ်ႈ",
+       "watchlistedit-raw-added": "{{PLURAL:$1|1 ႁူဝ်ၶေႃႈ ထုၵ်ႇ}} ထႅမ်သႂ်ႇဝႆႉ:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|1 ႁူဝ်ၶေႃႈထုၵ်ႇ}} ထွၼ်ပႅတ်ႈဝႆႉ:",
+       "watchlistedit-clear-title": "လၢင်ႉပႅတ်ႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistedit-clear-legend": "လၢင်ႉပႅတ်ႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlistedit-clear-explain": "ႁူဝ်ၶေႃႈ တင်းသဵင်ႈၸိူဝ်းၼႆႉ တေထုၵ်ႇထွၼ်ပႅတ်ႈ ၵႃႈတီႈ သဵၼ်ႈမၢႆတူၺ်း ၸဝ်ႈၵဝ်ႇ",
+       "watchlistedit-clear-titles": "ႁူဝ်ၶေႃႈ :",
+       "watchlistedit-clear-submit": "လၢင်ႉပႅတ်ႈ ​သဵၼ်ႈမၢႆတူၺ်း (ဢၼ်ၼႆႉပဵၼ် ၶေႃႈၵိုၵ်း)",
+       "watchlistedit-clear-done": "သဵၼ်ႈမၢႆတူၺ်း ၸဝ်ႈၵဝ်ႇ ၽဵဝ်ႈလၢင်ႉယဝ်ႉယဝ်ႈ။",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 ႁူဝ်ၶေႃႈ ထုၵ်ႇ}} ထွၼ်ပႅတ်ႈယဝ်ႉ:",
+       "watchlistedit-too-many": "တီႈၼႆႈၼႆႉ မီးၼႃႈလိၵ်ႈၼမ်ၼႃ တွၼ်ႈတႃႇတေဢွၵ်ႇၼႄ။",
+       "watchlisttools-clear": "လၢင်ႉပႅတ်ႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watchlisttools-view": "တူၺ်း ၸိူဝ်းလႅၵ်ႈလၢႆႈ ဢၼ်သၢင်ႇထုၵ်ႇ",
+       "watchlisttools-edit": "တူၺ်း လႄႈ မႄးထတ်း သဵၼ်ႈမၢႆတူၺ်း",
+       "watchlisttools-raw": "မႄးထတ်း သဵၼ်ႈမၢႆတူၺ်း ပိူင်လိူင်း",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "timezone-local": "လူဝ်ၵႂ်ႇ",
+       "version": "မၢႆဢွၵ်ႇ",
+       "version-extensions": "သၢႆလင် ၸိူဝ်းဢူၼ်းသႂ်ႇဝႆႉ�",
+       "version-skins": "ၽိဝ်ၼင် ၸိူဝ်းဢူၼ်းသႂ်ႇဝႆႉ�",
+       "version-specialpages": "�ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "specialpages": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "tag-filter": "ၶတ်းလိူၵ်ႈဢဝ်[[Special:Tags|Tag]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "logentry-newusers-create": "ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း $1 ၼႆႉ လႆႈ  {{GENDER:$2|ၵေႃႇသၢင်ႈယဝ်ႉ}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|လူတ်ႇၶိုၼ်ႈၵႂႃႇယဝ်ႉ}} $3",
        "searchsuggest-search": "ၶူၼ်ႉႁႃ {{SITENAME}}",
-       "mw-widgets-dateinput-no-date": "ပႆႇလိူၵ်ႈဝၼ်းယၢမ်း"
+       "mw-widgets-dateinput-no-date": "ပႆႇလိူၵ်ႈဝၼ်းယၢမ်း",
+       "revid": "ၶူၼ်ႉၶႆႈ $1",
+       "pageid": "မၢႆၽၢင် ၽိုၼ်လိၵ်ႈ $1"
 }
index 59a3ba6..13fa595 100644 (file)
        "passwordreset-emaildisabled": "විද්‍යුත්  තැපැල් පහසුකම මෙම විකි ය සඳහා අවලංගු කොට ඇත.",
        "passwordreset-username": "පරිශීලක නාමය:",
        "passwordreset-domain": "වසම:",
-       "passwordreset-capture": "ප්‍රතිපලදායක විද්‍යුත් තැපෑල නරඹනවාද?",
-       "passwordreset-capture-help": "ඔබ මෙම කොටුව සලකුණු කලොත්, විද්‍යුත් තැපෑලක් (තාවකාලික මුරපදය සමඟ) ඔබට සහ යවන පුද්ගලයට දිස්වනු ඇත.",
        "passwordreset-email": "විද්‍යුත්-තැපැල් ලිපිනය:",
        "passwordreset-emailtitle": "{{SITENAME}}යෙහි ගිණුම් තොරතුරු",
        "passwordreset-emailtext-ip": "කවුරුන්හෝ (බොහෝවිට ඔබ, $1 අන්තර්ජාල ලිපිනය භාවිතයෙන්) {{SITENAME}} ($4) සඳහා ඔබගේ ගිණුම් විස්තර සිහිකැඳවීමක් ඉල්ලා ඇත.  පහත පරිශීලක {{PLURAL:$3|ගිණුම|ගිණුම්}}\nමෙම විද්‍යුත් තැපැල් ලිපිනය හා සමගින් ආශ්‍රය වෙයි.\n\n$2\n\n{{PLURAL:$3|මෙම තාවකාලික මුරපදය|මෙම තාවකාලික මුරපද}} {{PLURAL:$5|එක් දිනයක්|දින $5 ක්}} ගෙවුනු විට ඉකුත් වනු ඇත.\nඔබ දැන් ප්‍රවිෂ්ට වී නව මුරපදයක් තෝරාගත යුතුයි. වෙන යම් අයෙක් මෙම ඉල්ලීම කර ඇත්නම් හෝ, ඔබගේ මුල් මුරපදය ඔබගේ මතකයට පැමිණ ඇති නම් හා, එය වෙනස් කිරීමට ඔබ හට තවදුරටත් අවශ්‍ය නොවේ නම්, ඔබ විසින් මෙම පණිවුඩය නොසලකා හැර පැරණි මුරපදය තවදුරටත් පාවිච්චි කළ හැක.",
        "saveprefs": "සුරැකුම",
        "restoreprefs": "පෙරනිමි සැකසුම් සියල්ලම යළි-පිහිටුවන්න",
        "prefs-editing": "සංස්කරණය කිරීම්",
-       "rows": "පේළි:",
-       "columns": "තීරු:",
        "searchresultshead": "ගවේෂණය",
        "stub-threshold": "<a href=\"#\" class=\"stub\">කොට සබැඳි</a> ආකෘතිකරණය සඳහා සීමකය (බයිට්):",
        "stub-threshold-sample-link": "නියැදිය",
        "userrights-reason": "හේතුව:",
        "userrights-no-interwiki": "අනෙකුත් විකියන්හි පරිශීලක හිමිකම් සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
        "userrights-nodatabase": "$1 දත්ත-ගබඩාව නොපවතියි හෝ ස්ථානීක නොවෙයි.",
-       "userrights-nologin": "පරිශීලක හිමිකම් ප්‍රදානය කරනු වස්, ඔබ පරිපාලක ගිණුමකින්  [[Special:UserLogin|පුවිෂ්ට විය]] යුතුය.",
-       "userrights-notallowed": "පරිශීලක හිමිකම් එක් කිරීමට හෝ ඉවත් කිරීමට ඔබට අවසර නැත.",
        "userrights-changeable-col": "ඔබට වෙනස් කල හැකි කණ්ඩායම්",
        "userrights-unchangeable-col": "ඔබට වෙනස් කල නොහැකි කණ්ඩායම්",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "පරිශීලක හිමිකම් වෙනස්කම් ගැටුම්! සමාලෝචනය සහ ඔබේ වෙනස්කම් සනාථ කරන්න.",
-       "userrights-removed-self": "ඔබ සාර්ථකව ඔබේ ම හිමිකම් ඉවත් කර ඇත. ඒ නිසා, ඔබ තවදුරටත් මෙම පිටුව වෙත පිවිසිය හැකි ය.",
        "group": "කණ්ඩායම:",
        "group-user": "පරිශීලකයෝ",
        "group-autoconfirmed": "ස්වයංක්‍රීයව-චිරස්ථිතවූ පරිශීලකයෝ",
        "right-siteadmin": "දත්ත-ගබඩාව අවුරන්න හා ඇවුරුම ඉවත් කරන්න",
        "right-override-export-depth": "5වන මට්ටම දක්වා සබැඳි පිටු ද සහිතව පිටු නිර්යාත කරන්න",
        "right-sendemail": "අනෙක් පරිශීලකයන්ට ඊ-ලිපි යවන්න",
-       "right-passwordreset": "මුරපද යලි සැකසීම් විද්‍යුත් තැපෑලයන් නරඹන්න",
        "right-managechangetags": "දත්ත සමුදාය සිට [[Special:Tags|ඇමුණුම්]] නිර්මාණය කර මකා",
        "right-applychangetags": "ඉල්ලුම් කරන්න කෙනෙකුගේ වෙනස්කම් සමග, [[Special:Tags|ඇමිණුම්]]",
        "right-changetags": "තනි තනි අනුවාදයන් සහ ලඝු සටහන් ඇතුළත් කිරීම් මත අත්තනෝමතික [[Special:Tags|ඇමිණුම්]] එකතු හෝ ඉවත්",
        "uploaddisabledtext": " {{SITENAME}} හි ගොනු උඩුගත කිරීම් අක්‍රීය කර ඇත.",
        "php-uploaddisabledtext": "PHP හි ගොනු උඩුගතකිරීම් අක්‍රීය කොට ඇත.\nකරුණාකර  ගොනු_උඩුගතකිරීම් පරිස්ථිතිය පරික්ෂා කර බලන්න.",
        "uploadscripted": "වෙබ් බ්‍රවුසරයක් මගින් සාවද්‍ය ලෙස අර්ථ පැහැදිය හැකි HTML හෝ ලේඛන ක්‍රම තේතයක් මෙම ගොනුවේ අඩංගු වේ.",
-       "uploadscriptednamespace": "මෙම SVG ගොනුව නීති විරෝධී නාම අවකාශය ටැග පෙරහන: \"$1\" අඩංගු වේ.",
+       "uploadscriptednamespace": "මෙම SVG ගොනුව නීති විරෝධී නාම අවකාශය ටැග පෙරහන: \"<nowiki>$1</nowiki>\" අඩංගු වේ.",
        "uploadinvalidxml": "උඩුගත දී මෙම XML කියවූ කළ නොහැකි විය.",
        "uploadvirus": "මෙම ගොනුවෙහි වයිරසයක් අඩංගුය! විස්තර: $1",
        "uploadjava": "මෙය ZIP ගොනුවක් වන අතර ජාවා .class ගොනු අඩංගු වෙයි.\nජාවා ගොනු උඩුගත කිරීම සදහා අවසර ලබා නොදේ, මන්ද ඒවා ආරක්ෂිත අවහිරතා මගහැර යාමට හේතු විය හැක.",
        "sp-contributions-search": "දායකත්ව පිළිබඳ ගවේෂණය කරන්න",
        "sp-contributions-username": "පරිශීලක නාමය හෝ IP ලිපිනය:",
        "sp-contributions-toponly": "නවතම අනුවාදයන් වන සංස්කරණයන් පමණක් පෙන්වයි",
+       "sp-contributions-newonly": "පිටු නිර්මාණය කිරීම් වන සංස්කරණ පමණක් පෙන්වන්න",
        "sp-contributions-submit": "සොයන්න",
        "whatlinkshere": "මෙතනට සබැඳෙන්නේ කුමක්ද",
        "whatlinkshere-title": "\"$1\" වෙත සබැ‍ඳෙන පිටු",
        "feedback-useragent": "පරිශීලක නියෝජිත:",
        "searchsuggest-search": "ගවේශණය කරන්න",
        "searchsuggest-containing": "ඇතුළත් වෙමින් පවතී...",
-       "api-error-badaccess-groups": "මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.",
        "api-error-badtoken": "අභ්‍යන්තර දෝෂය: නොසුදුසු ටෝකනය.",
-       "api-error-copyuploaddisabled": "URL මඟින් උඩුගතකිරීම මෙම සර්වරයේදී අක්‍රීය කොට තිබේ.",
-       "api-error-duplicate": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|වෙනත් ගොනු $2 ක්|වෙනත් ගොනු $2 ක්}} අඩවිය තුල දැනටමත් පවතියි.",
-       "api-error-duplicate-archive": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|වෙනත් ගොනු ක්|වෙනත් ගොනු ක්}} අඩවිය තුල දැනටමත් තිබුනා, නමුත්  {{PLURAL:$1|ඒක|ඒවා}} මකා දමා ඇත.",
-       "api-error-empty-file": "ඔබ ඉදිරිපත්කල ගොනුව හිස් එකකි.",
        "api-error-emptypage": "නවතම එකක් තනමින්, හිස් පිටුවලට ඉඩ නොදේ.",
-       "api-error-fetchfileerror": "අභ්‍යන්තර දෝෂය: ගොනුව පැමිණවීම අතරතුරදී කුමක්දෝ වැරදුණා.",
-       "api-error-file-too-large": "ඔබ විසින් යොමන ලද ගොනුව පමණට වඩා විශෘලය.",
-       "api-error-filename-tooshort": "ගොනු නාමය කෙටි වැඩියි.",
-       "api-error-filetype-banned": "මෙම වර්ගයේ ගොනු තහනම් කර ඇත.",
-       "api-error-filetype-banned-type": "$1 යනු {{PLURAL:$4|අවසරලත් ගොනු වර්ගයක්|අවසරලත් ගොනු වර්ගයන්}} නොවේ. අවසරලත්  {{PLURAL:$3|ගොනු වර්ගය|ගොනු වර්ගයන්}} වන්නේ  $2.",
-       "api-error-filetype-missing": "මෙම ගොනුවට විස්තීරණය මග හරි ඇත.",
-       "api-error-hookaborted": "ඔබ සිදු කරන්නට ගිය වෙනස්කම විස්තීර්ණ කොක්කක් මඟින් රෝධනය කරන ලදී.",
-       "api-error-http": "අභ්‍යන්තර දෝෂය: සර්වරය වෙත සම්බන්ධ විය නොහැක.",
-       "api-error-illegal-filename": "ගොනුනාමයට ඉඩ දෙනු නොලැබේ.",
-       "api-error-internal-error": "අභ්‍යන්තර දෝෂය: ඔබේ උඩුගත කිරීම විකියේදී ක්‍රියානනය කිරීමේදී කුමක්දෝ වැරදුණා.",
-       "api-error-invalid-file-key": "අභ්‍යන්තර දෝෂය: තාවකාලික භාවිතයේ ගොනුව හමුනොවුණි.",
-       "api-error-missingparam": "අභ්‍යන්තර දෝෂය: අයදුමෙහි මගහැරුණු පරාමිතීන්.",
-       "api-error-missingresult": "අභ්‍යන්තර දෝෂය: පිටපත් කිරීම සාර්ථකදැයි නිර්ණය කල නොහැක.",
-       "api-error-mustbeloggedin": "ගොනු උඩුගත කිරීම සඳහා ඔබ ප්‍රවිෂ්ට වී තිබිය යුතුයි.",
-       "api-error-mustbeposted": "අභ්‍යන්තර දෝෂය: අයදුම සඳහා HTTP POST අවශ්‍යයි.",
-       "api-error-noimageinfo": "සාර්ථකව උඩුගත කරන ලදී, නමුත් ගොනුව පිලිබඳ කිසිම තොරතුරක් සර්වරය අප වෙත ලබා දී නොමැත.",
-       "api-error-nomodule": "අභ්‍යන්තර දෝෂය: උඩුගත කෙරුම් මොඩියුලයන් සකසා නොමැත.",
-       "api-error-ok-but-empty": "අභ්‍යන්තර දෝෂය: සර්වරයෙන් ප්‍රතිචාරයක් නොමැත.",
-       "api-error-overwrite": "දැනටමත් තිබෙන ගොනුවක් යටපත් කෙරුමට ඉඩදෙනු නොලැබේ.",
        "api-error-stashfailed": "අභ්‍යන්තර දෝෂය: තාවකාලික ගොනුව සුරක්ෂිත කිරීමට සර්වරයට නොහැකි වුනි.",
-       "api-error-timeout": "බලාපොරොත්තු වූ කාලය තුල ස\"වරය ප්‍රතිචාර නොදක්වන ලදී.",
-       "api-error-unclassified": "හඳුනා නොගත් දෝෂයක් ඇතිවිය.",
-       "api-error-unknown-code": "නොදත් දෝෂය: \"$1\"",
-       "api-error-unknown-error": "අභ්‍යන්තර දෝෂය: ඔබ මෙම ගොනුව උඩුගත කිරීමට තැත් කිරීමේදී කුමක්දෝ වැරදුණා.",
        "api-error-unknown-warning": "නොදත් අවවාදය: $1",
        "api-error-unknownerror": "හඳුනාගත නොහැකි දෝෂය: \"$1\".",
-       "api-error-uploaddisabled": "මෙම විකියෙහි උඩුගතකිරීම අක්‍රිය කොට ඇත.",
-       "api-error-verification-error": "මෙම ගොනුව පළුදුවී හෝ එයට වැරදි විස්තිර්ණයක් (extension) ඇතුවා වියහැක.",
        "duration-seconds": "{{PLURAL:$1|තත්පර|තත්පර}} $1 ක්",
        "duration-minutes": "{{PLURAL:$1|මිනිත්තු|මිනිත්තු}} $1 ක්",
        "duration-hours": "{{PLURAL:$1|පැය|පැය}} $1 ක්",
index c8103b6..e16e746 100644 (file)
@@ -34,7 +34,8 @@
                        "Mikulas1",
                        "Hromoslav",
                        "Matma Rex",
-                       "LacoR"
+                       "LacoR",
+                       "Xð"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "unprotectthispage": "Zmeniť stav ochrany tejto stránky",
        "newpage": "Nová stránka",
        "talkpage": "Diskusia k stránke",
-       "talkpagelinktext": "Diskusia",
+       "talkpagelinktext": "diskusia",
        "specialpage": "Špeciálna stránka",
        "personaltools": "Osobné nástroje",
        "articlepage": "Zobraziť stránku",
        "saveprefs": "Uložiť nastavenia",
        "restoreprefs": "Obnoviť všetky predvolené nastavenia (vo všetkých sekciách)",
        "prefs-editing": "Úpravy",
-       "rows": "Riadky:",
-       "columns": "Stĺpce:",
        "searchresultshead": "Vyhľadávanie",
        "stub-threshold": "Prah formátovania odkazu ako výhonok ($1):",
        "stub-threshold-sample-link": "príklad",
        "feedback-useragent": "Prehliadač:",
        "searchsuggest-search": "Hľadať",
        "searchsuggest-containing": "obsahuje...",
-       "api-error-autoblocked": "Vaše IP adresa bola automaticky zablokovaná, pretože ju používal zablokovaný používateľ.",
-       "api-error-badaccess-groups": "Nemáte oprávnenie nahrávať súbory na tejto wiki.",
        "api-error-badtoken": "Vnútorná chyba: Zlý token.",
-       "api-error-blocked": "Možnosť editovať vám bola zablokovaná.",
-       "api-error-copyuploaddisabled": "Nahrávanie z URL je na tomto serveri zakázané.",
-       "api-error-duplicate": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existujú",
-       "api-error-duplicate-archive": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.",
-       "api-error-empty-file": "Súbor, ktorý ste poslali bol prázdny.",
        "api-error-emptypage": "Vytváranie nových, prázdnych stránok nie je dovolené.",
-       "api-error-fetchfileerror": "Vnútorná chyba: Niečo pokazilo počas sťahovania súboru.",
-       "api-error-fileexists-forbidden": "Súbor s názvom „$1“ už existuje a nie je možné prepísať ho.",
-       "api-error-fileexists-shared-forbidden": "Súbor s názvom „$1“ už neexistuje v repozitári zdieľaných súborov a nie je možné prepísať ho.",
-       "api-error-file-too-large": "Súbor, ktorý ste poslali bol príliš veľký.",
-       "api-error-filename-tooshort": "Názov súboru je príliš krátky.",
-       "api-error-filetype-banned": "Tento typ súboru je zakázaný.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nie je povolený typ súboru|nie sú povolené typy súboru}}. {{PLURAL:$3|Povolený typ súborov je|Povolené typy súborov sú}} $2.",
-       "api-error-filetype-missing": "Súboru chýba prípona.",
-       "api-error-hookaborted": "Zmena, ktorú ste sa pokúsili vykonať bola zrušená prípojným bodom rozšírenia.",
-       "api-error-http": "Vnútorná chyba: Nepodarilo sa pripojiť k serveru.",
-       "api-error-illegal-filename": "Názov súboru nie je povolený.",
-       "api-error-internal-error": "Vnútorná chyba: Niečo pokazilo pri spracovaní súboru, ktorý ste nahrávali na wiki.",
-       "api-error-invalid-file-key": "Vnútorná chyba: Súbor sa nenašiel v dočasnom úložisku.",
-       "api-error-missingparam": "Vnútorná chyba: Chýbajú parametre požiadavky.",
-       "api-error-missingresult": "Vnútorná chyba: Nepodarilo sa určiť, či kopírovanie prebehlo úspešne.",
-       "api-error-mustbeloggedin": "Aby ste mohli nahrávať súbory, musíte sa prihlásiť",
-       "api-error-mustbeposted": "Vnútorná chyba: Požiadavka vyžaduje HTTP POST.",
-       "api-error-noimageinfo": "Nahranie sa podarilo, ale server nám nedal žiadne informácie o súbore.",
-       "api-error-nomodule": "Vnútorná chyba: Nebol nastavený žiaden nahrávací modul.",
-       "api-error-ok-but-empty": "Vnútorná chyba: Žiadna odpoveď zo servera.",
-       "api-error-overwrite": "Prepísanie existujúceho súboru nie je povolené.",
-       "api-error-stashfailed": "Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.",
        "api-error-publishfailed": "Vnútorná chyba: Serveru sa nepodarilo publikovať dočasný súbor.",
-       "api-error-timeout": "Server neodpovedal v očakávanom čase.",
-       "api-error-unclassified": "Vyskytla sa neznáma chyba.",
-       "api-error-unknown-code": "Neznáma chyba: „$1“",
-       "api-error-unknown-error": "Vnútorná chyba: Niečo pokazilo pri pokuse nahrať váš súbor.",
+       "api-error-stashfailed": "Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.",
        "api-error-unknown-warning": "Neznáme upozornenie: $1",
        "api-error-unknownerror": "Neznáma chyba: „$1“",
-       "api-error-uploaddisabled": "Nahrávanie je na tejto wiki zakázané.",
-       "api-error-verification-error": "Tento súbor môže byť poškodený, alebo má zlú príponu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}",
        "duration-minutes": "$1 {{PLURAL:$1|minúta|minúty|minút}}",
        "duration-hours": "$1 {{PLURAL:$1|hodina|hodiny|hodín}}",
index d1e2cca..09e34ab 100644 (file)
@@ -13,7 +13,8 @@
                        "Skalcaa",
                        "Janezdrilc",
                        "Matma Rex",
-                       "NegativeTwelveDollars"
+                       "NegativeTwelveDollars",
+                       "Xð"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "unprotectthispage": "Spremeni zaščito strani",
        "newpage": "Nova stran",
        "talkpage": "Pogovorite se o strani",
-       "talkpagelinktext": "Pogovor",
+       "talkpagelinktext": "pogovor",
        "specialpage": "Posebna stran",
        "personaltools": "Osebna orodja",
        "articlepage": "Prikaže članek",
        "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev vseeno ustvarili.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
        "missingcommentheader": "<strong>Opozorilo:</strong> Niste vnesli zadeve za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez nje.",
-       "summary-preview": "Predogled povzetka",
+       "summary-preview": "Predogled povzetka urejanja:",
        "subject-preview": "Predogled zadeve:",
        "previewerrortext": "Med poskusom prikaza predogleda vaših sprememb je prišlo do napake.",
        "blockedtitle": "Uporabnik je blokiran",
        "search-interwiki-caption": "Sorodni projekti",
        "search-interwiki-default": "Rezultati s strani $1:",
        "search-interwiki-more": "(več)",
+       "search-interwiki-more-results": "več zadetkov",
        "search-relatedarticle": "Podobno",
        "searchrelated": "povezano",
        "searchall": "vse",
        "editusergroup": "Naloži uporabniške skupine",
        "editinguser": "Urejanje pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Ogledovanje uporabniških pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Urejanje uporabniških skupin",
-       "userrights-viewusergroup": "Ogled skupin uporabnikov",
+       "userrights-editusergroup": "Urejanje {{GENDER:$1|uporabnikovih|uporabničinih}} skupin",
+       "userrights-viewusergroup": "Ogled {{GENDER:$1|uporabnikovih|uporabničinih}} skupin",
        "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.",
+       "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-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-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "rcfilters-invalid-filter": "Neveljaven filter",
        "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
+       "rcfilters-highlightbutton-title": "Označi rezultate",
+       "rcfilters-highlightmenu-title": "Izberite barvo",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
        "rcfilters-filtergroup-registration": "Registracija uporabnika",
        "rcfilters-filter-registered-label": "Registriran",
        "uploaded-setting-handler-svg": "SVG, ki nastavi atribut »handler« z oddaljenim/podatkovnim/skriptom ciljem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, ki določi katerikoli slogovni atribut z oddaljenim URL-jem, je blokiran. V naloženi datoteki SVG smo našli <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "V naloženi datoteki SVG smo našli slikovni filter z URL-jem: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Datoteka SVG vsebuje nedovoljen imenski prostor »$1«",
+       "uploadscriptednamespace": "Datoteka SVG vsebuje nedovoljen imenski prostor »<nowiki>$1</nowiki>«",
        "uploadinvalidxml": "XML v naloženi datoteki ne moremo razčleniti.",
        "uploadvirus": "Datoteka vsebuje virus!\nPodrobnosti: $1",
        "uploadjava": "Datoteka je datoteka ZIP, ki vsebuje javansko datoteko .class.\nNalaganje javanskih datotek ni dovoljeno, ker je z njimi mogoče obiti varnostne omejitve.",
        "editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
        "revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
        "revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
+       "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
        "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
        "sessionfailure-title": "Neuspeh seje",
        "sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
        "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
        "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorijo ...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj več ...",
        "sessionmanager-tie": "Ne morem združiti več vrst overitvenih zahtev: $1.",
        "sessionprovider-generic": "sej $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sej, ki temeljijo na piškotkih",
index bc98608..9268049 100644 (file)
        "searcharticle": "Shko",
        "history": "Historiku i faqes",
        "history_short": "Historiku",
+       "history_small": "historiku",
        "updatedmarker": "përditësuar që nga vizita ime e fundit",
        "printableversion": "Versioni i printueshëm",
        "permalink": "Lidhje e përhershme",
        "nocookieslogin": "{{SITENAME}} shfrytëzon \"cookies\" për identifikimin e përdoruesve.\nYou nuk lejoni shfrytëzimin e \"cookies\".\nJu lutemi, lejoni shfrytëzimin e \"cookies\" dhe provojeni përsëri.",
        "nocookiesfornew": "Llogaria e përdoruesit nuk u krijua, pasi ne nuk mund të konfirmojmë burimin e tij.\nSigurohuni që ju lejoni shfrytëzimin e \"cookies\", rifreskoni këtë faqe dhe provojen përsëri.",
        "noname": "Nuk keni dhënë një emër përdoruesi të pranueshëm.",
-       "loginsuccesstitle": "Identifikim i suksesshëm",
+       "loginsuccesstitle": "I/e identifikuar",
        "loginsuccess": "'''Ju tani jeni identifikuar tek {{SITENAME}} si \"$1\".'''",
        "nosuchuser": "Nuk ka ndonjë përdorues me emrin \"$1\".\nKontrolloni shkrimin ose [[Special:CreateAccount|hapni një llogari të re]].",
        "nosuchusershort": "Nuk ka asnjë përdorues me emrin \"$1\".",
        "saveprefs": "Ruaj parapëlqimet",
        "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
        "prefs-editing": "Redaktimi",
-       "rows": "Rreshta:",
-       "columns": "Kollona:",
        "searchresultshead": "Kërkimi",
        "stub-threshold": "Kufiri për formatin e <a href=\"#\" class=\"stub\">lidhjeve cung</a> (B):",
        "stub-threshold-sample-link": "shembull",
        "feedback-thanks-title": "Ju faleminderit!",
        "searchsuggest-search": "Kërko",
        "searchsuggest-containing": "përmban ...",
-       "api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
        "api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
-       "api-error-copyuploaddisabled": "Ngarkimi nga URL-ja është çaktivizuar në këtë server.",
-       "api-error-duplicate": "{{PLURAL:$1|Ekziston një skedë tjetër|Ekzistojnë disa skeda të tjera}} me të njëjtën përmbajtje.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
-       "api-error-empty-file": "Skeda që paraqitët ishte bosh.",
        "api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
-       "api-error-fetchfileerror": "Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.",
-       "api-error-fileexists-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston dhe nuk mund të mbishkruhet.",
-       "api-error-fileexists-shared-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston në depon për skedarët e shpërndarë dhe nuk mund të mbishkruhet.",
-       "api-error-file-too-large": "Skeda që paraqitët ishte shumë e madhe.",
-       "api-error-filename-tooshort": "Emri i skedës është shumë i shkurtër.",
-       "api-error-filetype-banned": "Ky lloj i skedës është përjashtuar.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nuk është një lloj i skedës së lejuar|nuk janë lloje të lejuara të skedave}}. {{PLURAL:$3|Lloji i lejuar i skedës është|Llojet e lejuara të skedave janë}} $2.",
-       "api-error-filetype-missing": "Skedës i mungon një shtesë.",
-       "api-error-hookaborted": "Modifikimi që provuat të bëni u ndërpre nga një goditje shtese.",
-       "api-error-http": "Gabim i brendshëm: Nuk mund të lidhet me serverin.",
-       "api-error-illegal-filename": "Emri i skedës nuk lejohet.",
-       "api-error-internal-error": "Gabim i brendshëm: Diçka shkoi keq me procesimin e ngarkimit tuaj në wiki.",
-       "api-error-invalid-file-key": "Gabim i brendshëm: Skeda nuk u gjet në ruajtjen e përkohshme.",
-       "api-error-missingparam": "Gabim i brendshëm: Mungesë e parametrave në kërkesë.",
-       "api-error-missingresult": "Gabim i brendshëm: Nuk mund të përcaktohet nëse kopjimi doli me sukses.",
-       "api-error-mustbeloggedin": "Ju duhet të identifikoheni për të ngarkuar skeda.",
-       "api-error-mustbeposted": "Gabim i brendshëm: Kërkesa kërkon HTTP POST.",
-       "api-error-noimageinfo": "Ngarkimi u krye me sukses, por serveri nuk na dha ndonjë informacion për këtë skedë.",
-       "api-error-nomodule": "Gabim i brendshëm: Nuk ka modul ngarkimi të vendosur.",
-       "api-error-ok-but-empty": "Gabim i brendshëm: Nuk ka përgjigje nga serveri.",
-       "api-error-overwrite": "Mbishkrimi i një skede ekzistuese nuk lejohet.",
        "api-error-stashfailed": "Gabim i brendshëm: Serveri nuk arriti të ruajë skedën e përkohshme.",
-       "api-error-timeout": "Serveri nuk u përgjigj gjatës kohës që pritej.",
-       "api-error-unclassified": "Një gabim i panjohur ndodhi.",
-       "api-error-unknown-code": "Gabim i panjohur: \"$1\"",
-       "api-error-unknown-error": "Gabim i brendshëm: Diçka shkoi gabim kur provuat të ngarkoni skedën tuaj.",
        "api-error-unknown-warning": "Paralajmërim i panjohur: $1",
        "api-error-unknownerror": "Gabim i papërcaktuar: \"$1\".",
-       "api-error-uploaddisabled": "Ngarkimi është i çaktivizuar në këte wiki.",
-       "api-error-verification-error": "Skeda mund të jetë e korruptuar ose ka shtesë të gabuar.",
        "duration-seconds": "$1 {{PLURAL:$1|sekondë|sekonda}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutë|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|orë|orë}}",
index 6e457e0..9078ecf 100644 (file)
        "virus-scanfailed": "неуспешно скенирање (код $1)",
        "virus-unknownscanner": "непознати антивирус:",
        "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+       "cannotlogoutnow-title": "Одјава тренутно није могућа",
+       "cannotlogoutnow-text": "Одјава није могућа током употребе $1.",
        "welcomeuser": "Добро дошли, $1!",
        "welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
        "yourname": "Корисничко име:",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
        "externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.",
        "login": "Пријави ме",
-       "login-security": "Ð\92аеÑ\80иÑ\84икаÑ\86иÑ\98а Ð²Ð°Ñ\88ег Ð¸Ð½Ð´ÐµÐ½Ñ\82иÑ\82еÑ\82а",
+       "login-security": "Верификација вашег индентитета",
        "nav-login-createaccount": "Пријава/регистрација",
        "userlogin": "Пријава/регистрација",
        "userloginnocreate": "Пријава",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
        "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "botpasswords": "Лозинке ботова",
+       "botpasswords-disabled": "Лозинке ботова су онемогућене.",
        "botpasswords-label-appid": "Име бота:",
        "botpasswords-label-create": "Направи",
        "botpasswords-label-update": "Ажурирај",
        "hr_tip": "Водоравна линија (користити ретко)",
        "summary": "Опис измене:",
        "subject": "Тема:",
-       "minoredit": "мања измена",
-       "watchthis": "надгледај ову страницу",
+       "minoredit": "Ð\9eво Ñ\98е Ð¼Ð°Ñ\9aа Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "watchthis": "Ð\9dадгледај ову страницу",
        "savearticle": "Сачувај страницу",
        "savechanges": "Сачувај измене",
        "publishpage": "Објави страницу",
        "selfredirect": "<strong>Упозорење:</strong> преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница погрешна или уређујете погрешну страницу.\nАко још једном притиснете „{{int:savearticle}}“ преусмерење ће свеједно бити направљено.",
        "missingcommenttext": "Унесите коментар испод.",
        "missingcommentheader": "<strong>Напомена:</strong> нисте унели наслов овог коментара.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без наслова.",
-       "summary-preview": "Преглед описа:",
+       "summary-preview": "Преглед описа измене:",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
        "nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
        "editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
        "yourdiff": "Разлике",
-       "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
-       "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
+       "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
+       "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
        "editpage-cannot-use-custom-model": "Модел садржаја ове странице се не може променити.",
        "longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
        "readonlywarning": "<strong>Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.</strong>\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1",
        "last": "разл",
        "page_first": "прва",
        "page_last": "последња",
-       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> – разлика с тренутном изменом,\n<strong>({{int:last}})</strong> – разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> – мала измена",
+       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мала измена",
        "history-fieldset-title": "Преглед историје",
        "history-show-deleted": "Само обрисано",
        "histfirst": "најстарије",
        "difference-multipage": "(разлике између страница)",
        "lineno": "Ред $1:",
        "compareselectedversions": "Упореди изабране измене",
-       "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81акÑ\80иÑ\98 Ð¸Ð·Ð°Ð±Ñ\80ане Ð¸Ð·Ð¼ÐµÐ½Ðµ",
+       "showhideselectedversions": "Ð\9fÑ\80омени Ð²Ð¸Ð´Ñ\99ивоÑ\81Ñ\82 Ð¸Ð·Ð°Ð±Ñ\80аниÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð°",
        "editundo": "поништи",
        "diff-empty": "(Нема разлике)",
        "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника није приказано|$1 међуизмена истог корисника није приказано}})",
        "powersearch-legend": "Напредна претрага",
        "powersearch-ns": "Тражи у следећим именским просторима:",
        "powersearch-togglelabel": "Изабери:",
-       "powersearch-toggleall": "све",
-       "powersearch-togglenone": "ништа",
+       "powersearch-toggleall": "Све",
+       "powersearch-togglenone": "Ð\9dишта",
        "powersearch-remember": "Запамти мој избор за будуће претраге",
        "search-external": "Спољна претрага",
        "searchdisabled": "Претрага је онемогућена.\nУ међувремену можете тражити преко Гугла.\nУпамтите да његови пописи овог викија могу бити застарели.",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
        "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша надгледања; стога, кључ немојте одавати никоме. \nАко је потребно, кључ можете [[Special:ResetTokens|ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
-       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87ка Ð¿Ñ\80ава Ð·Ð° {{GENDER:$1|$1}} Ñ\81Ñ\83 Ñ\81аÑ\87Ñ\83вана.",
+       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87ке Ð³Ñ\80Ñ\83пе Ð·Ð° {{GENDER:$1|$1}} Ñ\81Ñ\83 Ñ\81аÑ\87Ñ\83ване.",
        "timezonelegend": "Временска зона:",
        "localtime": "Локално време:",
        "timezoneuseserverdefault": "подразумеване вредности ($1)",
        "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
        "userrights": "Управљање корисничким правима",
-       "userrights-lookup-user": "УпÑ\80авÑ\99аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\87ким Ð³Ñ\80Ñ\83пама",
+       "userrights-lookup-user": "Ð\98забеÑ\80и ÐºÐ¾Ñ\80иÑ\81ника",
        "userrights-user-editname": "Корисничко име:",
-       "editusergroup": "УÑ\80еди {{GENDER:$1|коÑ\80иÑ\81ниÑ\87ке}} групе",
+       "editusergroup": "УÑ\87иÑ\82аÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87ке групе",
        "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Промена корисничких група",
-       "userrights-viewusergroup": "Преглед корисничких група",
+       "userrights-editusergroup": "Промена {{GENDER:$1|корисничких}} група",
+       "userrights-viewusergroup": "Преглед {{GENDER:$1|корисничких}} група",
        "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": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
        "action-upload_by_url": "отпремање ове датотеке преко веб-адресе",
        "action-writeapi": "писање АПИ-ја",
        "action-delete": "брисање ове странице",
-       "action-deleterevision": "бÑ\80иÑ\81аÑ\9aе Ð¾Ð²Ðµ Ð¸Ð·Ð¼ÐµÐ½Ðµ",
-       "action-deletedhistory": "прегледање обрисане историје ове странице",
+       "action-deleterevision": "бÑ\80иÑ\81аÑ\9aе Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "action-deletedhistory": "прегледање обрисане историје странице",
        "action-browsearchive": "претраживање обрисаних страница",
-       "action-undelete": "враћање ове странице",
-       "action-suppressrevision": "прегледање и враћање ове сакривене измене",
+       "action-undelete": "враћање страница",
+       "action-suppressrevision": "прегледање и враћање сакривених измена",
        "action-suppressionlog": "прегледање ове приватне историје",
        "action-block": "блокирање даљих измена овог корисника",
        "action-protect": "мењање степена заштите ове странице",
        "hist": "ист",
        "hide": "Сакриј",
        "show": "Прикажи",
-       "minoreditletter": " м",
+       "minoreditletter": "м",
        "newpageletter": "Н",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "recentchangeslinked-page": "Назив странице:",
        "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом",
        "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су додате у категорију",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] је додана у категорију, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су уклоњене из категорије",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "autochange-username": "Медијавики аутоматска измена",
        "upload": "Отпреми датотеку",
        "uploadbtn": "Отпреми датотеку",
        "uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
        "uploaded-href-unsafe-target-svg": "Пронађен href са несигурном метом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
-       "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „$1“",
+       "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
        "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
        "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
        "upload-source": "Изворна датотека",
        "backend-fail-hashes": "Не могу да добијем дисперзије датотеке за упоређивање.",
        "backend-fail-notsame": "Већ постоји неистоветна датотека – $1.",
        "backend-fail-invalidpath": "$1 није исправна путања за складиштење.",
-       "backend-fail-delete": "Не могу да обришем датотеку $1.",
+       "backend-fail-delete": "Не могу да обришем датотеку „$1”.",
        "backend-fail-describe": "Не могу да променим метаподатке за датотеку „$1“.",
        "backend-fail-alreadyexists": "Датотека $1 већ постоји.",
        "backend-fail-store": "Не могу да сместим датотеку $1 у $2.",
        "booksources-search": "Претражи",
        "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
        "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
+       "magiclink-tracking-isbn": "Странице са ISBN магичним везама",
        "specialloguserlabel": "Извршилац:",
        "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
        "all-logs-page": "Сви јавни дневници",
        "alllogstext": "Скупни приказ свих доступних историја овог викија.\nМожете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.",
        "logempty": "Нема пронађених уноса у дневнику.",
-       "log-title-wildcard": "ТÑ\80ажи Ð½Ð°Ñ\81лове ÐºÐ¾Ñ\98и Ð¿Ð¾Ñ\87иÑ\9aÑ\83 Ñ\81 овим текстом",
+       "log-title-wildcard": "Ð\9fÑ\80еÑ\82Ñ\80ажи Ð½Ð°Ñ\81лове ÐºÐ¾Ñ\98и Ð¿Ð¾Ñ\87иÑ\9aÑ\83 Ñ\81а овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје",
        "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима",
        "checkbox-select": "Изабери: $1",
-       "checkbox-all": "све",
-       "checkbox-none": "ништа",
-       "checkbox-invert": "обрни",
+       "checkbox-all": "Све",
+       "checkbox-none": "Ð\9dишта",
+       "checkbox-invert": "Ð\9eбрни",
        "allpages": "Све странице",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "emailccsubject": "Копија ваше поруке кориснику $1: $2",
        "emailsent": "Имејл је послат",
        "emailsenttext": "Ваша имејл порука је послата.",
-       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
+       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}. Ако одговорите на овај имејл, {{GENDER:$2|Ваш}} имејл ће бити непосредно прослеђен ка {{GENDER:$1|првобитном пошиљаоцу}}, чиме ће те {{GENDER:$2|му|јој}} открити {{GENDER:$2|Вашу}} имејл адресу.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "editcomment": "Опис измене: <em>$1</em>.",
        "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
        "revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
-       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
+       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Сесија је окончана",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
        "changecontentmodel": "Промени модел садржаја странице",
        "allmessages-filter-legend": "Филтер",
        "allmessages-filter": "Филтрирај по стању:",
        "allmessages-filter-unmodified": "неизмењене",
-       "allmessages-filter-all": "све",
+       "allmessages-filter-all": "Све",
        "allmessages-filter-modified": "измењене",
        "allmessages-prefix": "Филтрирај по префиксу:",
        "allmessages-language": "Језик:",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
        "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "испразни списак надгледања",
-       "watchlisttools-view": "прикажи сродне измене",
+       "watchlisttools-view": "Ð\9fрикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
        "watchlisttools-raw": "измени сиров списак надгледања",
        "iranian-calendar-m1": "Фарвардин",
        "htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
        "htmlform-user-not-valid": "<strong>$1</strong> није исправно корисничко име.",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
-       "logentry-delete-delete_redir": "$1 је {{GENDER:$2|обрисао|обрисала}} преусмерење $3 преснимавањем",
+       "logentry-delete-delete_redir": "$1 је {{GENDER:$2|обрисао|обрисала}} преусмерење $3 преписивањем",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
        "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику $3: $4",
        "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$5 измене|$5 измена}} на страници $3: $4",
        "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|минут|минута|минута}}",
        "expand_templates_remove_nowiki": "Поништава ефекат <nowiki> тагова у приказу чланака",
        "expand_templates_generate_xml": "Прикажи XML стабло",
        "expand_templates_generate_rawhtml": "Прикажи сиров HTML",
-       "expand_templates_preview": "Ð\9fÑ\80иказ",
+       "expand_templates_preview": "Ð\9fÑ\80еÑ\82пÑ\80еглед",
        "pagelang-name": "Страница",
        "pagelang-language": "Језик",
        "pagelang-select-lang": "Изабери језик",
        "json-error-syntax": "Грешка у синтакси",
        "headline-anchor-title": "Веза до овог одељка",
        "special-characters-group-latin": "Латиница",
-       "special-characters-group-latinextended": "проширена латиница",
+       "special-characters-group-latinextended": "Ð\9fроширена латиница",
        "special-characters-group-ipa": "ИПА",
-       "special-characters-group-symbols": "симболи",
-       "special-characters-group-greek": "грчки",
-       "special-characters-group-cyrillic": "ћирилица",
-       "special-characters-group-arabic": "арапски",
-       "special-characters-group-arabicextended": "проширени арапски",
+       "special-characters-group-symbols": "Симболи",
+       "special-characters-group-greek": "Грчки",
+       "special-characters-group-greekextended": "Проширени грчки",
+       "special-characters-group-cyrillic": "Ћирилица",
+       "special-characters-group-arabic": "Арапски",
+       "special-characters-group-arabicextended": "Проширени арапски",
        "special-characters-group-persian": "персијски",
-       "special-characters-group-hebrew": "хебрејски",
-       "special-characters-group-bangla": "бенгалски",
-       "special-characters-group-tamil": "тамилски",
-       "special-characters-group-telugu": "телугу",
-       "special-characters-group-sinhala": "синхалски",
-       "special-characters-group-gujarati": "гуџарати",
-       "special-characters-group-devanagari": "деванагари",
-       "special-characters-group-thai": "тајландски",
-       "special-characters-group-lao": "лаоски",
-       "special-characters-group-khmer": "кмерски",
+       "special-characters-group-hebrew": "Хебрејски",
+       "special-characters-group-bangla": "Ð\91енгалски",
+       "special-characters-group-tamil": "Тамилски",
+       "special-characters-group-telugu": "Телугу",
+       "special-characters-group-sinhala": "Синхалски",
+       "special-characters-group-gujarati": "Ð\93уџарати",
+       "special-characters-group-devanagari": "Ð\94еванагари",
+       "special-characters-group-thai": "Тајландски",
+       "special-characters-group-lao": "Ð\9bаоски",
+       "special-characters-group-khmer": "Ð\9aмерски",
        "mw-widgets-dateinput-no-date": "Датум није изабран",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "log-action-filter-protect": "Тип закључавања:",
        "log-action-filter-rights": "Тип промене корисничких права:",
        "log-action-filter-upload": "Тип отпремања:",
-       "log-action-filter-all": "све",
+       "log-action-filter-all": "Све",
        "log-action-filter-block-block": "блокирање",
        "log-action-filter-block-reblock": "измена блокирања",
        "log-action-filter-block-unblock": "деблокирање",
        "log-action-filter-managetags-activate": "активирање ознаке",
        "log-action-filter-managetags-deactivate": "деактивирање ознаке",
        "log-action-filter-move-move": "премештање без преснимавања преусмерења",
-       "log-action-filter-move-move_redir": "пÑ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81а Ð¿Ñ\80еÑ\81нимавањем преусмерења",
+       "log-action-filter-move-move_redir": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81а Ð¿Ñ\80епиÑ\81ивањем преусмерења",
        "log-action-filter-newusers-create": "отворио анониман корисник",
        "log-action-filter-newusers-create2": "отворио регистрован корисник",
        "log-action-filter-newusers-autocreate": "аутоматски отворен",
index fc2858e..d1a3a20 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja",
+       "tog-watchuploads": "Dodaj datoteke koje otpremim u spisak nadgledanja",
        "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja",
        "tog-minordefault": "Označavaj sve izmene kao manje",
        "tog-previewontop": "Prikaži pregled pre okvira za uređivanje",
@@ -51,7 +52,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
        "tog-oldsig": "Tekući potpis:",
        "tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
-       "tog-uselivepreview": "Koristi trenutan pregled",
+       "tog-uselivepreview": "Koristi trenutni pregled",
        "tog-forceeditsummary": "Upozori me kada ne unesem opis izmene",
        "tog-watchlisthideown": "Sakrij moje izmene sa spiska nadgledanja",
        "tog-watchlisthidebots": "Sakrij izmene botova sa spiska nadgledanja",
@@ -64,7 +65,7 @@
        "tog-ccmeonemails": "Pošalji mi kopije imejlova koje pošaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Izostavi razliku nakon izvršenog vraćanja",
+       "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
        "tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim promenama",
        "tog-prefershttps": "Uvek koristi sigurnu konekciju kada sam prijavljen.",
        "underline-always": "uvek podvlači",
        "hr_tip": "Vodoravna linija (koristiti retko)",
        "summary": "Opis izmene:",
        "subject": "Tema:",
-       "minoredit": "manja izmena",
-       "watchthis": "nadgledaj ovu stranicu",
+       "minoredit": "Ovo je manja izmena",
+       "watchthis": "Nadgledaj ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "savechanges": "Sačuvaj izmene",
        "publishpage": "Objavi stranicu",
        "last": "razl",
        "page_first": "prva",
        "page_last": "poslednja",
-       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> – razlika s trenutnom izmenom,\n<strong>({{int:last}})</strong> – razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> – mala izmena",
+       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika s trenutnom izmenom, <strong>({{int:last}})</strong> = razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> = mala izmena",
        "history-fieldset-title": "Pregled istorije",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "difference-multipage": "(razlike između stranica)",
        "lineno": "Red $1:",
        "compareselectedversions": "Uporedi izabrane izmene",
-       "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
+       "showhideselectedversions": "Promeni vidljivost izabranih izmena",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nije prikazano|$1 međuizmena istog korisnika nije prikazano}})",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Traži u sledećim imenskim prostorima:",
        "powersearch-togglelabel": "Izaberi:",
-       "powersearch-toggleall": "sve",
-       "powersearch-togglenone": "ništa",
+       "powersearch-toggleall": "Sve",
+       "powersearch-togglenone": "Ništa",
        "powersearch-remember": "Zapamti moj izbor za buduće pretrage",
        "search-external": "Spoljna pretraga",
        "searchdisabled": "Pretraga je onemogućena.\nU međuvremenu možete tražiti preko Gugla.\nUpamtite da njegovi popisi ovog vikija mogu biti zastareli.",
        "username": "{{GENDER:$1|Korisničko ime}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "Vreme upisa:",
+       "prefs-registration": "Vreme registracije:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Pravo ime:",
        "yourlanguage": "Jezik:",
        "hist": "ist",
        "hide": "Sakrij",
        "show": "Prikaži",
-       "minoreditletter": " m",
+       "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "uploaddisabledtext": "Otpremanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Otpremanje datoteka je onemogućeno u PHP-u.\nProverite podešavanja file_uploads.",
        "uploadscripted": "Datoteka sadrži HTML ili skriptni kod koji može biti pogrešno protumačen od strane pregledača.",
-       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „<nowiki>$1</nowiki>“",
        "uploadvirus": "Datoteka sadrži virus!\nDetalji: $1",
        "uploadjava": "Datoteka je formata ZIP koji sadrži java .class element.\nSlanje java datoteka nije dozvoljeno jer one mogu izazvati zaobilaženje sigurnosnih ograničenja.",
        "upload-source": "Izvorna datoteka",
        "backend-fail-hashes": "Ne mogu da dobijem disperzije datoteke za upoređivanje.",
        "backend-fail-notsame": "Već postoji neistovetna datoteka – $1.",
        "backend-fail-invalidpath": "$1 nije ispravna putanja za skladištenje.",
-       "backend-fail-delete": "Ne mogu da obrišem datoteku $1.",
+       "backend-fail-delete": "Ne mogu da obrišem datoteku „$1”.",
        "backend-fail-describe": "Ne mogu da promenim metapodatke za datoteku „$1“.",
        "backend-fail-alreadyexists": "Datoteka $1 već postoji.",
        "backend-fail-store": "Ne mogu da smestim datoteku $1 u $2.",
        "booksources-search": "Pretraži",
        "booksources-text": "Ispod se nalazi spisak veza ka sajtovima koji se bave prodajom novih i polovnih knjiga, a koji bi mogli imati dodatne podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije ispravan. Proverite da nije došlo do greške pri umnožavanju iz prvobitnog izvora.",
+       "magiclink-tracking-isbn": "Stranice sa ISBN magičnim vezama",
        "specialloguserlabel": "Izvršilac:",
        "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Dnevnici",
        "all-logs-page": "Svi javni dnevnici",
        "alllogstext": "Skupni prikaz svih dostupnih istorija ovog vikija.\nMožete suziti prikaz odabirući vrstu istorije, korisničkog imena ili tražene stranice.",
        "logempty": "Nema pronađenih unosa u dnevniku.",
-       "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
+       "log-title-wildcard": "Pretraži naslove koji počinju sa ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane događaje",
        "log-edit-tags": "Uredi oznake izabranih unosa u dnevnicima",
        "checkbox-select": "Izaberi: $1",
-       "checkbox-all": "sve",
-       "checkbox-none": "ništa",
-       "checkbox-invert": "obrni",
+       "checkbox-all": "Sve",
+       "checkbox-none": "Ništa",
+       "checkbox-invert": "Obrni",
        "allpages": "Sve stranice",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filtriraj po stanju:",
        "allmessages-filter-unmodified": "neizmenjene",
-       "allmessages-filter-all": "sve",
+       "allmessages-filter-all": "Sve",
        "allmessages-filter-modified": "izmenjene",
        "allmessages-prefix": "Filtriraj po prefiksu:",
        "allmessages-language": "Jezik:",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak",
        "tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
        "tooltip-upload": "Započnite otpremanje",
-       "tooltip-rollback": "Opcija „Vrati“ vraća izmene poslednjeg korisnika",
+       "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg korisnika jednim klikom",
        "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
        "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
        "watchlisttools-clear": "isprazni spisak nadgledanja",
-       "watchlisttools-view": "prikaži srodne izmene",
+       "watchlisttools-view": "Prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "watchlisttools-raw": "izmeni sirov spisak nadgledanja",
        "iranian-calendar-m1": "Farvardin",
        "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
+       "logentry-delete-delete_redir": "$1 je {{GENDER:$2|obrisao|obrisala}} preusmerenje $3 prepisivanjem",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
        "expand_templates_remove_nowiki": "Poništava efekat <nowiki> tagova u prikazu članaka",
        "expand_templates_generate_xml": "Prikaži XML stablo",
        "expand_templates_generate_rawhtml": "Prikaži sirov HTML",
-       "expand_templates_preview": "Prikaz",
+       "expand_templates_preview": "Pretpregled",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-select-lang": "Izaberi jezik",
        "json-error-syntax": "Greška u sintaksi",
        "headline-anchor-title": "Veza do ovog odeljka",
        "special-characters-group-latin": "Latinica",
-       "special-characters-group-latinextended": "proširena latinica",
+       "special-characters-group-latinextended": "Proširena latinica",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboli",
-       "special-characters-group-greek": "grčki",
-       "special-characters-group-cyrillic": "ćirilica",
-       "special-characters-group-arabic": "arapski",
-       "special-characters-group-arabicextended": "prošireni arapski",
+       "special-characters-group-greek": "Grčki",
+       "special-characters-group-greekextended": "Prošireni grčki",
+       "special-characters-group-cyrillic": "Ćirilica",
+       "special-characters-group-arabic": "Arapski",
+       "special-characters-group-arabicextended": "Prošireni arapski",
        "special-characters-group-persian": "persijski",
-       "special-characters-group-hebrew": "jevrejsko",
-       "special-characters-group-bangla": "Bangla",
-       "special-characters-group-tamil": "tamilski",
-       "special-characters-group-telugu": "telugu",
-       "special-characters-group-sinhala": "sinhalski",
+       "special-characters-group-hebrew": "Hebrejski",
+       "special-characters-group-bangla": "Bengalski",
+       "special-characters-group-tamil": "Tamilski",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhalski",
        "special-characters-group-gujarati": "Gudžarati",
-       "special-characters-group-devanagari": "devanagari",
-       "special-characters-group-thai": "tajlandski",
-       "special-characters-group-lao": "laoski",
-       "special-characters-group-khmer": "kmerski",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Tajlandski",
+       "special-characters-group-lao": "Laoski",
+       "special-characters-group-khmer": "Kmerski",
        "mw-widgets-dateinput-no-date": "Datum nije izabran",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
        "randomrootpage": "Slučajna korenska stranica",
+       "log-action-filter-all": "Sve",
+       "log-action-filter-move-move_redir": "Premeštanje sa prepisivanjem preusmerenja",
        "log-action-filter-upload-upload": "Novo otpremanje",
        "authmanager-email-label": "Imejl",
        "authmanager-email-help": "Imejl adresa",
index bff2aab..b9ae2be 100644 (file)
        "selfredirect": "<strong>Varning:</strong> Du omdirigerar denna sida till sig själv.\nDu kanske angav fel mål för din omdirigering, eller redigerar fel sida.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas trots detta.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
        "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
-       "summary-preview": "Förhandsgranskning av sammanfattning:",
-       "subject-preview": "Rubrikförhandsgranskning:",
+       "summary-preview": "Förhandsgranskning av redigeringssammanfattning:",
+       "subject-preview": "Förhandsgranskning av ämne:",
        "previewerrortext": "Ett fel uppstod när dina ändringar skulle förhandsgranskas.",
        "blockedtitle": "Användaren är blockerad",
        "blockedtext": "'''Din IP-adress eller ditt användarnamn är blockerat.'''\n\nBlockeringen utfördes av $1 med motiveringen: ''$2''.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6.\n* Blockeringen var avsedd för: $7.\n\nDu kan kontakta $1 eller någon annan av [[{{MediaWiki:Grouppage-sysop}}|administratörerna]] för att diskutera blockeringen.\nOm du är inloggad och har uppgivit en e-postadress i dina [[Special:Preferences|inställningar]] så kan du använda funktionen 'Skicka e-post till den här användaren', såvida du inte blivit blockerad från funktionen.\n\nDin IP-adress är $3 och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "search-interwiki-caption": "Systerprojekt",
        "search-interwiki-default": "Resultat från $1:",
        "search-interwiki-more": "(mer)",
+       "search-interwiki-more-results": "fler resultat",
        "search-relatedarticle": "Relaterad",
        "searchrelated": "relaterad",
        "searchall": "alla",
        "editusergroup": "Läs in användargrupper",
        "editinguser": "Ändrar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Visar rättigheter för {{GENDER:$1|användaren}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Ändra användargrupper",
-       "userrights-viewusergroup": "Visa användargrupper",
+       "userrights-editusergroup": "Ändra {{GENDER:$1|användargrupper}}",
+       "userrights-viewusergroup": "Visa {{GENDER:$1|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 (*) markerar att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.",
+       "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-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-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-feedbacklink": "Ge återkoppling på nya (beta)filter",
+       "rcfilters-highlightbutton-title": "Markera resultat",
+       "rcfilters-highlightmenu-title": "Välj en färg",
        "rcfilters-filterlist-noresults": "Inga filter hittades",
        "rcfilters-filtergroup-registration": "Användarregistrering",
        "rcfilters-filter-registered-label": "Registrerade",
        "uploaded-setting-handler-svg": "SVG som anger \"handler\"-attributet med remote/data/skript är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
        "uploaded-remote-url-svg": "SVG som anger style-attributet med en fjärr-URL är blockerat. Hittade <code>$1=\"$2\"</code> i den uppladdade SVG-filen.",
        "uploaded-image-filter-svg": "Hittade bildfilter med URL: <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
-       "uploadscriptednamespace": "Denna SVG-fil innehåller den ogiltiga namnrymden \"$1\".",
+       "uploadscriptednamespace": "Denna SVG-fil innehåller den ogiltiga namnrymden \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML-koden i den uppladdade filen kunde inte tolkas.",
        "uploadvirus": "Filen innehåller virus! Detaljer: $1",
        "uploadjava": "Filen är en ZIP-fil som innehåller en Java .class-fil.\nUppladdning av Java filer tillåts inte eftersom de kan orsaka att säkerhetsbegränsningar kan kringgås.",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>.",
        "revertpage": "Återställde redigeringar av  [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
        "revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2.",
+       "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]",
        "sessionfailure-title": "Sessionsfel",
        "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lägg till en kategori...",
+       "mw-widgets-usersmultiselect-placeholder": "Lägg till fler...",
        "sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
        "sessionprovider-generic": "$1-sessioner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner",
index 44b15e8..c4148df 100644 (file)
        "passwordreset-emaildisabled": "Vipengee vya barua pepe vimelemazwa katika wiki hii.",
        "passwordreset-username": "Jina la mtumiaji:",
        "passwordreset-domain": "Miliki",
-       "passwordreset-capture": "Ioneshe barua-pepe itakayotumwa?",
-       "passwordreset-capture-help": "Iwapo utatia alama kisanduku hiki, barua-pepe (pamoja na nenosiri la muda) litaoneshwa kwako na vilevile litatumwa kwa mtumiaji.",
        "passwordreset-email": "Anwani ya barua pepe:",
        "passwordreset-emailtitle": "Maelezo ya akaunti kwenye {{SITENAME}}",
        "passwordreset-emailtext-ip": "Kuna mtu (huenda ikawa ni wewe, kutoka anwani ya IP $1) aliyeomba neno la siri la akaunti yako liwekwe upya katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:\n\n$2\n\n{{PLURAL:$3|Neno la siri hili litakwisha|Maneno ya siri haya yatakwisha}} baada ya siku {{PLURAL:$5|$5}}.\nUnafaa kuingia sasa na uchague neno jipya la siri. Kama mtu mwingine ameomba hili, au ikiwa umekumbuka neno lako la siri na hutaki kulibadilisha tena, basi usijali ujumbe huu, na uendelee kutumia neno la siri lako la zamani.",
        "saveprefs": "Hifadhi",
        "restoreprefs": "Rudisha mapendekezo ya msingi(katika sehemu zote)",
        "prefs-editing": "Kuhariri",
-       "rows": "Mistari:",
-       "columns": "Safu:",
        "searchresultshead": "Kutafuta",
        "stub-threshold": "Kiwango cha juu cha kuonyesha kiungo kama <a href=\"#\" class=\"stub\">kiungo kinachoelekea mbegu</a> (baiti):",
        "stub-threshold-disabled": "Imelemazwa",
        "userrights-reason": "Sababu:",
        "userrights-no-interwiki": "Huna ruhusa ya kuhariri haki za mtumiaji kwenye wiki zingine.",
        "userrights-nodatabase": "Hakuna hifadhidata inayoitwa $1 au haimo katiko jumuia hii ya wiki.",
-       "userrights-nologin": "Lazima [[Special:UserLogin|uingie ndani]] ya akaunti ya mkabidhi ili kupanga haki za mtumiaji.",
-       "userrights-notallowed": "Hauna ruhusa ya kupea au kunyimana haki za mtumiaji.",
        "userrights-changeable-col": "Makundi unayoweza kuyabadilisha",
        "userrights-unchangeable-col": "Makundi usiyoweza kuyabadilisha",
        "userrights-conflict": "Mgongano wa haki za mtumiaji! Tafadhali pitia na uthibitishe mabadiliko yako.",
-       "userrights-removed-self": "Umefanikiwa kundoa haki zako mwenyewe. Kwa hivo, hauna uwezo wa kupata ukurasa huu.",
        "group": "Kundi:",
        "group-user": "Watumiaji",
        "group-autoconfirmed": "Watumiaji waliothibitishwa na tarakilishi",
        "right-siteadmin": "Kufunga na kufungua hifadhidata",
        "right-override-export-depth": "Kuuza nje kurasa ikiwa ni pamoja na kurasa zilizounganishwa hadi kina cha 5",
        "right-sendemail": "Kutuma barua-pepe kwa watumiaji wengine",
-       "right-passwordreset": "Onesha barua pepe zinazoweka neno la siri upya",
        "right-managechangetags": "Unda na ufute [[Special:Tags|tags]] kutoka kwa hifadhidata",
        "right-applychangetags": "Weka [[Special:Tags|tags]] pamoja na mabadiliko yangu",
        "newuserlogpage": "Kumbukumbu za kuanzisha akaunti za watumiaji",
        "uploaddisabledtext": "Upakiaji wa mafaili umelemazwa.",
        "php-uploaddisabledtext": "Upakiaji wa mafaili umelemazwa katika PHP.\nTafadhali utazame kipimo cha file_uploads.",
        "uploadscripted": "Faili hili lina HTML au misimbo ambazo labda itaeleweka vibaya na kivinjari.",
-       "uploadscriptednamespace": "Faili ya SVG iko na jina batili \"$1\".",
+       "uploadscriptednamespace": "Faili ya SVG iko na jina batili \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML katika faili iliyopakiwa haikuchanganuliwa.",
        "uploadvirus": "Faili lina kirusi!\nMaelezo mengine: $1",
        "uploadjava": "Faili ZIP hili lina faili Java .class humo ndani.\nHairuhusiki kupakia mafaili ya Java, kwa sababu yanawezesha kusababisha vizuio vya usalama kuzungukwa.",
        "feedback-thanks-title": "Asante!",
        "searchsuggest-search": "Kutafuta",
        "searchsuggest-containing": "ya maneno...",
-       "api-error-empty-file": "Faili ulilowasilisha ni tupu.",
        "api-error-emptypage": "Kutengeneza mpya, kurasa tupu hazikubaliwi",
-       "api-error-filename-tooshort": "Jina la faili ni fupi mno.",
-       "api-error-filetype-banned": "Aina hili la faili hairuhusiwi.",
-       "api-error-illegal-filename": "Jina hilo la faili haliruhusiwi.",
-       "api-error-unclassified": "Ilitokea hitilafu isiyojulikana.",
-       "api-error-unknown-code": "Hitilafu isiyojulikana: \"$1\".",
        "api-error-unknown-warning": "Ilani isiojulikana: \"$1\".",
        "api-error-unknownerror": "Hitlafu isiyojulikana: \"$1\".",
-       "api-error-uploaddisabled": "Kupakia kumelemazwa katika wiki hii.",
        "duration-seconds": "{{PLURAL:$1|sekunde}} $1",
        "duration-minutes": "{{PLURAL:$1|dakika}} $1",
        "duration-hours": "{{PLURAL:$1|saa|masaa}} $1",
index bf05552..1c99b9e 100644 (file)
@@ -69,6 +69,7 @@
        "tog-watchdefault": "நான் தொகுக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
        "tog-watchmoves": "நான் நகர்த்தும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்.",
        "tog-watchdeletion": "நான் நீக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
+       "tog-watchuploads": "நான் பதிவேற்றும் புதிய கோப்புகளை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்",
        "tog-watchrollback": "நான் பின்மாற்றம் செய்த எனது கவனிப்பு பட்டியலில் பக்கங்களை சேர்",
        "tog-minordefault": "இயல்பிருப்பாக அனைத்து தொகுப்புகளையும் சிறியது எனக் குறித்துக்கொள்.",
        "tog-previewontop": "தொகுப்புப் பெட்டிக்கு முன்பு முன்தோற்றத்தைக் காட்டு",
@@ -93,7 +94,7 @@
        "tog-ccmeonemails": "ஏனைய பயனர்களுக்கு நான் அனுப்பும் மின்னஞ்சல்களின் நகலொன்றை எனக்கு அனுப்பு",
        "tog-diffonly": "மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே",
        "tog-showhiddencats": "மறைக்கப்பட்ட பகுப்புகளைக் காட்டு",
-       "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத à®¨à®¿à®²à¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d à®µà®¿à®¤à¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®µà®¿à®\9fà¯\8dà®\9fà¯\81விà®\9fவà¯\81à®®à¯\8d (à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88).",
+       "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத à®¨à®¿à®²à¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d à®µà®¿à®¤à¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88",
        "tog-useeditwarning": "தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்",
        "tog-prefershttps": "புகுபதிகை செய்யும்போது எப்போதுமே பாதுகாப்பான இணைப்பை பயன்படுத்தவும்",
        "underline-always": "எப்பொழுதும்",
        "password-change-forbidden": "நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது",
        "externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.",
        "login": "புகுபதிகை",
+       "login-security": "தங்கள் அடையாளத்தை உறுதிப்படுத்தவும்",
        "nav-login-createaccount": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
        "userlogin": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
        "userloginnocreate": "புகுபதிகை",
        "createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?",
        "createacct-submit": "உங்கள் கணக்கை உருவாக்குக",
        "createacct-another-submit": "கணக்கை உருவாக்கவும்",
+       "createacct-continue-submit": "கணக்கு தொடக்கத்தை தொடரவும்",
+       "createacct-another-continue-submit": "கணக்கு தொடக்கத்தை தொடரவும்",
        "createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது",
        "createacct-benefit-body1": "{{PLURAL:$1|தொகுப்பு|தொகுப்புகள்}}",
        "createacct-benefit-body2": "{{PLURAL:$1|பக்கம்|பக்கங்கள்}}",
        "createacct-another-realname-tip": "உண்மையான பெயர் கட்டாயமற்றது.\nநீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.",
        "pt-login": "உள்நுழை",
        "pt-login-button": "புகுபதிகை",
+       "pt-login-continue-button": "உள்நுழைவை தொடரவும்",
        "pt-createaccount": "புதிய கணக்கை உருவாக்கவும்",
        "pt-userlogout": "விடுபதிகை",
        "php-mail-error-unknown": "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
        "newpassword": "புதிய கடவுச்சொல்:",
        "retypenew": "புதிய கடவுச்சொல்லை மீண்டும் தட்டச்சிடு",
        "resetpass_submit": "கடவுச்சொல்லை பதிவுசெய்து புகுபதிகை செய்",
-       "changepassword-success": "à®\89à®\99à¯\8dà®\95ளதà¯\81 à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®µà¯\86à®±à¯\8dறிà®\95ரமாà®\95 à®®à®¾à®±à¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளது!",
+       "changepassword-success": "à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à®¾à®±à¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fது!",
        "changepassword-throttled": "தாங்கள் மிக அண்மையில் பலமுறை புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.\nமீண்டும் முயற்சிக்கும் முன் $1 காத்திருக்கவும்.",
        "botpasswords": "தானியங்கி கடவுச்சொற்கள்",
        "botpasswords-disabled": "தானியங்கி கடவுச்சொற்கள் பயன்பாட்டில் இல்லை.",
        "botpasswords-insert-failed": "\"$1\" என்ற தானியங்கி பெயரை இணைக்க முடியவில்லை. ஏற்கனவே இருக்குமோ?",
        "botpasswords-update-failed": "\"$1\" என்ற தானியங்கி பெயரை புதிப்பிக்க முடியவில்லை. அது நீக்கப்பட்டதா?",
        "botpasswords-created-title": "தானியங்கி கடவுச்சொல் உருவாக்கப்பட்டது.",
-       "botpasswords-created-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
+       "botpasswords-created-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
        "botpasswords-updated-title": "தானியங்கி கடவுச்சொல் புதுப்பிக்கப்பட்டது",
-       "botpasswords-updated-body": "\"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
+       "botpasswords-updated-body": "\"$2\" பயனரின் \"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
        "botpasswords-deleted-title": "தானியங்கி கடவுச்சொல் நீக்கப்பட்டது",
-       "botpasswords-deleted-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
+       "botpasswords-deleted-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
        "botpasswords-newpassword": "<strong>$1</strong>-இற்கு புகுபதிகை செய்வதற்கான புதிய கடவுச்சொல் <strong>$2</strong> ஆகும். <em>தயவு செய்து வருங்கால மேற்கோளுக்கு இதனை பதிக.</em><br>(பழைய முகவர்கள்  பயனாளர் பெயரை உள்ளீட்டிற்கு பயன்படுத்தலாம், மேலும் நீங்கள் <strong>$3</strong> ஐ பயனாளர் பெயராகவும் <strong>$4</strong>  ஐ கடவுச்சொல்லாகவும் பயன்படுத்தலாம்.)",
        "botpasswords-no-provider": "தானியங்கிகடவுச்சொல்அமர்வுவழங்குநர் பயன்பாட்டில் இல்லை.",
        "botpasswords-restriction-failed": "தானியங்கி கடவுச்சொல் புகுபதிகை செய்ய தடுக்கிறது.",
        "botpasswords-invalid-name": "தானியங்கி கடவுச்சொல் பிரிப்பானை (\"$1\") குறிக்கப்பட்ட பயனர் பெயர் கொண்டிருக்கவில்லை.",
        "botpasswords-not-exist": "\"$1\" என்ற பயனர் \"$2\" என்ற தானியங்கி கடவுச்சொல்லை கொண்டிருக்கவில்லை.",
        "resetpass_forbidden": "கடவுச்சொற்கள் மாற்றப்பட முடியாது",
+       "resetpass_forbidden-reason": "கடவுச்சொற்கள் மாற்றப்பட முடியாது:$1",
        "resetpass-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "resetpass-submit-loggedin": "கடவுச்சொல்லை மாற்று",
        "resetpass-submit-cancel": "விட்டுவிடு",
        "passwordreset-emailelement": "பயனர் பெயர்:  \n$1\n\nதற்காலிகக் கடவுச்சொல்: \n$2",
        "passwordreset-emailsentemail": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
        "passwordreset-emailsentusername": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
+       "passwordreset-invalidemail": "செல்லுபடியற்ற அஞ்சல் முகவரி",
+       "passwordreset-nodata": "பயனர் பெயர் மற்றும் மின்னஞ்சல் முகவரி கொடுக்கப்படவில்லை",
        "changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
        "changeemail-header": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.  உங்கள் கணக்கிலிருந்து ஏதாவது மின்னஞ்சலை நீக்க விரும்பினால், படிவத்தை சமர்ப்பிக்கும்போது மின்னஞ்சல் முகவரியை காலியாக விடவும்.",
        "changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "content-model-css": "சிஎஸ்எஸ்",
        "content-json-empty-object": "காலி பொருள்",
        "content-json-empty-array": "காலி அணி",
+       "deprecated-self-close-category": "தவறாக சுய மூடப்பட்ட HTML குறிச்சொற்களை பயன்படுத்தும் பக்கங்கள்",
        "duplicate-args-category": "வார்ப்புரு அழைப்பில் ஒத்த விவாதங்களை கொண்ட பக்கங்கள்",
        "duplicate-args-category-desc": "இப்பக்கம் விவாதங்களின் ஒத்த வடிவங்களைப் பயன்படுத்தும் வார்ப்புருக்களை, எடுத்துக்காட்டக <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code> கொண்டுள்ளது.",
        "expensive-parserfunction-warning": "எச்சரிக்கை: இப்பக்கம் அதிகளவு இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டுள்ளது.\n\nஇது $2 {{PLURAL:$2|சார்புக்கும்|சார்புகளுக்கும் }} குறைவான இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டிருக்க வேண்டும், ஆனால் தற்போது இதில் {{PLURAL:$1|$1 சார்பு|$1 சார்புகள்}} உள்ளன.",
        "mergehistory-empty": "இணைக்கப்படக்கூடிய திருத்தங்கள் எதுவுமில்லை.",
        "mergehistory-done": "$1 பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
        "mergehistory-fail": "வரலாற்றை இணைக்க முடியவில்லை. அருள் கூர்ந்து நேரங்களை ஒரு முறை சரி பார்க்கவும்.",
+       "mergehistory-fail-bad-timestamp": "செல்லுப்படியாகாத நேர முத்திரை.",
        "mergehistory-fail-invalid-source": "மூலப்பக்கம் பயன்பாட்டில் இல்லை.",
        "mergehistory-fail-invalid-dest": "இலக்குப் பக்கம் செல்லுபடியற்றது.",
+       "mergehistory-fail-permission": "வரலாறுகளை ஒன்றினைக்க தேவையாக அதிகாரங்கள் இல்லை.",
        "mergehistory-fail-toobig": "$1 அளவுக்கு மேல் வரலாறு இணைப்பு செய்ய இயலவில்லை {{PLURAL:$1|revision|திருத்தங்கள்}} நகர்த்தப்படும்.",
        "mergehistory-no-source": "மூலப் பக்கம் $1 இல்லை.",
        "mergehistory-no-destination": "இலக்குப் பக்கம் $1 இல்லை.",
        "search-interwiki-caption": "உறவுத் திட்டங்கள்",
        "search-interwiki-default": "$1 தளத்திலிருந்து முடிவுகள்:",
        "search-interwiki-more": "(மேலும்)",
+       "search-interwiki-more-results": "மேலும் முடிவுகள்",
        "search-relatedarticle": "தொடர்புடையவை",
        "searchrelated": "தொடர்புடையவை",
        "searchall": "அனைத்தும்",
        "action-userrights-interwiki": "ஏனைய விக்கித் தளங்களின் பயனர் உரிமைகளைத் தொகு",
        "action-siteadmin": "தரவுதளத்தை பூட்டு அல்லது  பூட்டாதே",
        "action-sendemail": "மின்னஞ்சல்கள் அனுப்பு",
+       "action-editmyoptions": "உங்கள் விருப்பத்தேர்வுகளை தொகு",
        "action-editmywatchlist": "உங்கள் கவனிப்பு பட்டியலை தொகு",
        "action-viewmywatchlist": "உங்கள் கவனிப்பு பட்டியலை பார்",
        "action-viewmyprivateinfo": "உங்கள் தனிப்பட்ட தகவல்களைப் பார்",
        "action-managechangetags": "தரவுதளத்திலிருந்து அடையாளங்களை உருவாக்கு அல்லது நீக்கு",
        "action-applychangetags": "உங்கள் மாற்றங்களுடன் அடையாளங்களைச் செயற்படுத்து",
        "action-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில் அடையாளங்களைச் சேர் அல்லது நீக்கு",
+       "action-purge": "இப்பக்கத்தினை துப்புரவாக்கு",
        "nchanges": "{{PLURAL:$1|ஓர் மாற்றம்|$1 மாற்றங்கள்}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|கடந்த வருகையிலிருந்து}}",
        "enhancedrc-history": "வரலாறு",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "recentchanges-submit": "காட்டு",
        "rcfilters-filterlist-title": "வடிப்பான்கள்",
+       "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-userExpLevel-newcomer-label": "புது வரவுகள்",
        "rcfilters-filter-userExpLevel-learner-label": "கற்போர்",
+       "rcfilters-filter-userExpLevel-experienced-label": "அனுபவமுள்ள பயனர்கள்",
+       "rcfilters-filter-userExpLevel-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-significance": "சிறப்பு",
+       "rcfilters-filter-minor-label": "சிறு தொகுப்பு",
        "rcfilters-filtergroup-changetype": "மாற்ற வகை",
+       "rcfilters-filter-pageedits-label": "பக்க தொகுப்புகள்",
        "rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்",
        "rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
        "rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "uploaddisabledtext": "கோப்பு பதிவேற்றங்கள் செயலிழக்கச் செய்யப்பட்டுள்ளன.",
        "php-uploaddisabledtext": "கோப்பு தரவேற்றம் PHP இல் முடக்கப்பட்டுள்ளது.தயவுகூர்ந்து file_uploads அமைப்பை சரிபார்க்கவும்.",
        "uploadscripted": "இந்தக் கோப்பு உலாவியால் பிழையாக விளங்கிக் கொள்ளக்கூடிய எச்.டி.எம்.எல். அல்லது வேறு நிரல்களைக் கொண்டுள்ளது.",
-       "uploadscriptednamespace": "இந்த SVG கோப்பு ஒரு சரியில்லாத பெயரிடைவெளியை \"$1\" கொண்டுள்ளது.",
+       "uploadscriptednamespace": "இந்த SVG கோப்பு ஒரு சரியில்லாத பெயரிடைவெளியை கொண்டுள்ளது \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "ஏற்றபட்ட கோப்பில் உள்ள XML ஆராய முடியாது.",
        "uploadvirus": "கோப்பு நச்சுநிரலைக் (வைரஸ்) கொண்டுள்ளது! விபரங்கள்:$1",
        "uploadjava": "இது ஒரு zip கோப்பு.இதில் java.class என்ற கோப்பு உள்ளது.\nஜாவா கோப்புகளை தகவலேற்றுவது தடைசெய்யப்பட்டுள்ளது.ஏனெனில் அது பாதுகாப்பு தடைகளை மீற வழிவகுக்கும்.",
        "apisandbox-request-url-label": "URL வேண்டுகோள்:",
        "apisandbox-request-time": "வேண்டுகோள் நேரம்: {{PLURAL:$1|$1 மிசெ}}",
        "apisandbox-results-fixtoken": "அட்டையை திருத்தி மீண்டும் சமர்பிக்கவும்",
+       "apisandbox-continue": "தொடரவும்",
+       "apisandbox-continue-clear": "வெறுமையாக்குக",
        "booksources": "நூல் மூலங்கள்",
        "booksources-search-legend": "நூல் மூலங்களைத் தேடு",
        "booksources-search": "தேடுக",
        "listgrouprights-namespaceprotection-header": "பெயர்வெளி கட்டுப்பாடு",
        "listgrouprights-namespaceprotection-namespace": "பெயர்வெளி",
        "listgrouprights-namespaceprotection-restrictedto": "பயனரை திருத்த அனுமதிக்கும் உரிமை(கள்)",
+       "listgrants-grant": "நல்கை",
        "listgrants-rights": "அணுக்கங்கள்",
        "trackingcategories": "பகுப்புகளை தடமறி",
        "trackingcategories-msg": "பகுப்புகளை தடமறிதல்",
        "changecontentmodel-title-label": "பக்கத் தலைப்பு",
        "changecontentmodel-model-label": "புது உள்ளடக்க மாதிரி",
        "changecontentmodel-reason-label": "காரணம்:",
+       "changecontentmodel-submit": "மாற்றுக",
        "changecontentmodel-success-title": "உள்ளடக்க மாதிரி மாற்றப்பட்டது",
        "changecontentmodel-success-text": "[[:$1]]-இன் உள்ளடக்க வகை மாற்றப்பட்டது",
        "log-name-contentmodel": "உள்ளடக்க மாதிரி மாற்றப் பதிகை",
        "ipb-unblock": "ஐ.பி. அல்லது பயனருக்கான தடையை நீக்கு",
        "ipb-blocklist": "தற்போதுள்ள தடுப்புகளைப் பார்",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}க்கு பங்களிப்புகள்",
+       "ipb-blocklist-duration-left": "$1 வெளியேறினர்",
        "unblockip": "பயனர் தடையை நீக்கு",
        "unblockiptext": "முன்னர் தடுக்கப்பட்ட ஐ.பி. முகவரி அல்லது பயனர்பெயரின் எழுத்து அணுக்கத்தை மீழ்விப்பதற்கு கீழேயுள்ள படிவத்தை பயன்படுத்தவும்.",
        "ipusubmit": "இந்தத் தடையை நீக்கு",
        "lockdbsuccesstext": "தரவுத்தளம் பூட்டப் பட்டது.<br />பராமரிப்பு முடிவடைந்ததும் [[Special:UnlockDB|பூட்டை நீக்க]] மறவாதீர்.",
        "unlockdbsuccesstext": "தரவுத்தளம் திறக்கப்பட்டது.",
        "lockfilenotwritable": "தரவுதள பூட்டு கோப்பு எழுதுமாறு  இல்லை.\nஇத்தரவுதளத்தை பூட்ட அல்லது பூட்டியதை நீக்க , இது  வலை சேவகன் எழுதுவதற்க்கேற்றவாறு இருக்க வேண்டும்.",
+       "databaselocked": "தரவுத்தளம் ஏற்கனவே பூட்டப்பட்டுள்ளது.",
        "databasenotlocked": "தரவுத்தளம் பூட்டப்படவில்லை.",
        "lockedbyandtime": "(இதன்படி{{GENDER:$1|$1}} on $2 at $3)",
        "move-page": "$1 பக்கத்தை நகர்த்து",
        "export-download": "கோப்பாக சேமி",
        "export-templates": "வார்ப்புருக்களையும் உள்ளடக்கு",
        "export-pagelinks": "இணைத்த பக்கங்களை கீழ்வரும்  ஆழம் வரை சேர்:",
+       "export-manual": "கைமுறையாக பக்கங்களை சேர்க:",
        "allmessages": "அனைத்து முறைமைசார் தகவல்கள் அட்டவணை",
        "allmessagesname": "பெயர்",
        "allmessagesdefault": "இயல்பிருப்பு உரை",
        "tooltip-ca-delete": "இப்பக்கத்தை நீக்கு",
        "tooltip-ca-undelete": "இப்பக்கம் நீக்கப்பட்டதற்கு முன்னர் செய்யப்பட்டத் தொகுப்புகளை மீட்டெடு",
        "tooltip-ca-move": "இப்பக்கத்தை நகர்த்துக",
-       "tooltip-ca-watch": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89ன் கவனிப்புப் பட்டியலில் சேர்",
+       "tooltip-ca-watch": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89à®\99à¯\8dà®\95ள் கவனிப்புப் பட்டியலில் சேர்",
        "tooltip-ca-unwatch": "இப்பக்கத்தை என் கவனிப்புப் பட்டியலிருந்து நீக்கு",
        "tooltip-search": "{{SITENAME}}-இல் தேடுக",
        "tooltip-search-go": "இப்பெயரைக் கொண்டப் பக்கம் இருப்பின் அதற்கு நேரடியாகச் செல்க",
        "tooltip-ca-nstab-category": "பகுப்புப் பக்கத்தை பார்க்க",
        "tooltip-minoredit": "இம்மாற்றத்தை சிறிய தொகுப்பாக கருது",
        "tooltip-save": "உங்கள் மாற்றங்களைச் சேமிக்கவும்.",
+       "tooltip-publish": "மாற்றங்களைப் பதிப்பிடுக",
        "tooltip-preview": "நீங்கள் செய்த மாற்றங்களின் முன்தோற்றம் பார்க்கவும்! தயவுசெய்து, மாற்றங்களை சேமிக்கும் முன்னர் இதனைப் பயன்படுத்தவும்!",
        "tooltip-diff": "உரையில் நீங்கள் செய்த மாற்றங்களைக் காட்டவும்.",
        "tooltip-compareselectedversions": "இப் பக்கத்தின் தெரிவு செய்யப்பட்ட இரண்டு பதிப்புக்களுக்கு இடையிலான வேறுபாடுகளைப் பார்க்கவும்.",
        "pageinfo-category-pages": "பக்கங்களின் எண்ணிக்கை",
        "pageinfo-category-subcats": "துணைபகுப்புகளின் எண்ணிக்கை",
        "pageinfo-category-files": "கோப்புகளின் எண்ணிக்கை",
+       "pageinfo-user-id": "பயனர் அடையாளம்",
        "markaspatrolleddiff": "ரோந்திட்டதாக குறி",
        "markaspatrolledtext": "இதனை சுற்றுக்காவல் செய்ததாகக் குறி",
        "markaspatrolledtext-file": "இக்கோப்பு பதிப்பினை ரோந்திட்டதாக குறி",
        "patrol-log-header": "இது ரோந்து செய்யப்பட்ட  பரிசீலனைகளுக்கான  குறிப்பேடு.",
        "log-show-hide-patrol": "$1 ரோந்து குறிப்பேடு",
        "log-show-hide-tag": "$1 அடையாள பதிவு",
+       "confirm-markpatrolled-button": "சரி",
        "deletedrevision": "பழைய திருத்தம் $1 நீக்கப்பட்டது",
        "filedeleteerror-short": "பின்வரும் கோப்பை நீக்குவதில் தவறு: $1",
        "filedeleteerror-long": "கோப்பை நீக்கும் போது தவறுகள் ஏற்பட்டுள்ளன:\n\n$1",
        "newimages-showbots": "தானியிங்கி பதிவேற்றங்களைக் காட்டு",
        "newimages-hidepatrolled": "ரோந்திட்ட பதிவேற்றங்களை மறை",
        "noimages": "பார்வைக்கு ஓன்றுமில்லை.",
+       "gallery-slideshow-toggle": "வில்லைப்படங்களை ஊசலாடு",
        "ilsubmit": "தேடுக",
        "bydate": "நாள் வழி",
        "sp-newimages-showfrom": "$1, $2க்குப் பின்னரான புதியக் கோப்புக்களைக் காட்டுக",
        "confirm-purge-top": "இப்பக்கத்தின் இடைமாற்றை நீக்கவா?",
        "confirm-purge-bottom": "ஒரு பக்கத்தை நீக்குதல், அதன் இடைமாற்றை நீக்கி மிக அண்மையப் பதிப்பை தோன்ற செய்யும்.",
        "confirm-watch-button": "சரி",
-       "confirm-watch-top": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89ன் கவனிப்புப் பட்டியலில் சேர்க்க வேண்டுமா?",
+       "confirm-watch-top": "à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®\89à®\99à¯\8dà®\95ள் கவனிப்புப் பட்டியலில் சேர்க்க வேண்டுமா?",
        "confirm-unwatch-button": "சரி",
        "confirm-unwatch-top": "இப்பக்கத்தை உங்கள்  கவனிப்புப் பட்டியலிருந்து நீக்கா வேண்டுமா?",
+       "confirm-rollback-button": "சரி",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← முந்திய பக்கம்",
        "imgmultipagenext": "அடுத்தப் பக்கம் →",
        "htmlform-cloner-create": "மேலும் சேர்க",
        "htmlform-cloner-delete": "நீக்குக",
        "htmlform-cloner-required": "குறைந்து ஒரு மதிப்பு தேவைப்படும்.",
+       "htmlform-date-placeholder": "வவவவ-மாமா-தேதே",
+       "htmlform-time-placeholder": "மம:நிநி:நொநொ",
+       "htmlform-datetime-placeholder": "வவவவ-மாமா-தேதே மம:நிநி:நொநொ",
        "htmlform-title-badnamespace": "\"{{ns:$2}}\" பெயர்வெளியில் [[:$1]] இல்லை",
        "htmlform-title-not-creatable": "\"$1\" ஒரு உருவாக்கத்தக்க பக்கத் தலைப்பு அல்ல",
        "htmlform-title-not-exists": "$1 இ்டம்பெறவில்லை.",
        "logentry-newusers-autocreate": "பயனர் கணக்கு $1 தானாக உருவாக்கப்பட்டது",
        "logentry-protect-move_prot": "$1 காப்பு அமைப்பை $4-இலிருந்து $3-இற்கு {{GENDER:$2|நகர்த்தினார்}}",
        "logentry-protect-unprotect": "$1 $3-இலிருந்து காப்பை {{GENDER:$2|நீக்கினார்}}",
-       "logentry-protect-protect": "$1 $3 என்பதனை $4 என்பதற்கு {{GENDER:$2|காப்பச் செய்தார்}}",
-       "logentry-protect-protect-cascade": "$1 $3 என்பதனை $4 என்பதற்கு {{GENDER:$2|காப்பச் செய்தார்}} [விழுத்தொடர்]",
+       "logentry-protect-protect": "$1 $3 à®\8eனà¯\8dபதனà¯\88 $4 à®\8eனà¯\8dபதறà¯\8dà®\95à¯\81 {{GENDER:$2|à®\95ாபà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dதாரà¯\8d}}",
+       "logentry-protect-protect-cascade": "$1 $3 à®\8eனà¯\8dபதனà¯\88 $4 à®\8eனà¯\8dபதறà¯\8dà®\95à¯\81 {{GENDER:$2|à®\95ாபà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\86யà¯\8dதாரà¯\8d}} [விழà¯\81தà¯\8dதà¯\8aà®\9fà®°à¯\8d]",
        "logentry-protect-modify": "$1 $3-க்கான காப்பு நிலையை $4 நேரத்திற்கு {{GENDER:$2|மாற்றினார்}}",
        "logentry-protect-modify-cascade": "$1 $3-க்கான காப்பு நிலையை $4 நேரத்திற்கு {{GENDER:$2|மாற்றினார்}} [விழுத்தொடர்]",
        "logentry-rights-rights": "$1 $3-இற்கான குழு அங்கத்துவத்தை $4-இலிருந்து $5-இற்கு {{GENDER:$2|மாற்றினார்}}",
        "pagelang-select-lang": "மொழியைத் தேர்ந்தெடு",
        "pagelang-reason": "காரணம்",
        "pagelang-submit": "சமர்ப்பி",
+       "pagelang-nonexistent-page": "பக்கம் $1 காணப்படவில்லை.",
        "right-pagelang": "பக்க மொழியை மாற்றுக",
        "action-pagelang": "பக்க மொழியை மாற்றுக",
        "log-name-pagelang": "மொழி பதிவை மாற்றுக",
        "log-description-pagelang": "இது பக்க மொழி மாற்றச் செயல்பாட்டின் பதிவு.",
        "logentry-pagelang-pagelang": "$3 க்கான பக்க மொழியை $4 இலிருந்து $5 க்கு $1 {{GENDER:$2|மாற்றினார்}}.",
+       "mediastatistics": "ஊடகம் பற்றிய புள்ளிவிவரங்கள்",
        "mediastatistics-bytespertype": "இந்த பிரிவக்கான மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-allbytes": "அனைத்து கோப்புகளின் மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-table-count": "கோப்புகளின் எண்ணிக்கை",
        "mediastatistics-header-video": "காணொளிகள்",
        "mediastatistics-header-office": "அலுவலகம்",
        "mediastatistics-header-text": "உரை வடிவ",
+       "mediastatistics-header-archive": "அமுக்கிய வடிவங்கள்",
        "mediastatistics-header-total": "அனைத்துக் கோப்புக்களும்",
        "json-error-syntax": "தொடரியல் பிழை",
        "special-characters-group-latin": "இலத்தீன்",
        "special-characters-group-ipa": "பன்னாட்டு ஒலிப்பு அரிச்சுவடி",
        "special-characters-group-symbols": "குறியீடுகள்",
        "special-characters-group-greek": "கிரேக்கம்",
+       "special-characters-group-greekextended": "நீடித்த கிரேக்கம்",
        "special-characters-group-cyrillic": "சைரிலிக் (Cyrillic)",
        "special-characters-group-arabic": "அரபு",
        "special-characters-group-arabicextended": "அரபு விரிவு",
        "special-characters-title-emdash": "பெரு கோடு",
        "special-characters-title-minus": "கழித்தல் குறி",
        "mw-widgets-dateinput-no-date": "திகதி தெரிவுச் செய்யப்படவில்லை",
+       "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": "மேலும் சேர்க...",
        "sessionprovider-generic": "$1 பகுதி",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
        "sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
index 97dba56..a4911dc 100644 (file)
        "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
-       "pagelang-reason": "ಕಾರಣೊ"
+       "pagelang-reason": "ಕಾರಣೊ",
+       "mw-widgets-usersmultiselect-placeholder": "ನನಾತ್ ಸೇರಲೇ..."
 }
index 8eb7790..3776c86 100644 (file)
        "edit": "సవరించు",
        "edit-local": "స్థానిక వివరణని మార్చు",
        "create": "సృష్టించు",
-       "create-local": "à°ªà±\8dà°°à°¾à°\82à°¤à±\80à°¯ à°µà°¿à°µà°°à°£à°¨à°¿ చేర్చు",
+       "create-local": "à°¸à±\8dథానిà°\95 à°µà°¿à°µà°°à°£à°¨à±\81 చేర్చు",
        "editthispage": "ఈ పేజీని సవరించండి",
        "create-this-page": "ఈ పేజీని సృష్టించండి",
        "delete": "తొలగించు",
        "otherlanguages": "ఇతర భాషలలో",
        "redirectedfrom": "($1 నుండి మళ్ళించబడింది)",
        "redirectpagesub": "దారిమార్పు పేజీ",
-       "redirectto": "దారి à°®à°³à±\8dళిà°\82పు:",
+       "redirectto": "దారి à°®à°¾à°°à±\8dపు:",
        "lastmodifiedat": "ఈ పేజీలో చివరి మార్పు $1 న $2 కు జరిగింది.",
        "viewcount": "ఈ పేజీ {{PLURAL:$1|ఒక్క సారి|$1 సార్లు}} దర్శించబడింది.",
        "protectedpage": "సంరక్షణలోని పేజీ",
        "title-invalid-interwiki": "మీరడిగిన పేజీ శీర్షికలో అంతర వికీ లంకె ఉంది, కానీ అది నిషిద్ధం.",
        "title-invalid-talk-namespace": "మీరడిగిన పేజీ శీర్షిక అసలు సృష్టించే వీలే లేని చర్చా పేజీకి చెందినది.",
        "title-invalid-characters": "కోరబడిన పేజీ శీర్షికలో చెల్లని అక్షరాలున్నాయి : \"$1\".",
-       "title-invalid-relative": "à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\8b à°²à°\82à°\95à±\86 à°ªà°¾à° à±\8dà°¯à°\82 à°¸à°¾à°ªà±\87à°\95à±\8dà°·à°\82à°\97à°¾ à°\89à°\82ది - à°ªà±\82à°°à±\8dతిà°\97à°¾ à°²à±\87à°¦à±\81. à°¸à°¾à°ªà±\87à°\95à±\8dà°· à°ªà±\87à°\9cà±\80 à°\9aà°¿à°°à±\81నామాలà±\81 (./, ../) à°\97à°² à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\81 à°\8eà°\95à±\8dà°\95à±\81వశాతà°\82 à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8b à°\89à°\82à°¡à°µà±\81 à°\95à°¨à±\81à°\95 అవి చెల్లవు.",
-       "title-invalid-magic-tilde": "కోరబడిన పేజీ శీర్షిక పాఠ్యం లో చెల్లని మ్యాజిక్ టిల్డా పదాలున్నాయి (<nowiki>~~~</nowiki>).",
+       "title-invalid-relative": "à°¶à±\80à°°à±\8dà°·à°¿à°\95à°\95à±\81 à°¸à°¾à°ªà±\87à°\95à±\8dà°· à°ªà°¾à°¤à±\8d à°\89à°\82ది. à°¸à°¾à°ªà±\87à°\95à±\8dà°· à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\81 (./, ../) à°µà°¾à°¡à±\81à°\95à°°à°¿ à°¬à±\8dà°°à±\8cà°\9cà°°à±\81à°\95à±\81 à°\8eà°\95à±\8dà°\95à±\81à°µà°\97à°¾ à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8b à°\89à°\82à°¡à°µà±\81 à°\95ాబà°\9fà±\8dà°\9fà°¿, అవి చెల్లవు.",
+       "title-invalid-magic-tilde": "కోరబడిన పేజీ శీర్షిక పాఠ్యంలో చెల్లని మ్యాజిక్ టిల్డె క్రమం ఉంది (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "మీరడిగిన పేజీ శీర్షిక మరీ పొడవుగా ఉంది. ఇది UTF-8 పద్ధతిలో $1 {{PLURAL:$1|బైట్‌|బైట్ల}}కు మించి ఉండరాదు.",
        "title-invalid-leading-colon": "కోరబడిన పేజీ శీర్షిక పాఠ్యం మొదట్లో చెల్లని కొలొన్ చిహ్నం (:) ఉంది.",
        "perfcached": "కింది డేటా ముందే సేకరించి పెట్టుకున్నది. కాబట్టి తాజా డేటాతో పోలిస్తే తేడాలుండవచ్చు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$1|ఒక్క ఫలితం ఉంది|$1 ఫలితాలు ఉన్నాయి}}.",
        "viewsourcetext": "మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు.",
        "viewyourtext": "ఈ పేజీలో <strong>మీరు చేసిన మార్పుల</strong> యొక్క మూలాన్ని చూడవచ్చు, కాపీచేసుకోవచ్చు.",
        "protectedinterface": "ఈ పేజీ, ఈ వికీ యొక్క సాఫ్టువేరు ఇంటరుఫేసుకు చెందిన టెక్స్టును అందిస్తుంది. దుశ్చర్యల నివారణ కోసమై దీన్ని సంరక్షించాం. వికీలన్నిటిలోను అనువాదాలను చేర్చాలన్నా, మార్చాలన్నా మీడియావికీ స్థానికీకరణ ప్రాజెక్టైన [https://translatewiki.net/ translatewiki.net] ను వాడండి.",
-       "editinginterface": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95:</strong> à°¸à°¾à°«à±\8dà°\9fà±\81à°µà±\87à°°à±\81à°\95à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°\9fà±\86à°\95à±\8dà°¸à±\8dà°\9fà±\81à°¨à±\81 à°\85à°\82దిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°ªà°¨à°¿à°\95à±\8aà°\9aà±\8dà°\9aà±\87 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dà°¦à±\81à°¤à±\81à°¨à±\8dనారà±\81.\nà°\88 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aà±\87à°¸à±\87 à°®à°¾à°°à±\8dà°ªà±\81à°² à°µà°²à±\8dà°² à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à°\95à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°\95నబడà±\87 à°µà°¿à°§à°¾à°¨à°\82à°²à±\8b à°¤à±\87డావసà±\8dతుంది.",
+       "editinginterface": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95:</strong> à°¸à°¾à°«à±\8dà°\9fà±\81à°µà±\87à°°à±\81à°\95à±\81 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°\9fà±\86à°\95à±\8dà°¸à±\8dà°\9fà±\81à°¨à±\81 à°\85à°\82దిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°ªà°¨à°¿à°\95à±\8aà°\9aà±\8dà°\9aà±\87 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dà°¦à±\81à°¤à±\81à°¨à±\8dనారà±\81.\nà°\88 à°ªà±\87à°\9cà±\80à°²à±\8b à°\9aà±\87à°¸à±\87 à°®à°¾à°°à±\8dà°ªà±\81à°² à°µà°²à±\8dà°² à°\87తర à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à°\95à±\81 à°\95నబడà±\87 à°\87à°\82à°\9fà°°à±\81à°«à±\87à°¸à±\81 à°ªà±\8dరభావితమà±\8cతుంది.",
        "translateinterface": "అన్ని వికీలలో కనిపించేలా అనువాదాలు చేర్చాలన్నా, మార్చాలన్నా, దయచేసి [https://translatewiki.net/ translatewiki.net] ను వాడండి. ఇది మీడియావికీ స్థానికీకరణ ప్రాజెక్టు.",
        "cascadeprotected": "కింది {{PLURAL:$1|పేజీని|పేజీలను}} కాస్కేడింగు ఆప్షనుతో సంరక్షించబడింది. ప్రస్తుత పేజీ, ఈ పేజీల్లో ట్రాన్స్‌క్లూడు అయి ఉంది కాబట్టి, దిద్దుబాటు చేసే వీలు లేకుండా ఇది కూడా రక్షణలో ఉంది:\n$2",
        "namespaceprotected": "'''$1''' నేంస్పేసులో మార్పులు చేయటానికి మీకు అనుమతి లేదు.",
        "wrongpassword": "ఈ సంకేతపదం సరైనది కాదు. దయచేసి మళ్లీ ప్రయత్నించండి.",
        "wrongpasswordempty": "ఖాళీ సంకేతపదం ఇచ్చారు. మళ్ళీ ప్రయత్నించండి.",
        "passwordtooshort": "సంకేతపదం కనీసం {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} నిడివి ఉండాలి.",
-       "passwordtoolong": "సంకేతపదంలో {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} కన్నా ఎక్కువ ఉండకూడదు.",
+       "passwordtoolong": "సంకేతపదం పొడవు {{PLURAL:$1|1 అక్షరం|$1 అక్షరాల}} కన్నా ఎక్కువ ఉండకూడదు.",
        "passwordtoopopular": "మామూలుగా వాడే సంకేతపదాలను వాడే వీల్లేదు. మరింత విశిష్టమైన సంకేతపదాన్ని ఎంచుకోండి.",
        "password-name-match": "మీ సంకేతపదం మీ వాడుకరిపేరుకి భిన్నంగా ఉండాలి.",
        "password-login-forbidden": "ఈ వాడుకరిపేరు మరియు సంకేతపదాలను ఉపయోగించడం నిషిద్ధం.",
        "resetpass-abort-generic": "ఓ పొడిగింత (ఎక్స్టెన్‍షన్) సంకేతపదం మార్పిడిని ఆపేసింది.",
        "resetpass-expired": "మీ సంకేతపదానికి కాలం చెల్లింది. కొత్త సంకేతపదం ఇచ్చి లాగినవండి.",
        "resetpass-expired-soft": "మీ సంకేతపదానికి కాలం చెల్లింది, కాబట్టి కొత్తది ఇవ్వాలి. కొత్తది ఇప్పుడే ఇవ్వండి లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
-       "resetpass-validity-soft": "à°®à±\80 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿ à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలిà°\82ది:$1\nà°\95à±\8aà°¤à±\8dతది à°\87à°ªà±\8dà°ªà±\81à°¡à±\87 à°\87à°µà±\8dà°µà°\82à°¡à°¿ లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
+       "resetpass-validity-soft": "à°®à±\80 à°¸à°\82à°\95à±\87తపదానిà°\95à°¿ à°\95ాలà°\82 à°\9aà±\86à°²à±\8dలిà°\82ది:$1\nà°\95à±\8aà°¤à±\8dతది à°\87à°ªà±\8dà°ªà±\81à°¡à±\87 à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿, లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
        "passwordreset": "సంకేతపదాన్ని మార్చుకోండి",
        "passwordreset-text-one": "ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఈ ఫారమును నింపండి.",
        "passwordreset-text-many": "{{PLURAL:$1|ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఏదో ఒక ఫీల్డును నింపండి.Fill in one of the fields to receive a temporary password via email.}}",
        "selfredirect": "<strong>హెచ్చరిక:</strong> మీరు ఈ పేజీని దానికే దారిమార్పు చేస్తున్నారు. బహుశా మీరు తప్పు దారిమార్పును సూచించి ఉండవచ్చు, లేదా మీరు తప్పుడు పేజీని మారుస్తున్నారు. \nమీరు \"{{int:savearticle}}\" ను నొక్కితే దారిమార్పు పేజీ ఖచ్చితంగా సృష్టించబడుతుంది.",
        "missingcommenttext": "కింద ఓ వ్యాఖ్య రాయండి.",
        "missingcommentheader": "<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం పెట్టలేదు.\n\"{{int:savearticle}}\"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.",
-       "summary-preview": "సారాంశం మునుజూపు:",
+       "summary-preview": "దిదà±\8dà°¦à±\81బాà°\9fà±\81 à°¸à°¾à°°à°¾à°\82à°¶à°\82 à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81:",
        "subject-preview": "విషయపు మునుజూపు:",
        "previewerrortext": "మీ మార్పులు మునుజూపు చూడటంలో తప్పిదమయింది.",
        "blockedtitle": "వాడుకరి నిరోధించబడ్డారు",
        "edit-conflict": "దిద్దుబాటు ఘర్షణ.",
        "edit-no-change": "పాఠ్యంలో మార్పులేమీ చెయ్యలేదు కాబట్టి, మీ మార్పును పట్టించుకోవట్లేదు.",
        "postedit-confirmation-created": "పేజీ సృష్టించబడినది.",
-       "postedit-confirmation-restored": "పేజీ పునసృష్టించబడినది.",
+       "postedit-confirmation-restored": "పేజీని పునస్థాపించాం.",
        "postedit-confirmation-saved": "మీ మార్పు భద్రమయ్యింది.",
        "edit-already-exists": "కొత్త పేజీని సృష్టించలేకపోయాం.\nఅది ఇప్పటికే ఉంది.",
        "defaultmessagetext": "అప్రమేయ సందేశపు పాఠ్యం",
        "revdelete-legend": "సందర్శక నిబంధనలు అమర్చు",
        "revdelete-hide-text": "కూర్పు పాఠ్యం",
        "revdelete-hide-image": "ఫైలులోని విషయాన్ని దాచు",
-       "revdelete-hide-name": "పారామితà±\81లనà±\81, à°²à°\95à±\8dà°·à±\8dయానà±\8dà°¨à±\80 à°¦à°¾à°¯à°¿",
+       "revdelete-hide-name": "పారామితà±\81లనà±\81, à°²à°\95à±\8dà°·à±\8dయానà±\8dà°¨à±\80 à°¦à°¾à°\9aà±\81",
        "revdelete-hide-comment": "దిద్దుబాటు సారాంశం",
        "revdelete-hide-user": "దిద్దుబాటు చేసిన వాడుకరి పేరు/ఐపీ చిరునామా",
        "revdelete-hide-restricted": "డేటాను అందరిలాగే నిర్వాహకులకు కూడా కనబడనివ్వకు",
        "search-interwiki-caption": "సోదర ప్రాజెక్టులు",
        "search-interwiki-default": "$1 నుండి ఫలితాలు:",
        "search-interwiki-more": "(మరిన్ని)",
+       "search-interwiki-more-results": "మరిన్ని ఫలితాలు",
        "search-relatedarticle": "సంబంధించినవి",
        "searchrelated": "సంబంధించినవి",
        "searchall": "అన్నీ",
        "preferences": "అభిరుచులు",
        "mypreferences": "అభిరుచులు",
        "prefs-edits": "దిద్దుబాట్ల సంఖ్య:",
-       "prefsnologintext2": "à°®à±\80 à°\85à°­à°¿à°°à±\81à°\9aà±\81లనà±\81 à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\81à°¨à±\87à°\82à°¦à±\81à°\95à±\81 à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి.",
+       "prefsnologintext2": "à°®à±\80 à°\85à°­à°¿à°°à±\81à°\9aà±\81లనà±\81 à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\81à°¨à±\87à°\82à°¦à±\81à°\95à±\81 à°²à°¾à°\97ినవండి.",
        "prefs-skin": "రూపు",
        "skin-preview": "మునుజూడు",
        "datedefault": "ఏదైనా పరవాలేదు",
        "youremail": "ఈమెయిలు:",
        "username": "{{GENDER:$1|వాడుకరి పేరు}}:",
        "prefs-memberingroups": "ఈ {{PLURAL:$1|గుంపులో|గుంపులలో}} {{GENDER:$2|సభ్యుడు|సభ్యురాలు}}:",
+       "group-membership-link-with-expiry": "$1 ($2 వరకు)",
        "prefs-registration": "నమోదైన సమయం:",
        "yourrealname": "అసలు పేరు:",
        "yourlanguage": "భాష:",
        "badsig": "సంతకం చెల్లనిది.\nHTML ట్యాగులను ఒకసారి సరిచూసుకోండి.",
        "badsiglength": "మీ సంతకం చాలా పెద్దగా ఉంది.\nఇది తప్పనిసరిగా $1 {{PLURAL:$1|అక్షరం|అక్షరాల}} లోపులోనే ఉండాలి.",
        "yourgender": "మిమ్మల్ని మీరు ఎలా వర్ణించుకుంటారు?",
-       "gender-unknown": "సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°®à°¿à°®à±\8dమలà±\8dని à°¸à°\82à°¬à±\8bధిà°\82à°\9aà±\87à°\9fà°ªà±\8dపుడు, వీలైనంతవరకు లింగ తటస్థతను పాటిస్తుంది",
+       "gender-unknown": "సాఫà±\8dà°\9fà±\81à°µà±\87à°°à±\81 à°®à°¿à°®à±\8dమలà±\8dని à°\89దహరిà°\82à°\9aà±\87à°\9fపుడు, వీలైనంతవరకు లింగ తటస్థతను పాటిస్తుంది",
        "gender-male": "అతను వికీ పేజీలను సరిదిద్దుతాడు",
        "gender-female": "ఆమె వికీ పేజీలను సరిదిద్దుతుంది",
        "prefs-help-gender": "ఈ అభిరుచిని అమర్చుకోవడం ఐచ్చికం.\nమిమ్మల్ని సంబోధించేప్పుడూ మిమ్మల్ని పేర్కొనేప్పుడూ వ్యాకరణపరంగా సరైన లింగాన్ని  వాడటానికి ఈ విలువ ఉపయోగపడుతుంది.\nఈ సమాచారం బహిరంగం.",
        "userrights-user-editname": "వాడుకరిపేరును ఇవ్వండి:",
        "editusergroup": "వాడుకరి గుంపులను చూపించు",
        "editinguser": "{{GENDER:$1|user}} వాడుకరి హక్కులను మారుస్తున్నారు <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "వాడుకరి సమూహాలను మార్చండి",
+       "userrights-editusergroup": "{{GENDER:$1|వాడుకరి}} సమూహాలను మార్చండి",
+       "userrights-viewusergroup": "{{GENDER:$1|వాడుకరి}} గుంపులను చూడండి",
        "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": "ఇతర వికీలలో వాడుకరి హక్కులను మార్చడానికి మీకు అనుమతి లేదు.",
        "userrights-nodatabase": "$1 అనే డేటాబేసు లేదు లేదా అది స్థానికం కాదు.",
        "userrights-changeable-col": "మీరు మార్చదగిన గుంపులు",
        "userrights-unchangeable-col": "మీరు మార్చలేని గుంపులు",
+       "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-conflict": "వాడుకరి హక్కుల మార్పులలో ఘర్షణ! మీ మార్పులను సమీక్షించి, నిర్ధారించండి.",
        "group": "గుంపు:",
        "group-user": "వాడుకరులు",
        "recentchanges-legend-heading": "<strong>సూచిక :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "recentchanges-submit": "చూపించు",
+       "rcfilters-filterlist-title": "వడపోతలు",
+       "rcfilters-highlightmenu-title": "ఒక రంగును ఎంచుకోండి",
+       "rcfilters-filtergroup-registration": "వాడుకరి నమోదు",
        "rcfilters-filter-editsbyself-label": "మీ స్వంత దిద్దుబాట్లు",
        "rcfilters-filter-editsbyself-description": "మీ దిద్దుబాట్లు.",
        "rcfilters-filter-editsbyother-label": "ఇతరుల దిద్దుబాట్లు",
        "uploaddisabledtext": "ఫైళ్ళ ఎక్కింపులను అచేతనం చేసారు.",
        "php-uploaddisabledtext": "PHPలో ఫైలు ఎక్కింపులు అచేతనమై ఉన్నాయి.\nదయచేసి file_uploads అమరికని చూడండి.",
        "uploadscripted": "ఈ ఫైల్లో HTML కోడు గానీ స్క్రిప్టు కోడు గానీ ఉంది. వెబ్ బ్రౌజరు దాన్ని పొరపాటుగా అనువదించే అవకాశం ఉంది.",
-       "uploadscriptednamespace": "ఈ SVG ఫైలులోని పేరుబరి \"$1\" చెల్లనిది",
+       "uploadscriptednamespace": "ఈ SVG ఫైలులోని పేరుబరి \"<nowiki>$1</nowiki>\" చెల్లనిది",
        "uploadinvalidxml": "ఎక్కించిన ఫైలులోని XML ను పార్సు చెయ్యలేకపోయాం.",
        "uploadvirus": "ఈ ఫైలులో వైరస్‌ ఉంది! వివరాలు: $1",
        "uploadjava": "ఇదొక ZIP ఫైలు, ఇందులో ఒక Java .class ఫైలు ఉంది.\nJava ఫైళ్ళ వలన భద్రతకు తూట్లు పడే అవకాశం ఉంది కాబట్టి, వాటిని ఎక్కించడానికి అనుమతి లేదు.",
        "backend-fail-read": "దస్త్రము \"$1\" ని చదువలేకపోయాం.",
        "backend-fail-create": "ఫైలు \"$1\" లో రాయలేకపోయాం.",
        "backend-fail-maxsize": "\"$1\" ఫైలు {{PLURAL:$2|ఒక బైట్|$2 బైట్ల}} కంటే పెద్దది కావడం చేత దాన్ని రాయలేకపోయాం.",
-       "backend-fail-readonly": "స్టోరేజి బ్యాక్‍ఎండ్ \"$1\" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: \"<em>$2</em>\"",
+       "backend-fail-readonly": "స్టోరేజి బ్యాక్‍ఎండ్ \"$1\" ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది. దానికి కారణం: <em>$2</em>",
        "backend-fail-synced": "ఫైలు \"$1\" అంతర్గత స్టోరేజి బ్యాక్‍ఎండ్లలో అసమ స్థితిలో ఉంది",
        "backend-fail-connect": "స్టోరేజీ బ్యాక్‍ఎండ్ \"$1\" కి కనెక్టు కాలేక పోయాం.",
        "backend-fail-internal": "స్టోరేజీ బ్యాక్‍ఎండ్ \"$1\" లో ఏదో తెలియని లోపం దొర్లింది.",
        "nolicense": "దేన్నీ ఎంచుకోలేదు",
        "licenses-edit": "లైసెన్సు ఎంపికలను సవరించు",
        "license-nopreview": "(మునుజూపు అందుబాటులో లేదు)",
-       "upload_source_url": " (సార్వజనికంగా అందుబాటులో ఉన్న, సరైన URL)",
+       "upload_source_url": "(సరైన, సార్వజనికంగా అందుబాటులో ఉన్న URL నుండి మీరు ఎంచుకున్న ఫైలు)",
        "upload_source_file": "(మీ కంప్యూటరు నుండి ఎంచుకోబడిన దస్త్రం)",
        "listfiles-delete": "తొలగించు",
        "listfiles-summary": "ఈ ప్రత్యేక పేజీ, ఎక్కించిన ఫైళ్ళన్నిటినీ చూపిస్తుంది.",
        "filerevert-legend": "ఫైలును వెనక్కు తీసుకుపో",
        "filerevert-intro": "మీరు '''[[Media:$1|$1]]''' ను [$3, $2 నాటి $4 కూర్పు]కు తీసుకు వెళ్తున్నారు.",
        "filerevert-comment": "కారణం:",
-       "filerevert-defaultcomment": "$2, $1 నాటి కూర్పుకు తీసుకువెళ్ళాం",
+       "filerevert-defaultcomment": "$2, $1 ($3) నాటి కూర్పుకు తీసుకువెళ్ళాం",
        "filerevert-submit": "వెనక్కు తీసుకువెళ్ళు",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> ను  [$4 $2 $3 నాటి కూర్పు]కు తీసుకువెళ్ళాం.",
        "filerevert-badversion": "మీరిచ్చిన టైముస్టాంపుతో ఈ ఫైలుకు స్థానిక కూర్పేమీ లేదు.",
        "apisandbox-dynamic-error-exists": "\"$1\" అనే పరామితి ఇప్పటికే ఉంది.",
        "apisandbox-results": "ఫలితాలు",
        "apisandbox-request-url-label": "అభ్యర్థన URL:",
-       "apisandbox-request-time": "అభ్యర్ధన సమయం: $1",
+       "apisandbox-request-time": "అభ్యర్ధన సమయం: {{PLURAL:$1|$1 మి.సె.}}",
        "apisandbox-continue": "కొనసాగించు",
        "apisandbox-continue-clear": "తుడిచివేయి",
        "apisandbox-multivalue-all-namespaces": "$1 (అన్ని పేరుబరులు)",
        "emailccsubject": "$1 కు మీరు పంపిన సందేశపు ప్రతి: $2",
        "emailsent": "ఈ-మెయిలు పంపించాం",
        "emailsenttext": "మీ ఈ-మెయిలు సందేశం పంపబడింది.",
-       "emailuserfooter": "ఈ ఈ-మెయిలుని $2 కి {{SITENAME}} లోని \"వాడుకరికి ఈమెయిలు\" అనే సౌలభ్యం ద్వారా $1 పంపించారు.",
+       "emailuserfooter": "ఈ ఈమెయిలును  $1, {{GENDER:$2|$2}} కు {{SITENAME}} లోని \"{{int:emailuser}}\" ఫంక్షను ద్వారా {{GENDER:$1|పంపించారు}}. {{GENDER:$2|మీరు}} ఈ ఈమెయిలుకు జవాబు పంపిస్తే, {{GENDER:$2|మీ}} మెయిలును నేరుగా {{GENDER:$1|ఒరిజినల్ సెండరుకు}} పంపిస్తాం. దీనితో, {{GENDER:$2|మీ}} ఈమెయిలు అడ్రసు {{GENDER:$1|వారికి}} తెలిసిపోతుంది.",
        "usermessage-summary": "వ్యవస్థ సందేశాన్ని వదిలివేస్తున్నాం.",
        "usermessage-editor": "వ్యవస్థ సందేశకులు",
        "watchlist": "వీక్షణ జాబితా",
        "mywatchlist": "వీక్షణ జాబితా",
        "watchlistfor2": "$1 కొరకు $2",
        "nowatchlist": "మీ వీక్షణ జాబితా ఖాళీగా ఉంది.",
-       "watchlistanontext": "à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా à°²à±\8bని à°\85à°\82శాలనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°²à±\87దా à°®à°¾à°°à±\8dà°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°®à±\80à°°à±\81 $1.",
+       "watchlistanontext": "à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా à°²à±\8bని à°\85à°\82శాలనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°²à±\87దా à°®à°¾à°°à±\8dà°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°²à°¾à°\97ినవà°\82à°¡à°¿.",
        "watchnologin": "లాగిన్‌ అయిలేరు",
        "addwatch": "వీక్షణ జాబితాలో చేర్చు",
-       "addedwatchtext": "\"[[:$1]]\" అనే పుట మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేరింది.\nభవిష్యత్తులో ఈ పుటకి మరియు సంబంధిత చర్చాపుటకి జరిగే మార్పులు అక్కడ కనిపిస్తాయి.",
+       "addedwatchtext": "\"[[:$1]]\" అనే పేజీని, దాని చర్చ పేజీనీ మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేర్చాం.",
+       "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": "ఈ పుట మీద కన్నేసి ఉంచు",
        "watchlist-details": "మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}, చర్చా పేజీలని వదిలేసి.",
        "wlheader-enotif": "ఈ-మెయిలు గమనికలు పంపబడతాయి.",
        "wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
-       "wlnote": "$3 నాడు $4 సమయానికి, గడచిన {{PLURAL:$2|గంటలో|'''$2''' గంటలలో}} జరిగిన {{PLURAL:$1|ఒక్క మార్పు కింద ఉంది|'''$1''' మార్పులు కింద ఉన్నాయి}}.",
+       "wlnote": "$3, $4 ల సమయానికి, అంతకు ముందరి {{PLURAL:$2|గంటలో|<strong>$2</strong> గంటల్లో}} జరిగిన {{PLURAL:$1|మార్పును|<strong>$1</strong> మార్పులను}} కింద ఇచ్చాం.",
        "wlshowlast": "గత $1 గంటల $2 రోజులకు చూపించు",
        "watchlist-hide": "దాచు",
        "watchlist-submit": "చూపించు",
        "wlshowhidebots": "బాట్‌లు",
        "wlshowhideliu": "నమోదైన వాడుకరులు",
        "wlshowhideanons": "అజ్ఞాత వాడుకరులు",
+       "wlshowhidepatr": "నిఘాలో ఉన్న మార్పులు",
        "wlshowhidemine": "నా మార్పులు",
        "wlshowhidecategorization": "పేజీ వర్గీకరణ",
        "watchlist-options": "వీక్షణ జాబితా ఎంపికలు",
        "deletepage": "పేజీని తొలగించు",
        "confirm": "ధృవీకరించు",
        "excontent": "ఉన్న విషయ సంగ్రహం: '$1'",
-       "excontentauthor": "à°\89à°¨à±\8dà°¨ à°µà°¿à°·à°¯ à°¸à°\82à°\97à±\8dà°°à°¹à°\82: \"$1\" (మరియà±\81 à°¦à±\80ని à°\92à°\95à±\87 à°\92à°\95à±\8dà°\95 à°°à°\9aయిత \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "à°\89à°¨à±\8dà°¨ à°ªà°¾à° à±\8dà°¯à°\82: \"$1\", à°\89à°¨à±\8dà°¨ à°\92à°\95à±\87 à°\92à°\95à±\8dà°\95 à°°à°\9aయిత: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|à°\9aà°°à±\8dà°\9a]])",
        "exbeforeblank": "ఖాళీ చెయ్యకముందు పేజీలో ఉన్న విషయ సంగ్రహం: '$1'",
        "delete-confirm": "\"$1\"ని తొలగించు",
        "delete-legend": "తొలగించు",
        "rollback-success": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.",
        "sessionfailure-title": "సెషను వైఫల్యం",
        "sessionfailure": "మీ ప్రవేశపు సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\n\"back\" కొట్టి, ఎక్కడి నుండి వచ్చారో ఆ పేజీని మళ్ళీ లోడు చేసి, తిరిగి ప్రయత్నించండి.",
+       "changecontentmodel-legend": "కంటెంటు మోడల్‌ మార్పు",
        "changecontentmodel-title-label": "పేజీ శీర్షిక",
+       "changecontentmodel-model-label": "కొత్త కంటెంటు మోడల్",
        "changecontentmodel-reason-label": "కారణం:",
        "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, పేజీ $3 ను డిఫాల్టు కాని కంటెంటు మోడలు \"$5\" తో {{GENDER:$2|సృష్టించారు}}",
+       "logentry-contentmodel-change": "$1 పేజీ $3 యొక్క కంటెంటు మోడలును \"$4\" నుండి \"$5\" కు {{GENDER:$2|మార్చారు}}",
+       "logentry-contentmodel-change-revertlink": "తిప్పికొట్టు",
+       "logentry-contentmodel-change-revert": "తిప్పికొట్టు",
        "protectlogpage": "సంరక్షణల చిట్టా",
        "protectlogtext": "ఈ క్రింద ఉన్నది పేజీల సంరక్షణలకు జరిగిన మార్పుల జాబితా.\nప్రస్తుతం అమలులో ఉన్న సంరక్షణలకై [[Special:ProtectedPages|సంరక్షిత పేజీల జాబితా]]ను చూడండి.",
        "protectedarticle": "\"[[$1]]\" సంరక్షించబడింది.",
        "modifiedarticleprotection": "\"[[$1]]\" సరక్షణ స్థాయిని మార్చాం",
        "unprotectedarticle": "\"[[$1]]\" యొక్క సంరక్షణను తొలగించారు",
        "movedarticleprotection": "సంరక్షణా అమరికని \"[[$2]]\" నుండి \"[[$1]]\"కి మార్చారు",
+       "protectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షించారు}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" యొక్క {{GENDER:$2|సంరక్షణ స్థాయిని మార్చారు}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షణ నుండి తీసివేసారు}}",
        "protect-title": "\"$1\" యొక్క సంరక్షణ స్థాయి అమర్పు",
        "protect-title-notallowed": "\"$1\" యొక్క సంరక్షణ స్థాయి",
        "prot_1movedto2": "$1, $2కు తరలించబడింది",
        "protect-locked-blocked": "నిరోధించబడి ఉండగా మీరు సంరక్షణ స్థాయిని మార్చలేరు. ప్రస్తుతం '''$1''' పేజీకి ఉన్న సెట్టింగులివి:",
        "protect-locked-dblock": "ప్రస్తుతం అమల్లో ఉన్న డేటాబేసు లాకు కారణంగా సంరక్షణ స్థాయిని సెట్ చెయ్యడం కుదరదు. ప్రస్తుతం '''$1''' పేజీకి ఉన్న సెట్టింగులివి:",
        "protect-locked-access": "మీ ఖాతకు పేజీ రక్షన స్థాయిని మార్చే హక్కులు లేవు.\n'''$1''' అనే పేరున్న ఈ పేజీకి ప్రస్తుతం ఈ రక్షణ ఉంది:",
-       "protect-cascadeon": "ఈ పేజీ కాస్కేడింగు రక్షణలో ఉన్న ఈ కింది {{PLURAL:$1|పేజీకి|పేజీలకు}} జతచేయటం వలన, ప్రస్తుతం రక్షణలో ఉంది.  మీరు ఈ పేజీ యొక్క రక్షణ స్థాయిన మార్చవచ్చు, దాని వలన కాస్కేడింగు రక్షణకు ఎటువంటి సమస్య ఉండదు.",
+       "protect-cascadeon": "ఈ పేజీ, కాస్కేడింగు రక్షణలో ఉన్న {{PLURAL:$1|పేజీలో|పేజీల్లో}} ట్రాన్స్‌క్లూడు అయి ఉంది కాబట్టి, ప్రస్తుతం ఇది కూడా సంరక్షణలో ఉంది.\nఈ పేజీ సంరక్షణ స్థాయిలో చేసే మార్పులు కాస్కేడింగు సంరక్షణను ప్రభావితం చెయ్యవు.",
        "protect-default": "అందరు వాడుకరులను అనుమతించు",
        "protect-fallback": "\"$1\" అనుమతి ఉన్న వాడుకరులను మాత్రమే అనుమతించు",
        "protect-level-autoconfirmed": "స్వయన్నిర్ధారిత వాడుకరులను మాత్రమే అనుమతించు",
        "undeletepagetext": "క్రింది {{PLURAL:$1|పేజీని|$1 పేజీలను}} తొలగించారు, కానీ పునఃస్థాపనకు వీలుగా భండాగారంలో ఉన్నాయి.\nభండాగారం నిర్ణీత వ్యవధులలో పూర్తిగా ఖాళీ చేయబడుతుంటుంది.",
        "undelete-fieldset-title": "కూర్పులను పునఃస్థాపించండి",
        "undeleteextrahelp": "పేజీ యొక్క మొత్తం చరిత్రను పునస్థాపించేందుకు, చెక్ బాక్సులన్నిటినీ ఖాళీగా ఉంచి, '''''{{int:undeletebtn}}''''' నొక్కండి.\nకొన్ని కూర్పులను మాత్రమే పుసస్థాపించదలిస్తే, సదరు కూర్పులకు ఎదురుగా ఉన్న చెక్ బాక్సులలో టిక్కు పెట్టి, '''''{{int:undeletebtn}}''''' నొక్కండి.",
-       "undeleterevisions": "$1 {{PLURAL:$1|కూర్పును|కూర్పులను}} భాండారానికి చేర్చాం",
+       "undeleterevisions": "$1, {{PLURAL:$1|కూర్పును|కూర్పులను}} తొలగించారు",
        "undeletehistory": "పేజీని పునఃస్థాపిస్తే, అన్ని సంచికలూ పేజీచరిత్ర దినచర్యలోకి పునఃస్థాపించబడతాయి.\nతుడిచివేయబడిన తరువాత, అదే పేరుతో వేరే పేజీ సృష్టించబడి ఉంటే, పునఃస్థాపించిన సంచికలు ముందరి చరిత్రలోకి వెళ్తాయి.",
        "undeleterevdel": "తొలగింపును రద్దు చేస్తున్నప్పుడు, అన్నిటికంటే పైనున్న కూర్పు పాక్షికంగా తొలగింపబడే పక్షంలో తొలగింపు-రద్దు జరగదు. అటువంటి సందర్భాల్లో, తొలగించిన కూర్పులలో కొత్తవాటిని ఎంచుకోకుండా ఉండాలి, లేదా దాపు నుండి తీసెయ్యాలి.",
        "undeletehistorynoadmin": "ఈ పుటని తొలగించివున్నారు.\nతొలగింపునకు కారణం, తొలగింపునకు క్రితం ఈ పుటకి మార్పులు చేసిన వాడుకరుల వివరాలతో సహా, ఈ కింద సారాంశంలో చూపబడింది.\nతొలగించిన కూర్పులలోని వాస్తవ పాఠ్యం నిర్వాహకులకు మాత్రమే అందుబాటులో ఉంటుంది.",
        "unblock": "వాడుకరిపై నిరోధాన్ని తీసెయ్యండి",
        "blockip": "{{GENDER:$1|వాడుకరిని}} నిరోధించు",
        "blockip-legend": "వాడుకరి నిరోధం",
-       "blockiptext": "ఏదైనా ప్రత్యేక ఐపీ చిరునామానో లేదా వాడుకరిపేరునో రచనలు చెయ్యకుండా నిరోధించాలంటే కింది ఫారాన్ని వాడండి.\nకేవలం దుశ్చర్యల నివారణ కోసం మాత్రమే దీన్ని వాడాలి, అదికూడా [[{{MediaWiki:Policy-url}}|విధానాన్ని]] అనుసరించి మాత్రమే.\nస్పష్టమైన కారణాన్ని కింద రాయండి (ఉదాహరణకు, దుశ్చర్యలకు పాల్పడిన పేజీలను ఉదహరించండి).",
+       "blockiptext": "ఏదైనా ప్రత్యేక ఐపీ చిరునామానో లేదా వాడుకరిపేరునో రచనలు చెయ్యకుండా నిరోధించాలంటే కింది ఫారాన్ని వాడండి.\nకేవలం దుశ్చర్యల నివారణ కోసం మాత్రమే దీన్ని వాడాలి, అదికూడా [[{{MediaWiki:Policy-url}}|విధానాన్ని]] అనుసరించి మాత్రమే.\nస్పష్టమైన కారణాన్ని కింద రాయండి (ఉదాహరణకు, దుశ్చర్యలకు పాల్పడిన పేజీలను ఉదహరించండి).\n[https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] సిన్‌టాక్సును వాడి ఐపీ అడ్రసు శ్రేణిని నిరోధించవచ్చు; అనుమతించబడ్డ అతిపెద్ద శ్రేణి: IPv4 కు /$1, IPv6 కు /$2.",
        "ipaddressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "ipbexpiry": "అంతమయ్యే గడువు",
        "ipbreason": "కారణం:",
        "unblocked": "[[User:$1|$1]]పై నిరోధం తొలగించబడింది",
        "unblocked-range": "$1 పై నిరోధాన్ని తీసేసాం",
        "unblocked-id": "$1 అనే నిరోధాన్ని తొలగించాం",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] పైనున్న నిరోధాన్ని ఎత్తివేసాం.",
        "blocklist": "నిరోధిత వాడుకరులు",
        "ipblocklist": "నిరోధించబడిన వాడుకరులు",
        "ipblocklist-legend": "నిరోధించబడిన వాడుకరిని వెతకండి",
        "lockedbyandtime": "($2 న $3 వద్ద {{GENDER:$1|$1}} ద్వారా)",
        "move-page": "$1 తరలింపు",
        "move-page-legend": "పేజీని తరలించు",
-       "movepagetext": "à°\95à°¿à°\82ది à°«à°¾à°°à°\82 à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿, à°\93 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°µà°\9aà±\8dà°\9aà±\81. à°¦à°¾à°\82à°¤à±\8b à°ªà°¾à°\9fà±\81 à°¦à°¾à°¨à°¿ à°\9aà°°à°¿à°¤à±\8dà°° à°\85à°\82తా à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°\9cà±\80 à°\9aà°°à°¿à°¤à±\8dà°°à°\97à°¾ à°®à°¾à°°à±\81à°¤à±\81à°\82ది.\nపాత à°ªà±\87à°\9cà±\80 à°\95à±\8aà°¤à±\8dà°¤ à°¦à°¾à°¨à°¿à°\95à°¿ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80 à°\85à°µà±\81à°¤à±\81à°\82ది.\nపాత à°ªà±\87à°\9cà±\80à°\95à°¿ à°\89à°¨à±\8dà°¨ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80లనà±\81 à°\86à°\9fà±\8bà°®à±\86à°\9fà°¿à°\97à±\8dà°\97à°¾ à°¸à°°à°¿à°\9aà±\87యవà°\9aà±\8dà°\9aà±\81.\nà°\86లా à°\9aà±\87యవదà±\8dదనà±\81à°\95à±\81à°\82à°\9fà±\87, [[Special:DoubleRedirects|à°\9cమిలి]] à°²à±\87దా [[Special:BrokenRedirects|పనిà°\9aà±\87యని à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81]] à°\89à°¨à±\8dనాయà±\87à°®à±\8b à°¸à°°à°¿à°\9aà±\82à°¸à±\81à°\95à±\8bà°\82à°¡à°¿.\nలిà°\82à°\95à±\81లనà±\8dà°¨à±\80 à°\85à°¨à±\81à°\95à±\81à°¨à±\8dà°¨à°\9fà±\8dà°²à±\81à°\97à°¾ à°\9aà±\87రవలసిన à°\9aà±\8bà°\9fà°¿à°\95à±\87 à°\9aà±\87à°°à±\81à°¤à±\81à°¨à±\8dనాయని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\8bవలసిన à°¬à°¾à°§à±\8dయత à°®à±\80à°¦à±\87.\n\nà°\92à°\95à°µà±\87à°³ à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¤à±\8b à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\92à°\95 à°ªà±\87à°\9cà±\80 à°\89à°\82à°¡à°¿ à°\89à°\82à°\9fà±\87 (à°\85ది à°\97à°¤ à°®à°¾à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à±\8dà°° à°²à±\87ని à°\96ాళà±\80 à°ªà±\87à°\9cà±\80à°¨à±\8b à°²à±\87దా à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80à°¨à±\8b à°\95à°¾à°\95à°ªà±\8bà°¤à±\87) à°¤à°°à°²à°¿à°\82à°ªà±\81 '''à°\9cà°°à°\97à°¦à±\81'''.\nà°\85à°\82à°\9fà±\87 à°®à±\80à°°à±\81 à°ªà±\8aరపాà°\9fà±\81 à°\9aà±\87à°¸à±\8dà°¤à±\87 à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¨à±\81 à°®à°¾à°°à±\8dà°\9aà°¿ à°¤à°¿à°°à°¿à°\97à°¿ à°ªà°¾à°¤ à°ªà±\87à°°à±\81à°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\81à°°à°¾à°\97లరà±\81 à°\95ానà±\80 à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°µà±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80ని à°¤à±\81à°¡à°¿à°\9aà°¿à°µà±\87యలà±\87à°°à±\81.\n\n<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95!</strong>\nà°\87ది à°\9cనరà°\82à°\9cà°\95à°®à±\88à°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 à°\85à°¨à±\81à°\95à±\8bని, à°¤à±\80à°µà±\8dà°°à°®à±\88à°¨ à°®à°¾à°°à±\8dà°ªà±\81 à°\95ావà°\9aà±\8dà°\9aà±\81;\nదాని à°ªà°°à°¿à°£à°¾à°®à°¾à°²à°¨à±\81 à°\85à°°à±\8dà°§à°\82 à°\9aà±\87à°¸à±\81à°\95à±\81ని à°®à±\81à°\82à°¦à±\81à°\95à±\81సాగండి.",
-       "movepagetext-noredirectfixer": "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. \nపాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.\n[[Special:DoubleRedirects|double]] లేదా [[Special:BrokenRedirects|broken redirects]] లను చూడటం మరువకండి.\nలింకులు వెళ్ళాల్సిన చోటికి వెళ్తున్నాయని నిర్ధారించుకోవాల్సిన బాధ్యత మీదే.\nకొత్త పేరుతో ఈసరికే ఏదైనా పేజీ ఉంటే - అది ఖాళీగా ఉన్నా లేక మార్పుచేర్పుల చరిత్ర ఏమీ లేని దారిమార్పు పేజీ అయినా తప్ప- తరలింపు ’’’జరుగదు’’’ అని గమనించండి.\nఅంటే, ఏదైనా పొరపాటు జరిగితే పేరును తిరిగి పాత పేరుకే మార్చగలరు తప్ప, ఈపాటికే ఉన్న పేజీపై ఓవరరైటు చెయ్యలేరు.\n\n'''హెచ్చరిక!'''\nబహుళ వ్యాప్తి పొందిన ఓ పేజీలో ఈ మార్పు చాలా తీవ్రమైనది, ఊహించనిదీ అవుతుంది.\nదాని పర్యవసానాలు అర్థం చేసుకున్నాకే ముందుకు వెళ్ళండి.",
-       "movepagetalktext": "దానితà±\8b à°ªà°¾à°\9fà±\81 à°¸à°\82à°¬à°\82ధిత à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°\95à±\82à°¡à°¾ à°\86à°\9fà±\8bమాà°\9fà°¿à°\95à±\8dâ\80\8câ\80\8cà°\97à°¾ à°¤à°°à°²à°¿à°\82à°\9aబడà±\81à°¤à±\81à°\82ది, '''à°\95à°¿à°\82ది à°¸à°\82దరà±\8dభాలలà±\8b à°¤à°ªà±\8dà°ª:'''\n*à°\92à°\95 à°¨à±\87à°\82à°¸à±\8dà°ªà±\87à°¸à±\81 à°¨à±\81à°\82à°¡à°¿ à°\87à°\82à°\95à±\8bదానిà°\95à°¿ à°¤à°°à°²à°¿à°\82à°\9aà±\87à°\9fà°ªà±\81à°¡à±\81,\n*à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¤à±\8b à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\92à°\95 à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°\89à°\82à°\9fà±\87,\n*à°\95à°¿à°\82ది à°\9aà±\86à°\95à±\8dâ\80\8cబాà°\95à±\8dà°¸à±\81à°²à±\8b à°\9fà°¿à°\95à±\8dà°\95à±\81 à°ªà±\86à°\9fà±\8dà°\9fà°\95à°ªà±\8bà°¤à±\87.\n\nà°\86 à°¸à°\82దరà±\8dభాలలà±\8b, à°®à±\80à°°à±\81 à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80ని à°\95à±\82à°¡à°¾ à°ªà°¨à°¿à°\97à°\9fà±\8dà°\9fà±\81à°\95à±\81ని à°¤à°°à°²à°¿à°\82à°\9aవలసి à°\89à°\82à°\9fà±\81à°\82ది, à°²à±\87దా à°\8fà°\95à±\80à°\95à±\83à°¤ à°ªà°°à°\9aవలసి ఉంటుంది.",
+       "movepagetext": "à°\95à°¿à°\82ది à°«à°¾à°°à°¾à°¨à±\8dని à°\89పయà±\8bà°\97à°¿à°\82à°\9aà°¿, à°\93 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°µà°\9aà±\8dà°\9aà±\81. à°¦à°¾à°¨à°¿ à°\9aà°°à°¿à°¤à±\8dà°° à°ªà±\82à°°à±\8dతిà°\97à°¾ à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°\95à±\81 à°¤à°°à°²à°¿à°ªà±\8bà°¤à±\81à°\82ది. \nపాత à°¶à±\80à°°à±\8dà°·à°¿à°\95, à°\95à±\8aà°¤à±\8dతదానిà°\95à°¿ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80à°\97à°¾ à°®à°¾à°°à°¿à°ªà±\8bà°¤à±\81à°\82ది.\nపాత à°ªà±\87à°\9cà±\80à°\95à°¿ à°\89à°¨à±\8dà°¨ à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80లనà±\81 à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¸à°°à°¿à°\9aà±\87యవà°\9aà±\8dà°\9aà±\81.\nà°\86లా à°\9aà±\87యవదà±\8dదనà±\81à°\95à±\81à°\82à°\9fà±\87, [[Special:DoubleRedirects|à°\9cమిలి]] à°²à±\87దా [[Special:BrokenRedirects|పనిà°\9aà±\87యని à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81]] à°\89à°¨à±\8dనాయà±\87à°®à±\8b à°¸à°°à°¿à°\9aà±\82à°¸à±\81à°\95à±\8bà°\82à°¡à°¿.\nలిà°\82à°\95à±\81à°²à±\81 à°µà±\86à°³à±\8dళాలà±\8dసిన à°\9aà±\8bà°\9fà°¿à°\95à°¿ à°µà±\86à°³à±\8dà°¤à±\81à°¨à±\8dనాయని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\8bవాలà±\8dసిన à°¬à°¾à°§à±\8dయత à°®à±\80à°¦à±\87.\n\nà°\92à°\95à°µà±\87à°³ à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¤à±\8b à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\92à°\95 à°ªà±\87à°\9cà±\80 à°\89à°\82à°¡à°¿ à°\89à°\82à°\9fà±\87 (à°\85ది à°\97à°¤ à°®à°¾à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à±\8dà°° à°²à±\87ని à°\96ాళà±\80 à°ªà±\87à°\9cà±\80à°¨à±\8b à°²à±\87దా à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81 à°ªà±\87à°\9cà±\80à°¨à±\8b à°\95à°¾à°\95à°ªà±\8bà°¤à±\87) à°¤à°°à°²à°¿à°\82à°ªà±\81 '''à°\9cà°°à°\97à°¦à±\81'''.\nà°\85à°\82à°\9fà±\87 à°®à±\80à°°à±\81 à°ªà±\8aరపాà°\9fà±\81 à°\9aà±\87à°¸à±\8dà°¤à±\87 à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°¨à±\81 à°®à°¾à°°à±\8dà°\9aà°¿ à°¤à°¿à°°à°¿à°\97à°¿ à°ªà°¾à°¤ à°ªà±\87à°°à±\81à°\95à±\81 à°¤à±\80à°¸à±\81à°\95à±\81à°°à°¾à°\97లరà±\81 à°\97ానà±\80, à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°µà±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80ని à°¤à±\81à°¡à°¿à°\9aà°¿à°µà±\87యలà±\87à°°à±\81.\n\n<strong>à°\97మనిà°\95!</strong>\nà°\9cనరà°\82à°\9cà°\95à°®à±\88à°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\87ది à°\85à°¨à±\81à°\95à±\8bని, à°¤à±\80à°µà±\8dà°°à°®à±\88à°¨ à°®à°¾à°°à±\8dà°ªà±\81 à°\95ావà°\9aà±\8dà°\9aà±\81;\nదాని à°ªà°°à°¿à°£à°¾à°®à°¾à°²à°¨à±\81 à°\85à°°à±\8dà°¥à°\82 à°\9aà±\87à°¸à±\81à°\95à±\81ని à°®à±\81à°\82à°¦à±\81à°\95à±\81 సాగండి.",
+       "movepagetext-noredirectfixer": "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. \nపాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.\n[[Special:DoubleRedirects|జమిలి]] లేదా [[Special:BrokenRedirects|పనిచేయని దారిమార్పులు]] లను చూడటం మరువకండి.\nలింకులు వెళ్ళాల్సిన చోటికి వెళ్తున్నాయని నిర్ధారించుకోవాల్సిన బాధ్యత మీదే.\nకొత్త పేరుతో ఈసరికే ఏదైనా పేజీ ఉంటే - అది మార్పుచేర్పుల చరిత్ర ఏమీ లేని దారిమార్పు పేజీ అయినా తప్ప- తరలింపు <strong>జరుగదు</strong> అని గమనించండి.\nఅంటే, ఏదైనా పొరపాటు జరిగితే పేరును తిరిగి పాత పేరుకే మార్చగలరు తప్ప, ఈపాటికే ఉన్న పేజీని తుడిచివేయలేరు.\n\n<strong>గమనిక:</strong>\nబహుళ వ్యాప్తి పొందిన ఓ పేజీలో ఈ మార్పు చాలా తీవ్రమైనది, ఊహించనిదీ అవుతుంది.\nదాని పర్యవసానాలు అర్థం చేసుకున్నాకే ముందుకు వెళ్ళండి.",
+       "movepagetalktext": "à°\88 à°ªà±\86à°\9fà±\8dà°\9fà±\86à°¨à±\81 à°\9aà±\86à°\95à±\8d à°\9aà±\87à°¸à±\8dà°¤à±\87, à°¸à°\82à°¬à°\82ధిత à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°\95à±\82à°¡à°¾ à°\86à°\9fà±\8bమాà°\9fà°¿à°\95à±\8dâ\80\8câ\80\8cà°\97à°¾ à°¤à°°à°²à°¿à°\82à°\9aబడà±\81à°¤à±\81à°\82ది, à°\97à°®à±\8dà°¯à°\82à°²à±\8b à°\88 à°¸à°°à°¿à°\95à±\87 à°\9aà°°à±\8dà°\9a à°ªà±\87à°\9cà±\80 à°\89à°\82à°\9fà±\87 à°¤à°ªà±\8dà°ª.\nà°\86 à°¸à°\82దరà±\8dà°­à°\82à°²à±\8b, à°®à±\80à°°à±\81 à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80ని à°\95à±\82à°¡à°¾ à°ªà°¨à°¿à°\97à°\9fà±\8dà°\9fà±\81à°\95à±\81ని à°¤à°°à°²à°¿à°\82à°\9aà°¡à°®à±\8b, à°µà°¿à°²à±\80à°¨à°\82 à°\9aà±\86à°¯à±\8dయడమà±\8b à°\9aà±\86à°¯à±\8dయాలà±\8dసి ఉంటుంది.",
        "moveuserpage-warning": "'''హెచ్చరిక:''' మీరు ఒక వాడుకరి పేజీని తరలించబోతున్నారు. పేజీ మాత్రమే తరలించబడుతుందనీ, వాడుకరి పేరుమార్పు జరగదనీ గమనించండి.",
        "movecategorypage-warning": "<strong>హెచ్చరిక:</strong> మీరు ఓ వర్గం పేజీని తరలించబోతున్నారు. కేవలం పేజీ మాత్రమే తరలుతుందని, పాత వర్గంలో ఉన్న పేజీలేవీ కొత్త వర్గంలోకి <em>చేరవని</em>  గ్రహించండి.",
        "movenologintext": "పేజీని తరలించడానికి మీరు [[Special:UserLogin|లాగిన్‌]] అయిఉండాలి.",
        "thumbnail-temp-create": "తాత్కాలిక థంబ్‍నెయిల్ ఫైలును సృష్టించలేకపోయాం",
        "thumbnail-dest-create": "థంబ్‍నెయిలును గమ్యస్థానంలో భద్రపరచలేకపోయాం",
        "thumbnail_invalid_params": "నఖచిత్రాలకు సరయిన పారామీటర్లు లేవు",
+       "thumbnail_toobigimagearea": "$1 కంటే పెద్ద కొలతలు గల దస్త్రం",
        "thumbnail_dest_directory": "గమ్యస్థానంలో డైరెక్టరీని సృష్టించలేకపోయాం",
        "thumbnail_image-type": "ఈ బొమ్మ రకానికి మద్దతు లేదు",
        "thumbnail_gd-library": "అసంపూర్ణ GD సంచయపు ఏర్పాటు: $1 ఫంక్షను లేదు.",
        "thumbnail_image-failure-limit": "ఈ థంబ్‍నెయిల్‍ను రెండరు చెయ్యడానికి చాలా ఎక్కువ విఫలయత్నాలు ($1 లేదా అంతకంటే ఎక్కువ) జరిగాయి. కాస్తాగి మళ్ళీ ప్రయత్నించండి.",
        "import": "పేజీలను దిగుమతి చేసుకోండి",
        "importinterwiki": "మరొక వికీ నుండి దిగుమతి",
-       "import-interwiki-text": "దిà°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8bవడానిà°\95à°¿ à°\92à°\95 à°µà°¿à°\95à±\80ని à°®à°°à°¿à°¯à±\81 à°\85à°\82à°¦à±\81à°²à±\8bని à°ªà±\87à°\9cà±\80ని à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿.\nà°\95à±\82à°°à±\8dà°ªà±\81à°² à°¤à±\87à°¦à±\80à°²à±\81 à°®à°°à°¿à°¯à±\81 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సిన à°µà°¾à°°à°¿ à°ªà±\87à°°à±\8dà°²à±\81 à°­à°¦à±\8dరపరà°\9aబడతాయి.\nà°\87తర à°µà°¿à°\95à±\80లనà±\81à°\82à°¡à°¿ à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dà°¨ à°¦à°¿à°\97à±\81మతà±\81à°² à°\9aà°°à±\8dà°¯లన్నీ [[Special:Log/import|దిగుమతుల చిట్టా]]లో నమోదవుతాయి.",
+       "import-interwiki-text": "దిà°\97à±\81మతి à°\9aà±\87à°¸à±\81à°\95à±\8bవడానిà°\95à°¿ à°\93 à°µà°¿à°\95à±\80ని, à°\93 à°ªà±\87à°\9cà±\80à°¨à±\80 à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿.\nà°\95à±\82à°°à±\8dà°ªà±\81à°² à°¤à±\87à°¦à±\80లనà±\81, à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సిన à°µà°¾à°°à°¿ à°ªà±\87à°°à±\8dలనà±\82 à°­à°¦à±\8dరపరà±\81à°¸à±\8dతాà°\82.\nà°\87తర à°µà°¿à°\95à±\80లనà±\81à°\82à°¡à°¿ à°\9aà±\87సిన à°¦à°¿à°\97à±\81మతà±\81లన్నీ [[Special:Log/import|దిగుమతుల చిట్టా]]లో నమోదవుతాయి.",
        "import-interwiki-sourcewiki": "మూల వికీ:",
        "import-interwiki-sourcepage": "మూల పేజీ:",
        "import-interwiki-history": "ఈ పేజీ యొక్క అన్ని చారిత్రక కూర్పులను కాపీ చెయ్యి",
        "importcantopen": "దిగుమతి చేయబోతున్న ఫైలును తెరవలేకపోతున్నాను",
        "importbadinterwiki": "చెడు అంతర్వికీ లింకు",
        "importsuccess": "దిగుమతి పూర్తయ్యింది!",
-       "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.\nఎటువంటి అంతర్వికీ దిగుమతి మూలాలను పేర్కొనకపోవటం వలన, ప్రత్యక్ష చరిత్ర అప్లోడులను నిలిపివేశాం.",
+       "importnosources": "ఏ వికీనుండి దిగుమతి చేసుకోవాలో సూచించలేదు. సూటి చరిత్ర ఎక్కింపులను అచేతనం చేసాం.",
        "importnofile": "ఎటువంటి దిగుమతి ఫైలునూ అప్లోడుచేయలేదు.",
        "importuploaderrorsize": "దిగుమతి ఫైలు అప్లోడు ఫలించలేదు. ఈ ఫైలు అప్లోడు ఫైలుకు నిర్దేశించిన పరిమాణం కంటే పెద్దా ఉంది.",
        "importuploaderrorpartial": "దిగుమతి ఫైలు అప్లోడు ఫలించలేదు. ఈ ఫైలులో కొంత భాగాన్ని మాత్రమే అప్లోడు చేయగలిగం.",
        "import-nonewrevisions": "కూర్పులేవీ దిగుమతి కాలేదు (అవన్నీ ఈసరికే ఉండి ఉండాలి, లేదా లోపాల కారణంగా వదిలెయ్యబడ్డాయి).",
        "xml-error-string": "$1 $2వ లైనులో, వరుస $3 ($4వ బైటు): $5",
        "import-upload": "XML డేటాను అప్‌లోడు చెయ్యి",
-       "import-token-mismatch": "à°¸à±\86à°·à°¨à±\81 à°­à±\8bà°\97à°\9fà±\8dà°\9fà°¾ à°ªà±\8bయిà°\82ది. à°¦à°¯à°\9aà±\87సి à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aండి.",
+       "import-token-mismatch": "à°¸à±\86à°·à°¨à±\81 à°¡à±\87à°\9fà°¾ à°ªà±\8bయిà°\82ది.\n\nà°®à±\80à°°à±\81 à°²à°¾à°\97à±\8cà°\9fà±\88 à°ªà±\8bయి à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81. <strong>లాà°\97à°¿à°¨à±\88 à°\89à°¨à±\8dనారà±\8b à°²à±\87à°¦à±\8b à°\9aà±\82à°¸à±\81à°\95à±\81ని, à°®à°³à±\8dà°³à±\80 à°ªà±\8dరయతà±\8dనిà°\82à°\9aà°\82à°¡à°¿</strong>.\nà°\85ది à°\95à±\82à°¡à°¾ à°ªà°¨à°¿à°\9aà±\86à°¯à±\8dà°¯à°\95à°ªà±\8bà°¤à±\87, à°\93సారి [[Special:UserLogout|లాà°\97à±\8cà°\9fà±\88]] à°®à°³à±\8dà°³à±\80 à°²à°¾à°\97ినవà°\82à°¡à°¿. à°®à±\80 à°¬à±\8dà°°à±\8cà°\9cà°°à±\81 à°\88 à°¸à±\88à°\9fà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°\95à±\82à°\95à±\80లనà±\81 à°\85à°¨à±\81మతిసà±\8dà°¤à±\81à°\82దని à°¨à°¿à°°à±\8dధారిà°\82à°\9aà±\81à°\95à±\8bండి.",
        "import-invalid-interwiki": "మీరు చెప్పిన వికీనుండి దిగుమతి చేయలేము.",
        "import-error-edit": "\"$1\" పేజీలో మార్పుచేర్పులు చేసే అనుమతి మీకు లేదు కాబట్టి, దాన్ని దిగుమతి చెయ్యలేదు.",
        "import-error-create": "\"$1\" పేజీని సృష్టించే అనుమతి మీకు లేదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
-       "import-error-interwiki": "పేజీ \"$1\" యొక్క పేరు బయటి లింకుల (అంతరవికీ) కోసం అట్టేపెట్టబడింది కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
+       "import-error-interwiki": "à°ªà±\87à°\9cà±\80 \"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°ªà±\87à°°à±\81 à°¬à°¯à°\9fà°¿ à°²à°¿à°\82à°\95à±\81à°² (à°\85à°\82తరà±\8dవిà°\95à±\80) à°\95à±\8bà°¸à°\82 à°\85à°\9fà±\8dà°\9fà±\87à°ªà±\86à°\9fà±\8dà°\9fబడిà°\82ది à°\95ాబà°\9fà±\8dà°\9fà°¿ à°¦à°¾à°¨à±\8dని à°¦à°¿à°\97à±\81మతి à°\9aà±\86à°¯à±\8dయలà±\87à°¦à±\81.",
        "import-error-special": "పేజీ \"$1\" ప్రత్యేక పేరుబరికి చెందినది. ఈ పేరుబరిలో పేజీలు సృష్టించే అనుమతి లేదు. అందుచేత దాన్ని దిగుమతి చెయ్యలేదు.",
-       "import-error-invalid": "à°ªà±\87à°\9cà±\80 \"$1\" à°ªà±\87à°°à±\81 సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
+       "import-error-invalid": "à°ªà±\87à°\9cà±\80 \"$1\" à°¨à±\81 à°¦à°¿à°\97à±\81మతి à°\9aà±\87à°¸à±\87 à°\97à°®à±\8dà°¯à°\82 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°\88 à°µà°¿à°\95à±\80à°²à±\8b సరైనది కాదు కాబట్టి దాన్ని దిగుమతి చెయ్యలేదు.",
        "import-error-unserialize": "పేజీ \"$1\" యొక్క కూర్పు $2ను సీరియలించలేకపోయాం. ఈ కూర్పు వాడుతున్న కంటెంటు మోడల్ $3 అని తెలియవచ్చింది. ఈ మోడల్ $4 లాగా సీరియలించబడుతుంది.",
        "import-options-wrong": "తప్పు {{PLURAL:$2|ఐచ్ఛికం|ఐచ్ఛికాలు}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "ఇచ్చిన మూలపు పేజీ సరైన శీర్షిక కాదు.",
        "confirmemail_body_changed": "$1 ఐపీ చిరునామా నుండి ఎవరో, బహుశా మీరే,\n{{SITENAME}}లో \"$2\" అనే ఖాతా యొక్క ఈ-మెయిలు చిరునామాని ఈ చిరునామాకి మార్చారు.\n\nఆ ఖాతా నిజంగా మీదే అని నిర్ధారించేందుకు మరియు {{SITENAME}}లో\nఈ-మెయిలు సౌలభ్యాలని పునఃచేతనం చేసుకునేందుకు, ఈ లంకెని మీ విహారిణిలో తెరవండి:\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": "ఐపీ అడ్రసు $1 నుండి ఎవరో - బహుశా మీరే కావచ్చు -\n{{SITENAME}} లోని ఖాతా ఈమెయిలు అడ్రసు, \"$2\" ను \"$3\" కు మార్చారు.\n\nఅది మీరు కాకపోతే, వెంటనే ఓ సైటు నిర్వాహకుణ్ణి సంప్రదించండి.",
+       "notificationemail_body_removed": "ఐపీ అడ్రసు $1 నుండి ఎవరో - బహుశా మీరే కావచ్చు -\n{{SITENAME}} లోని ఖాతా ఈమెయిలు అడ్రసు, \"$2\" ను తొలగించారు.\n\nఅది మీరు కాకపోతే, వెంటనే ఓ సైటు నిర్వాహకుణ్ణి సంప్రదించండి.",
        "scarytranscludedisabled": "[ఇతరవికీల మూసలను ఇక్కడ వాడటాన్ని అనుమతించటం లేదు]",
        "scarytranscludefailed": "[$1 కొరకు మూసను తీసుకురావటం విఫలమైంది]",
        "scarytranscludetoolong": "[URL మరీ పొడుగ్గా ఉంది]",
        "deletedwhileediting": "'''హెచ్చరిక''': మీరు మార్పులు చేయటం మొదలుపెట్టాక ఈ పేజీ తొలగించబడింది!",
-       "confirmrecreate": "à°®à±\80à°°à±\81 à°ªà±\87à°\9cà±\80 à°°à°¾à°¯à°\9fà°\82 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\81వాత [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°¦à°¾à°¨à°¿à°¨à°¿ à°¤à±\80సివà±\87సారà±\81. à°¦à°¾à°¨à°¿à°\95à°¿ à°\88 à°\95ారణà°\82 à°\87à°\9aà±\8dà°\9aారà±\81: ''$2''\nà°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°³à±\80 à°¤à°¯à°¾à°°à±\81 à°\9aà±\87à°¯ాలనుకుంటున్నారని ధృవీకరించండి.",
-       "confirmrecreate-noreason": "à°®à±\80à°°à±\81 à°®à°¾à°°à±\8dà°\9aà°¡à°\82 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\8dవాత à°\88 à°ªà±\81à°\9fà°¨à±\81 à°µà°¾à°¡à±\81à°\95à°°à°¿ [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81. à°\88 à°ªà±\81à°\9fà°¨à±\81 à°®à±\80à°°à±\81 à°¨à°¿à°\9cà°\82à°\97ానà±\87 à°ªà±\81à°¨à°\83à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aాలనà±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనారని à°¨à°¿à°°à±\8dధారించండి.",
+       "confirmrecreate": "à°®à±\80à°°à±\81 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\81వాత [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°\88 à°ªà±\87à°\9cà±\80ని {{GENDER:$1|à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81}}. à°¦à°¾à°¨à°¿à°\95à°¿ à°\88 à°\95ారణà°\82 à°\87à°\9aà±\8dà°\9aారà±\81: <em>$2</em>\nà°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°³à±\80 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aాలనుకుంటున్నారని ధృవీకరించండి.",
+       "confirmrecreate-noreason": "à°®à±\80à°°à±\81 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\81 à°®à±\8aదలà±\81à°ªà±\86à°\9fà±\8dà°\9fà°¿à°¨ à°¤à°°à±\81వాత [[User:$1|$1]] ([[User talk:$1|à°\9aà°°à±\8dà°\9a]]) à°\88 à°ªà±\87à°\9cà±\80ని {{GENDER:$1|à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81}}. à°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°³à±\80 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aాలనà±\81à°\95à±\81à°\82à°\9fà±\81à°¨à±\8dనారని à°§à±\83à°µà±\80à°\95రించండి.",
        "recreate": "మళ్లీ సృష్టించు",
        "confirm_purge_button": "సరే",
        "confirm-purge-top": "ఈ పేజీ యొక్క పాత కాపీని తొలగించమంటారా?",
        "version-libraries-license": "లైసెన్సు",
        "version-libraries-description": "వివరణ",
        "version-libraries-authors": "రచయితలు",
-       "redirect": "ఫైలు, వాడుకరి, పేజీ లేదా కూర్పు ఐడీ ప్రకారం దారిమార్పు",
+       "redirect": "ఫైలు పేరు, వాడుకరి ఐడీ, పేజీ ఐడీ, కూర్పు ఐడీ లేదా లాగ్ ఐడీ పేరిట దారిమార్పు చెయ్యండి",
        "redirect-submit": "వెళ్ళు",
        "redirect-lookup": "చూడు:",
        "redirect-value": "విలువ:",
        "compare-revision-not-exists": "మీరు పేర్కొన్న కూర్పు లేనే లేదు.",
        "dberr-problems": "క్షమించండి! ఈ సైటు సాంకేతిక సమస్యలని ఎదుర్కొంటుంది.",
        "dberr-again": "కొన్ని నిమిషాలాగి మళ్ళీ ప్రయత్నించండి.",
-       "dberr-info": "(à°¡à°¾à°\9fాబà±\87à°¸à±\81 à°¸à°°à±\8dవరà±\81ని à°¸à°\82ధానిà°\82à°\9aలేకున్నాం: $1)",
-       "dberr-info-hidden": "(డేటాబేసు సర్వరును కాంటాక్టు చెయ్యలేకున్నాం)",
+       "dberr-info": "(à°¡à±\87à°\9fాబà±\87à°¸à±\81à°¨à±\81 à°\9aà±\87à°°లేకున్నాం: $1)",
+       "dberr-info-hidden": "(డేటాబేసును చేరలేకున్నాం)",
        "dberr-usegoogle": "ఈలోపు మీరు గూగుల్ ద్వారా వెతకడానికి ప్రయత్నించండి.",
        "dberr-outofdate": "మా విషయం యొక్క వారి సూచీలు అంత తాజావి కావపోవచ్చని గమనించండి.",
        "dberr-cachederror": "అభ్యర్థించిన పేజీ యొక్క కోశం లోని కాపీ ఇది, అంత తాజాది కాకపోవచ్చు.",
        "htmlform-date-placeholder": "YYYY-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "మీరిచ్చిన విలువ ఆమోదిత తేదీ రూపంలో లేదు. YYYY-MM-DD ఆకృతిని వాడి చూడండి.",
+       "htmlform-time-invalid": "మీరిచ్చిన విలువ ఆమోదిత సమయం రూపంలో లేదు. HH:MM:SS ఆకృతిని వాడి చూడండి.",
+       "htmlform-datetime-invalid": "మీరిచ్చిన విలువ ఆమోదిత తేదీ, సమయం రూపంలో లేదు. YYYY-MM-DD HH:MM:SS ఆకృతిని వాడి చూడండి.",
+       "htmlform-title-badnamespace": "[[:$1]], \"{{ns:$2}}\" పేరుబరిలో లేదు.",
+       "htmlform-title-not-creatable": "\"$1\" అనే పేజీ పేరు సృష్టించదగ్గది కాదు",
+       "htmlform-title-not-exists": "$1 ఉనికిలో లేదు.",
+       "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": "పేజీ $3 ని $1 {{GENDER:$2|పునస్థాపించారు}}",
        "logentry-delete-event": "$3 లో {{PLURAL:$5|ఒక లాగ్ ఘటన|$5 లాగ్ ఘటనల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4",
        "logentry-delete-revision": "పేజీ $3 లో {{PLURAL:$5|ఒక కూర్పు|$5 కూర్పుల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4",
        "revdelete-uname-unhid": "వాడుకరిపేరు బయటపెట్టబడింది",
        "revdelete-restricted": "నిర్వాహకులకు ఆంక్షలు విధించాను",
        "revdelete-unrestricted": "నిర్వాహకులకున్న ఆంక్షలను ఎత్తేశాను",
+       "logentry-block-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$4|$3}} పై ఉన్న {{GENDER:$2|నిరోధాన్ని ఎత్తివేసారు}}",
+       "logentry-block-reblock": "$1 {{GENDER:$4|$3}} యొక్క నిరోధపు కాలం తీరిపోయే వ్యవధిని $5 $6 గా సెట్టింగులను {{GENDER:$2|మార్చారు}}",
+       "logentry-suppress-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
+       "logentry-suppress-reblock": "$1, {{GENDER:$4|$3}} యొక్క నిరోధాల సెట్టింగులను {{GENDER:$2|మార్చారు}}. నిరోధ కాలం: $5 $6",
+       "logentry-import-upload": "$1, $3 ను దస్త్రం ఎక్కింపు ద్వారా {{GENDER:$2|దిగుమతి చేసారు}}",
+       "logentry-import-upload-details": "$1, $3 ను దస్త్రం ఎక్కింపు ద్వారా {{GENDER:$2|దిగుమతి చేసారు}} ($4 {{PLURAL:$4|కూర్పు|కూర్పులు}})",
+       "logentry-import-interwiki": "$1, $3 ను వేరే వికీ నుండి {{GENDER:$2|దిగుమతి చేసారు}}",
+       "logentry-import-interwiki-details": "$1, $3 ను $5 నుండి {{GENDER:$2|దిగుమతి చేసారు}} ($4 {{PLURAL:$4|కూర్పు|కూర్పులు}})",
+       "logentry-merge-merge": "$1, $3 ను $4 లో {{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-newusers-create2": "$1 వాడుకరి ఖాతా $3 ను {{GENDER:$2|సృష్టించారు}}",
        "logentry-newusers-byemail": "$1 వాడుకరి ఖాతా $3 ను {{GENDER:$2|సృష్టించారు}}. సంకేతపదాన్ని ఈమెయిలులో పంపించాం",
        "logentry-newusers-autocreate": "వాడుకరి ఖాతా $1 ను ఆటోమేటిగ్గా {{GENDER:$2|సృష్టించారు}}",
-       "logentry-rights-rights": "$1, $3 యొక్క గుంపు సభ్యత్వాన్ని $4 నుండి $5 కు {{GENDER:$2|మార్చారు}}",
+       "logentry-protect-move_prot": "$1, సంరక్షణ సెట్టింగులను $4 నుండి $3 కు {{GENDER:$2|తరలించారు}}",
+       "logentry-protect-unprotect": "$1, $3 నుండి సంరక్షణను {{GENDER:$2|తీసివేసారు}}",
+       "logentry-protect-protect": "$1, $3 ను {{GENDER:$2|సంరక్షించారు}} $4",
+       "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-legacy": "$1, $3 యొక్క గుంపు సభ్యత్వాన్ని {{GENDER:$2|మార్చారు}}",
        "logentry-rights-autopromote": "$1, $4 నుండి $5 కు ఆటోమేటిగ్గా {{GENDER:$2|ప్రమోటు చెయ్యబడ్డారు}}",
        "logentry-upload-upload": "$1 $3 ను {{GENDER:$2|ఎక్కించారు}}",
+       "logentry-upload-overwrite": "$1, $3 యొక్క కొత్త కూర్పును {{GENDER:$2|ఎక్కించారు}}",
        "logentry-upload-revert": "$3ను $1 {{GENDER:$2|ఎక్కించారు}}",
        "log-name-managetags": "ట్యాగు నిర్వహణ చిట్టా",
        "logentry-managetags-create": "\"$4\" ట్యాగును $1 {{GENDER:$2|సృష్టించారు}}",
        "log-name-tag": "ట్యాగుల చిట్టా",
        "rightsnone": "(ఏమీలేవు)",
        "revdelete-summary": "మార్పు సంగ్రహం",
+       "rightslogentry-temporary-group": "$1 (తాత్కాలికం, $2 వరకు)",
        "feedback-adding": "ఫీడ్‍బ్యాకును పేజీలోకి చేరుస్తున్నాం...",
        "feedback-back": "వెనుకకు",
        "feedback-bugcheck": "అద్భుతం! ఇది ఇప్పటికే [$1 తెలిసిన బగ్గుల]లో లేదని సరిచూసుకోండి.",
        "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 భాషకు సెట్ చెయ్యబడి ఉంది.",
        "right-pagelang": "పేజీ భాషను మార్చడం",
        "action-pagelang": "పేజీ భాషను మార్చే",
        "log-name-pagelang": "భాష మార్పుల చిట్టా",
        "mediastatistics": "మాధ్యమ గణాంకాలు",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME రకం",
+       "mediastatistics-table-extensions": "సంభావ్యత గల పొడిగింతలు",
        "mediastatistics-table-count": "దస్త్రాల సంఖ్య",
+       "mediastatistics-table-totalbytes": "మొత్తం పరిమాణం",
        "mediastatistics-header-unknown": "తెలియని",
+       "mediastatistics-header-bitmap": "Bitmap బొమ్మలు",
        "mediastatistics-header-drawing": "రేఖాచిత్రాలు (వెక్టర్ చిత్రాలు)",
        "mediastatistics-header-audio": "ఆడియో",
        "mediastatistics-header-video": "వీడియోలు",
+       "mediastatistics-header-multimedia": "రిచ్ మీడియా",
        "mediastatistics-header-office": "కార్యాలయం",
        "mediastatistics-header-text": "పాఠ్య",
+       "mediastatistics-header-executable": "ఎక్జిక్యూటబుల్స్",
+       "mediastatistics-header-archive": "కంప్రెస్‌డ్ ఆకృతులు",
        "mediastatistics-header-total": "అన్ని ఫైళ్ళు",
+       "json-warn-trailing-comma": "JSON నుండి $1 అంత్య {{PLURAL:$1|కామాను|కామాలను}} తీసివేసాం",
+       "json-error-unknown": "JSON తో ఏదో సమస్య ఉంది. లోపం: $1",
        "json-error-state-mismatch": "చెల్లని లేదా సరికాని JSON",
        "json-error-syntax": "వ్యాకరణ దోషం",
        "headline-anchor-title": "ఈ విభాగానికి లంకె",
        "special-characters-title-emdash": "ఎమ్ డాష్",
        "special-characters-title-minus": "మైనస్ గుర్తు",
        "mw-widgets-dateinput-no-date": "ఏ తేదీనీ ఎంచుకోలేదు",
+       "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": "మరిన్ని చేర్చండి...",
+       "sessionprovider-generic": "$1 సెషన్లు",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "కూకీ-ఆధారిత సెషన్లు",
+       "log-action-filter-block": "నిరోధపు రకం:",
        "log-action-filter-all": "అన్నీ",
+       "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-temporarypassword": "తాత్కాలిక సంకేతపదం",
-       "credentialsform-account": "ఖాతా పేరు:"
+       "authprovider-confirmlink-message": "ఇటీవలి మీ లాగిన్ ప్రయత్నాల ననుసరించి, కింది ఖాతాలను మీ వికీ ఖాతాకు అనుసంధించవచ్చు. వాటిని లింకు చెయ్యడంతో, ఆ ఖాతాల ద్వారా లాగిన్ కావడం చేతనమౌతుంది. ఏయే ఖాతాలను లింకు చెయ్యాలో ఎంచుకోండి.",
+       "authprovider-confirmlink-request-label": "లింకు చెయ్యాల్సిన ఖాతాలు",
+       "authprovider-confirmlink-success-line": "$1: జయప్రదంగా లింకు చేసాం.",
+       "authprovider-confirmlink-failed": "ఖాతాల అనుసంధానం పూర్తిగా జయప్రదం కాలేదు: $1",
+       "authprovider-resetpass-skip-label": "దాటవేయి",
+       "cannotauth-not-allowed-title": "అనుమతి నిరాకరించబడింది",
+       "cannotauth-not-allowed": "ఈ పేజీ వాడుకునే అనుమతి మీకు లేదు",
+       "changecredentials-invalidsubpage": "$1 సరైన అర్హత కాదు",
+       "changecredentials-success": "మీ అర్హతలను మార్చాం.",
+       "removecredentials": "అర్హతలను తీసివెయ్యి",
+       "removecredentials-submit": "అర్హతలను తీసివెయ్యి",
+       "removecredentials-invalidsubpage": "$1 సరైన అర్హత రకం కాదు",
+       "removecredentials-success": "మీ అర్హతలను తీసివేసాం.",
+       "credentialsform-provider": "అర్హతల రకం:",
+       "credentialsform-account": "ఖాతా పేరు:",
+       "cannotlink-no-provider-title": "లింకు చెయ్యదగ్గ ఖాతాలేమీ లేవు",
+       "cannotlink-no-provider": "లింకు చెయ్యదగ్గ ఖాతాలేమీ లేవు.",
+       "linkaccounts": "ఖాతాలను లింకు చెయ్య్యి",
+       "linkaccounts-success-text": "ఖాతాను లింకు చేసాం.",
+       "linkaccounts-submit": "ఖాతాలను లింకు చెయ్యి",
+       "unlinkaccounts": "ఖాతాల లింకు తీసివెయ్యి",
+       "unlinkaccounts-success": "ఖాతా లింకును తీసివేసాం.",
+       "authenticationdatachange-ignored": "ధ్రువీకరణ డేటా మార్పును సాధించలేకపోయాం. ప్రొవైడరును కాన్ఫిగరు చెయ్యలేదేమో?",
+       "userjsispublic": "గమనించండి: JavaScript ఉపపేజీల్లో గోపనీయమైన డేటా ఏమీ ఉండకూడదు. ఇతర వాడుకరులు దాన్ని చూసే అవకాశం ఉంది.",
+       "usercssispublic": "గమనించండి: CSS ఉపపేజీల్లో గోపనీయమైన డేటా ఏమీ ఉండకూడదు. ఇతర వాడుకరులు దాన్ని చూసే అవకాశం ఉంది.",
+       "restrictionsfield-badip": "అసంబద్ధమైన ఐపీ అడ్రసు లేదా శ్రేణి: $1",
+       "restrictionsfield-label": "అనుమతించబడ్డ ఐపీ శ్రేణులు:",
+       "restrictionsfield-help": "వరుసకొక్క ఐపీ అడ్రసు లేదా CIDR శ్రేణి. ప్రతీ ఒక్కదాన్నీ చేతనం చేసేందుకు, వాడండి:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "కూర్పు $1",
+       "pageid": "పేజీ ఐడీ $1"
 }
index 7e77d4d..e688c30 100644 (file)
        "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "missingcommenttext": "กรุณากรอกความเห็นด้านล่าง",
        "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่เรื่องสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่ระบุเรื่อง",
-       "summary-preview": "ตัวอย่างคำอธิบาย:",
-       "subject-preview": "ตัวอย่างเรื่อง:",
+       "summary-preview": "ตัวอย่างคำอธิบายการแก้ไข:",
+       "subject-preview": "à¸\95ัวอยà¹\88าà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87:",
        "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
        "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
        "content-not-allowed-here": "ไม่อนุญาตเนื้อหา \"$1\" ในหน้า [[$2]]",
        "editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
+       "editpage-invalidcontentmodel-title": "ไม่รองรับรูปแบบเนื้อหานี้",
        "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
        "editpage-notsupportedcontentformat-text": "ตัวแบบเนื้อหา $2 ไม่รองรับตัวแบบเนื้อหา $1",
        "content-model-wikitext": "ข้อความวิกิ",
        "editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "กำลังดูสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "แก้ไขกลุ่มผู้ใช้",
-       "userrights-viewusergroup": "ดูกลุ่มผู้ใช้",
+       "userrights-viewusergroup": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "saveusergroups": "บันทึกกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "userrights-groupsmember": "สมาชิกของ:",
        "userrights-groupsmember-auto": "สมาชิกโดยปริยายของ:",
        "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์",
        "php-uploaddisabledtext": "ปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
        "uploadscripted": "ไฟล์นี้มีโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้การแปลคำสั่งของเบราว์เซอร์ผิดพลาด",
-       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"$1\"",
+       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"<nowiki>$1</nowiki>\"",
        "uploadvirus": "ไฟล์นี้มีไวรัส! \nรายละเอียด: $1",
        "upload-source": "ไฟล์ต้นทาง",
        "sourcefilename": "ชื่อไฟล์ต้นทาง:",
index d89ce49..30fe744 100644 (file)
        "userloginnocreate": "Lumagda",
        "logout": "Umalis sa pagkaka-login",
        "userlogout": "Umalis sa pagkaka-login",
-       "notloggedin": "Hindi nakalagda",
+       "notloggedin": "Hindi naka-login",
        "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
        "nologin": "Wala ka pang account? $1.",
index bcab524..a9a2760 100644 (file)
                        "1917 Ekim Devrimi"
                ]
        },
-       "tog-underline": "Bağlantıların altını çiz:",
-       "tog-hideminor": "Son değişiklikler sayfasında küçük değişiklikleri gizle",
-       "tog-hidepatrolled": "Son değişikliklerde devriye görmüş değişiklikleri gizle",
-       "tog-newpageshidepatrolled": "Yeni sayfalar listesinde, devriye görmüş sayfaları gizle",
+       "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-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östermek üzere genişlet",
-       "tog-usenewrc": "Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri sayfalara gruplandır",
+       "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri gösterecek şekilde genişlet",
+       "tog-usenewrc": "Son değişiklikler ve izleme listesindeki değişiklikleri sayfalara göre gruplandır",
        "tog-numberheadings": "Başlıkları otomatik numaralandır",
        "tog-showtoolbar": "Düzenleme araç çubuğunu göster",
-       "tog-editondblclick": "Çift tıklayarak sayfaları düzenle",
-       "tog-editsectiononrightclick": "Bölüm başlığına sağ tıklayarak bölüm düzenleyebilmeyi etkinleştir",
+       "tog-editondblclick": "Çift tıklandığında sayfaları düzenle",
+       "tog-editsectiononrightclick": "Bölüm başlıklarına sağ tıklayarak bölüm düzenlemeyi etkinleştir",
        "tog-watchcreations": "Oluşturduğum sayfaları ve yüklediğim dosyaları izleme listeme ekle",
-       "tog-watchdefault": "Değişiklik yaptığım sayfaları ve dosyaları izleme listeme ekle",
+       "tog-watchdefault": "Düzenlediğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchmoves": "Taşıdığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
-       "tog-watchrollback": "Geridönüş yaptığım sayfaları izleme listeme ekle",
-       "tog-minordefault": "Varsayılan olarak, bütün düzenlemelerimi küçük değişiklik olarak işaretle",
-       "tog-previewontop": "Ã\96n izlemeyi, düzenleme kutusunun Ã¼stünde göster",
+       "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": "Ã\96n izlemeyi, düzenleme kutusunun Ã¶ncesinde göster",
        "tog-previewonfirst": "İlk düzenlemede ön izlemeyi 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",
        "selfredirect": "<strong>Uyarı:</strong> Bu sayfanın kendisine yönlendirme vardır.\nYönlendirme için yanlış hedef belirtmiş olabilirsiniz, ya da yanlış sayfa düzenlemeye çalışmış olabilirsiniz.\n\n\"{{int:savearticle}}\" sayfasına tıklayarak, yönlendirmeyi zaten oluşturabilirsiniz.",
        "missingcommenttext": "Lütfen aşağıda bir açıklama yazınız.",
        "missingcommentheader": "<strong>Hatırlatma:</strong> Bu yorum için bir konu girmediniz.\nEğer \"{{int: savearticle}}\" tuşuna tekrar basarsanız, değişikliğiniz konu olmadan kaydedilecektir.",
-       "summary-preview": "Ön izleme özeti:",
+       "summary-preview": "Değişiklik özeti ön izlemesi:",
        "subject-preview": "Konu ön izlemesi:",
        "previewerrortext": "Yaptığınız değişikliklerin önizlemesi sırasında bir hata oluştu.",
        "blockedtitle": "Kullanıcı erişimi engellendi.",
        "previewnote": "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''\nYaptığınız değişiklikler henüz kaydedilmedi!",
        "continue-editing": "Düzenlemeye devam et",
        "previewconflict": "Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.",
-       "session_fail_preview": "Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik.\n\nLütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.",
+       "session_fail_preview": "Özür dileriz. Oturum verisi kaybından dolayı değişikliğinizi kaydedemedik.\n\nOturumunuzu kapatmış olabilirsiniz. <strong>Lütfen oturumunuzun açık olduğunu doğrulayıp tekrar deneyiniz</strong>.\nEğer sorun devam ederse, [[Special:UserLogout|oturumu kapatıp]] tekrar giriş yapmayı deneyin ve tarayıcınızın bu siteden çerezlere izin verip vermediğini kontrol edin.",
        "session_fail_preview_html": "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''\n\n''Çünkü {{SITENAME}} sitesinde raw HTML etkindir, önizleme JavaScript saldırılarına önlem olarak gizlenmiştir.''\n\n'''Eğer bu haklı bir düzenleme girişimiyse, lütfen yeniden deneyin. Eğer hala çalışmazsa, [[Special:UserLogout|çıkış yapıp]] yeniden oturum açmayı deneyin.'''",
        "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.'''",
        "search-interwiki-caption": "Kardeş projeler",
        "search-interwiki-default": "$1 sonuçları:",
        "search-interwiki-more": "(daha çok)",
+       "search-interwiki-more-results": "daha fazla sonuç",
        "search-relatedarticle": "ilgili",
        "searchrelated": "ilgili",
        "searchall": "tümü",
        "restoreprefs": "Tüm varsayılan ayarları geri yükle (tüm bölümlerde)",
        "prefs-editing": "Sayfa yazma alanı",
        "searchresultshead": "Arama",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Taslak bağlantısı</a> formatı için baraj (bayt):",
+       "stub-threshold": "Taslak bağlantısı formatı için sınır ($1):",
        "stub-threshold-sample-link": "örnek",
        "stub-threshold-disabled": "Devre dışı",
        "recentchangesdays": "Son değişikliklerde gösterilecek günler:",
        "prefs-help-recentchangescount": "Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.",
        "prefs-help-watchlist-token2": "Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].",
        "savedprefs": "Tercihleriniz kaydedildi.",
-       "savedrights": "{{GENDER:$1|$1}} için kullanıcı hakları kaydedildi.",
+       "savedrights": "{{GENDER:$1|$1}} için kullanıcı grupları kaydedildi.",
        "timezonelegend": "Zaman dilimi:",
        "localtime": "Yerel saat:",
        "timezoneuseserverdefault": "Viki varsayılanını kullanın ($1)",
        "username": "{{GENDER:$1|Kullanıcı adı}}:",
        "prefs-memberingroups": "{{GENDER:$2|Üye}} {{PLURAL:$1|group|grupları}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ($2 tarihine kadar)",
        "prefs-registration": "Kayıt zamanı:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Gerçek adınız:",
        "badsig": "Geçersiz ham imza; HTML etiketlerini kontrol edin.",
        "badsiglength": "İmzanız çok uzun.\n$1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.",
        "yourgender": "Cinsiyet?",
-       "gender-unknown": "Açıklamak istemiyorum",
+       "gender-unknown": "Yazılım sizden bahsederken, mümkün olduğu sürece cinsiyet belirtmeyen kelimeler kullanacak",
        "gender-male": "Erkek",
        "gender-female": "Kadın",
        "prefs-help-gender": "Bu tercih ayarı isteğe bağlıdır.\nYazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.\nBu bilgiler herkes tarafından görülebilir.",
        "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-lookup-user": "Kullanıcı gruplarını düzenle",
+       "userrights-lookup-user": "Bir kullanıcı seç",
        "userrights-user-editname": "Kullanıcı adı giriniz:",
-       "editusergroup": "Kullanıcı grupları düzenle",
+       "editusergroup": "Kullanıcı gruplarını gör",
        "editinguser": "<strong>'''[[User:$1|$1]]'''</strong> $2 kullanıcısının yetkileri değiştiriliyor",
-       "userrights-editusergroup": "Kullanıcı grupları düzenle",
-       "userrights-viewusergroup": "Kullanıcının gruplarını gör",
-       "saveusergroups": "Kullanıcı grupları kaydet",
+       "userrights-editusergroup": "{{GENDER:$1|Kullanıcı}} gruplarını düzenle",
+       "userrights-viewusergroup": "{{GENDER:$1|Kullanıcı}} gruplarını gör",
+       "saveusergroups": "{{GENDER:$1|Kullanıcı}} gruplarını kaydet",
        "userrights-groupsmember": "İçinde olduğu gruplar:",
        "userrights-groupsmember-auto": "Saklı olarak içinde olduğu gruplar:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Bu kullanıcının içinde olduğu grupları değiştirebilirsiniz:\n* Seçili bir kutu, kullanıcının o gruba dahil olduğu anlamına gelir\n* Seçilmemiş bir kutu, kullanıcının o grupta olmadığı anlamına gelir.\n* *, grubu bir kez oluşturduktan sonra silemeceğinizi belirtir, ya da karşılıklı olarak.",
+       "userrights-groups-help": "Bu kullanıcının içinde olduğu grupları değiştirebilirsiniz:\n* Seçili bir kutu, kullanıcının o gruba dahil olduğunu anlatır.\n* Seçilmemiş bir kutu, kullanıcının o gruba dahil olmadığını anlatır.\n* *, grubu bir kez ekledikten sonra kaldıramayacağınızı veya tam tersi kaldırdıktan sonra ekleyemeyeceğiniz belirtir.\n* #, grubun sona erme zamanını yalnızca öne çekebileceğinizi, ileri alamayacağınızı belirtir.",
        "userrights-reason": "Neden:",
        "userrights-no-interwiki": "Diğer vikilerdeki kullanıcıların izinlerini değiştirmeye yetkiniz yok.",
        "userrights-nodatabase": "$1 veritabanı mevcut veya bölgesel değil",
        "uploaded-event-handler-on-svg": "SVG dosyalarında event-handler özniteliğini <code>$1=\"$2\"</code> şeklinde ayarlanmasına izin verilmiyor.",
        "uploaded-href-unsafe-target-svg": "Yüklenen SVG dosyasında <code>&lt;$1 $2=\"$3\"&gt;</code> güvensiz hedefine href bulundu.",
        "uploaded-animate-svg": "\"animate\" etiketi bulundu, href'i değiştiriyor olabilir. Yüklenen SVG dosyasındaki \"from\" özniteliği kullanılıyor  <code>&lt;$1 $2=\"$3\"&gt;</code>",
-       "uploadscriptednamespace": "Bu SVG dosyası geçersiz \"$1\" alan adını içermektedir.",
+       "uploadscriptednamespace": "Bu SVG dosyası geçersiz \"<nowiki>$1</nowiki>\" alan adını içermektedir.",
        "uploadinvalidxml": "Yüklenen dosyadaki XML işlenemedi.",
        "uploadvirus": "Bu dosya virüslüdür! Detayları: $1",
        "uploadjava": "Dosya, bir Java .classdosyası içeren bir ZIP dosyasıdır.\nJava dosyalarının yüklenmesine izin verilmemektedir, zira güvenlik kısıtlamalarının atlanmasına neden olabilmektedirler.",
        "feedback-thanks": "Teşekkürler! Görüşleriniz \"[$2 $1]\" sayfasında paylaşılmıştır.",
        "feedback-thanks-title": "Teşekkürler!",
        "feedback-useragent": "Kullanıcı temsilcisi",
-       "searchsuggest-search": "Ara",
+       "searchsuggest-search": "{{SITENAME}} üzerinde ara",
        "searchsuggest-containing": "içeren...",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
index d0060fd..f907c59 100644 (file)
@@ -46,6 +46,7 @@
        "tog-watchmoves": "Мин күчергән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchdeletion": "Мин бетергән битләр һәм файлларны күзәтү исемлегемгә өстәлсен",
        "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертергә",
+       "tog-watchrollback": "Мин үткәрмәгән битләрне күзәтү исемлегемә өстәргә",
        "tog-minordefault": "Барлык үзгәртүләрне килешү буенча кече дип билгеләнсен",
        "tog-previewontop": "Үзгәртү тәрәзәсеннән өстәрәк битне алдан карау өлкәсен күрсәтелсен",
        "tog-previewonfirst": "Үзгәртү битенә күчкәндә башта алдан карау бите күрсәтелсен",
        "talk": "Бәхәс",
        "views": "Караулар",
        "toolbox": "Кораллар",
+       "tool-link-userrights": "{{GENDER:$1|Кулланучының}} төркемнәрен алмаштыру",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Кулланучының}} төркемнәрен карау",
+       "tool-link-emailuser": "{{GENDER:$1|Кулланучыга}} хат язу",
        "userpage": "Кулланучы битен карау",
        "projectpage": "Проект битен карау",
        "imagepage": "Файл битен карау",
        "suspicious-userlogout": "Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.",
        "pt-login": "Керү",
        "pt-login-button": "Керү",
+       "pt-login-continue-button": "Керүне дәвам итү",
        "pt-createaccount": "Яңа кулланучыны теркәү",
        "pt-userlogout": "Чыгу",
        "php-mail-error-unknown": "PHP mail() функциясендә билгесез хата",
index bac27db..c357658 100644 (file)
        "saveprefs": "Шыгжаары",
        "restoreprefs": "Шупту баштайгы ниити шилилгелерни restore",
        "prefs-editing": "Өскертир",
-       "rows": "Одуруглар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Дилээр",
        "timezoneuseserverdefault": "Викиниң ниити шилилгезин ажыглаары ($1)",
        "servertime": "Серверниң шагы:",
        "hours": "{{PLURAL:$1|1=$1 шак|$1 шак}}",
        "days": "{{PLURAL:$1|1=$1 хүн|$1 хүн}}",
        "ago": "$1 бурунгаар",
-       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð¾Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nЧүгле Ð´Ð°Ò£Ð·Ñ\8bнÑ\8bÒ£ Ð¸Ð´ÐµÐ³ÐµÑ\82Ñ\82еÑ\80и (Ñ\8dлеменÑ\82илеÑ\80и) Ñ\81анаÑ\82Ñ\8bнаÑ\80 Ð±Ð¾Ð¾Ñ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð±Ð¸Ñ\80ги Ñ\88өлүдүү Ñ\81алдÑ\8bнмаÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83малÑ\87е Ñ\88өлүдүг Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83 Ð°Ð»Ð±Ð°Ð½.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð°Ñ\80Ñ\82кан Ñ\88өлүдүглеÑ\80и Ð¾Ð½Ð·Ð°Ð³Ð°Ð¹ ÐºÑ\8bлдÑ\8bÑ\80 Ð°Ð·Ñ\8b Ñ\87Ñ\83Ñ\80Ñ\83мал ÐºÐ°Ð¿Ñ\81Ñ\8bÑ\80Ñ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87үүлдеÑ\80 ÐºÑ\8bлдÑ\8bÑ\80 Ñ\81анаÑ\82Ñ\82Ñ\8bнар.",
+       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nÐ\94аңзÑ\8bда Ñ\87үгле Ñ\8dлеменÑ\82илеÑ\80 Ñ\81анаÑ\82Ñ\8bнаÑ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гда Ð±Ð¸Ñ\80 Ð´Ñ\83гааÑ\80 Ð°Ð¹Ñ\82Ñ\8bг Ð±Ð¾Ð»Ð·Ð° ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ñ\82Ñ\82инмеÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83кÑ\87е Ð°Ð¹Ñ\82Ñ\8bÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ó©Ñ\81ке Ð°Ð¹Ñ\82Ñ\8bглаÑ\80Ñ\8b, Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80нÑ\8b ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ð´Ð¸Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ð°Ñ\80Ñ\8bннаÑ\80же Ð°Ð¹Ñ\82Ñ\8bп Ñ\82Ñ\83Ñ\80ар.",
        "metadata": "Чурумал дугайында медээлер",
        "metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
        "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",
index 673c030..a5dbfef 100644 (file)
        "copyrightpage": "{{ns:project}}:Автор праваос",
        "currentevents": "Выль иворъёс",
        "currentevents-url": "Project:Выль иворъёс",
-       "disclaimers": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ð¿Ñ\83миÑ\82 Ð»Ñ\83он",
-       "disclaimerpage": "Project:Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ð¿Ñ\83миÑ\82 Ð»Ñ\83он",
+       "disclaimers": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8dмлÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон",
+       "disclaimerpage": "Project:Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8dмлÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон",
        "edithelp": "Тупатонъя юрттэт",
        "helppage-top-gethelp": "Юрттэт",
        "mainpage": "Кутскон бам",
        "createacct-yourpassword-ph": "Гожтэ паролез",
        "createacct-yourpasswordagain": "Юнматэ паролез",
        "createacct-yourpasswordagain-ph": "Гожтэ паролез эшшо одӥг пол",
-       "userlogin-remembermypassword": "Кылем сӧзнэтэз",
+       "userlogin-remembermypassword": "Кылёно системаын",
        "cannotcreateaccount-title": "Учётной записьёсты кылдытыны уг луы",
        "yourdomainname": "Тӥляд доменды:",
        "login": "Пырыны",
        "nav-login-createaccount": "Нимдэс вераны / Регистрациез ортчытыны",
-       "userlogin": "Ð\9dимдÑ\8dÑ\81 Ð²ÐµÑ\80анÑ\8b / Ð ÐµÐ³Ð¸Ñ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82ыны",
+       "userlogin": "РегиÑ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82Ñ\8bнÑ\8b Ñ\8fке Ð\92икипедие Ð¿Ñ\8bÑ\80ыны",
        "userloginnocreate": "Пырыны",
        "logout": "Кошкыны",
        "userlogout": "Потыны",
        "history-show-deleted": "Ӵушылэмъёссэ гинэ",
        "rev-delundel": "возьматыны/ватыны",
        "rev-showdeleted": "возьматоно",
-       "revdelete-show-file-submit": "да",
+       "revdelete-show-file-submit": "Ð\91ен",
        "revdelete-radio-set": "Ватэм",
        "revdelete-radio-unset": "Адӟымон",
        "revdelete-reason-dropdown": "*Огшоры быдтон мугъёс\n** Автор правоосты тӥян\n** Ярантэм комментарий яке личной сведениос\n** Викиавторлэн ярантэм нимыз\n** Луоно лекатӥсь информация",
        "right-createtalk": "Вераськон бамъёсты кылдытон",
        "right-createaccount": "Викиавторъёслэсь выль учётной записьёссэс кылдытон",
        "right-writeapi": "Гожъясь API уже кутон",
-       "right-block": "мÑ\83кеÑ\82 Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\80он-коÑ\81он Ð²Ñ\8bлÑ\8d Ñ\83Ñ\81Ñ\82ановкаоÑ\81Ñ\82Ñ\8b Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c",
+       "right-block": "Ð\9cÑ\83кеÑ\82 Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\82Ñ\83паÑ\82Ñ\8aÑ\8fнлÑ\8dÑ\81Ñ\8c Ð¿Ð°Ð»Ñ\8dнÑ\82он",
        "newuserlogpage": "Викиавторъёсыз регистрациосын журнал",
-       "action-read": "Ñ\82а Ð»Ñ\8bдÓ\9fонÑ\8aÑ\91Ñ\81 Ð±Ð°Ð¼",
+       "action-read": "Ñ\82а Ð±Ð°Ð¼ Ð»Ñ\8bдÓ\9fÑ\8bнÑ\8b",
        "action-edit": "та бамез тупатыны",
-       "action-block": "пыриськисьёс та понна луонлыкъёссы сюбегам редактировать",
+       "action-block": "та викиавтор блокировать карыны",
        "enhancedrc-history": "история",
        "recentchanges": "Выль тупатонъёс",
        "recentchanges-legend": "Выль тупатонъёслы настройкаос",
        "deletionlog": "быдтонъёсын журнал",
        "rollbacklink": "ӝог берыктыны",
        "rollbacklinkcount": "$1 {{PLURAL:$1|тупатонэз}} ӝог берыктыны",
-       "revertpage": "Откат шонертон [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) доры версия [[User:$1|$1]]",
-       "revertpage-nouser": "Ð\9eÑ\82каÑ\82 Ñ\88онеÑ\80Ñ\82он (пÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81 Ð²Ð°Ñ\82Ñ\8dм Ð½Ð¸Ð¼Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8b) Ð´Ð¾Ñ\80Ñ\8b Ð²ÐµÑ\80Ñ\81иÑ\8f {{GENDER:$1|[[User:$1|$1]]}}",
+       "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|вераськон]]) викиавторлэн тупатонъёсыз берыктэмын [[User:$1|$1]] викиавторлэн версиезозь",
+       "revertpage-nouser": "Ð\92аÑ\82Ñ\8dм Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80лÑ\8dн Ñ\82Ñ\83паÑ\82онÑ\8aÑ\91Ñ\81Ñ\8bз Ð±ÐµÑ\80Ñ\8bкÑ\82Ñ\8dмÑ\8bн {{GENDER:$1|[[User:$1|$1]] Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80лÑ\8dн}} Ð²ÐµÑ\80Ñ\81иезозÑ\8c",
        "protectlogpage": "Утёнъёсын журнал",
        "restriction-edit": "Тупатон",
        "undeletehistory": "Бамез берен сётоды ке, сое воштонъёслэн историзы берытскоз но.\nБыдтон бере таӵе ик нимен выль бам кылдытэмын вал ке, берен сётэм версиос адӟиськозы воштонъёслэн историязы выль версиослэсь азьло.",
        "sp-contributions-blocklog": "блокировкаосыз",
        "sp-contributions-deleted": "{{GENDER:$1|викиавторлэн}} быдтэм тупатонъёсыз",
        "sp-contributions-userrights": "пыриськисьлэн правоосыныз кивалтон",
-       "sp-contributions-blocked-notice": "Ð\9fолÑ\8cзоваÑ\82елÑ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Ñ\81Ñ\91Ñ\82ӥз Ñ\82а Ñ\83Ñ\87Ñ\8bÑ\80лÑ\8b. Ð¡Ð¿Ñ\80авка Ð¿Ð¾Ð½Ð½Ð° Ñ\80адÑ\8aÑ\8fÑ\81Ñ\8cкÑ\8bлӥÑ\81Ñ\8c Ð¶Ñ\83Ñ\80нал Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка Ð»Ð°Ð¿ÐµÐ³ Ð±ÐµÑ\80пÑ\83меÑ\82Ó¥ Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82:",
-       "sp-contributions-blocked-notice-anon": "Со ip-адÑ\80еÑ\81 Ð²Ð¸Ðµ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Ñ\81Ñ\91Ñ\82ӥзÑ\8b. Ð\91локиÑ\80овка Ð¶Ñ\83Ñ\80налÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ð²Ð°Ð¹Ñ\8bÑ\82Ñ\8dк Ñ\83лӥзÑ\8b Ð±ÐµÑ\80пÑ\83меÑ\82Ó¥ ÐºÐ½Ð¸Ð³Ð°Ñ\8bÑ\81Ñ\8c:",
+       "sp-contributions-blocked-notice": "Ð\90ли Ð´Ñ\8bÑ\80е Ñ\82а Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн.\nÐ\92алÑ\8dкÑ\82он Ð¿Ð¾Ð½Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80овкаоÑ\81Ñ\8bн Ð¶Ñ\83Ñ\80налÑ\8bÑ\81Ñ\8c Ð±ÐµÑ\80ло Ð³Ð¾Ð¶Ñ\8aÑ\8fм Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн:",
+       "sp-contributions-blocked-notice-anon": "Ð\90ли Ð´Ñ\8bÑ\80е Ñ\82а IP-адÑ\80еÑ\81 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80емÑ\8bн.\nÐ\92алÑ\8dкÑ\82он Ð¿Ð¾Ð½Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80овкаоÑ\81Ñ\8bн Ð¶Ñ\83Ñ\80налÑ\8bÑ\81Ñ\8c Ð±ÐµÑ\80ло Ð³Ð¾Ð¶Ñ\8aÑ\8fм Ñ\83лӥ Ð²Ð¾Ð·Ñ\8cмаÑ\82Ñ\8dмÑ\8bн:",
        "sp-contributions-submit": "Шедьтыны",
        "whatlinkshere": "Татчы чӧлсконъёс",
        "whatlinkshere-title": "«$1» вылэ чӧлскись бамъёс",
        "whatlinkshere-filters": "Фильтръёс",
        "block": "Викиавторез заблокировать карыны",
        "blockip": "{{GENDER:$1|Викиавторез}} заблокировать карыны",
-       "blockip-legend": "Ð\91локиÑ\80овка Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
-       "blockiptext": "ФоÑ\80мазÑ\8d Ñ\83же ÐºÑ\83Ñ\82Ñ\8bÑ\81а, ÐºÑ\83лÑ\8d Ð»Ñ\83Ñ\8dмезÑ\8aÑ\8f Ð¼ÐµÐ´ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c Ð³Ð¾Ð¶Ñ\8aÑ\8fн IP-адÑ\80еÑ\81 Ñ\8fке Ð¿Ñ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81лÑ\8dн Ð½Ð¸Ð¼Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8b.\nТа Ð¿Ð¾Ð½Ð½Ð° Ð³Ð¸Ð½Ñ\8d Ð½Ð¾ Ñ\81оÑ\8f Ð³Ð¸Ð½Ñ\8d Ð»Ñ\8dÑ\81Ñ\8cÑ\82Ñ\8dмÑ\8bн Ð»Ñ\83Ñ\8bнÑ\8b Ð±Ñ\8bгаÑ\82оз Ð²Ð°Ð½Ð´Ð°Ð»Ð¸Ð·Ð¼ Ð¿Ñ\80едоÑ\82вÑ\80аÑ\89ение Ñ\81 [[{{MediaWiki:Policy-url}}|пÑ\80авилооÑ\81Ñ\82Ñ\8b]].\nÐ\9cÑ\83гез Ð²Ð¾Ð·Ñ\8cмаÑ\82иÑ\81Ñ\8c Ñ\83лӥзÑ\8b Ñ\87ленÑ\8aÑ\91Ñ\81Ñ\8bн (кÑ\8bлÑ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, ÐºÑ\83д-ог Ñ\82одмеÑ\82Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8d Ð²Ð°Ð½Ð´Ð°Ð»Ð¸Ð·Ð¼ Ñ\86иÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80оно Ð±Ð°Ð¼).\nТӥ Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ\8dз Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c IP-адÑ\80еÑ\81, Ñ\83же ÐºÑ\83Ñ\82Ñ\8bнÑ\8b [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-Ñ\81инÑ\82акÑ\81иÑ\81. Ð\9cакÑ\81ималÑ\8cно Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ\8dз Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имÑ\8bй â\80\94 /$1 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° IPv4 Ð½Ð¾ /$2 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° IPv6.",
+       "blockip-legend": "Ð\92икиавÑ\82оÑ\80ез Ð±Ð»Ð¾ÐºÐ¸Ñ\80овка",
+       "blockiptext": "Ð\9aÑ\83Ñ\82Ñ\8d Ñ\82а Ñ\84оÑ\80маез Ð³Ð¾Ð¶Ñ\82Ñ\8bлÑ\8bнÑ\8b Ð»Ñ\83онлÑ\8bкез Ð´Ñ\83гдÑ\8bÑ\82Ñ\8bнÑ\8b Ð²Ñ\8bлÑ\8bÑ\81Ñ\8c Ð±Ñ\8bÑ\80Ñ\8aем IP-адÑ\80еÑ\81Ñ\8bÑ\81Ñ\8c Ñ\8fке Ð¾Ð³ Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð½Ð¸Ð¼ Ñ\83лÑ\81Ñ\8bн.\nТае Ð»Ñ\8dÑ\81Ñ\8cÑ\82Ñ\8bнÑ\8b ÐºÑ\83лÑ\8d Ð²Ð°Ð½Ð´Ð°Ð»Ð¸Ð·Ð¼ÐµÐ· Ð¿Ð°Ð»Ñ\8dнÑ\82он Ð¿Ð¾Ð½Ð½Ð° Ð³Ð¸Ð½Ñ\8d Ð½Ð¾ [[{{MediaWiki:Policy-url}}|пÑ\80авилооÑ\81Ñ\8aÑ\8f]] Ð³Ð¸Ð½Ñ\8d.\nУлӥ ÐºÐ¾Ð½ÐºÑ\80еÑ\82ной Ð¼Ñ\83гез Ð³Ð¾Ð¶Ñ\82Ñ\8d (кÑ\8bлÑ\81Ñ\8fÑ\80Ñ\8bÑ\81Ñ\8c, Ñ\86иÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bÑ\81а Ð²Ð°Ð½Ð´Ð°Ð»Ñ\8dн Ñ\81Ó§Ñ\80ем ÐºÑ\83д-ог Ð±Ð°Ð¼Ñ\8aÑ\91Ñ\81Ñ\82Ñ\8b).\nТӥ Ð±Ñ\8bгаÑ\82Ó¥Ñ\81Ñ\8cкодÑ\8b IP-адÑ\80еÑ\81Ñ\8aÑ\91Ñ\81лÑ\8dÑ\81Ñ\8c Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ\8aÑ\91Ñ\81Ñ\81Ñ\8dÑ\81 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bнÑ\8b [https://ru.wikipedia.org/wiki/Ð\91еÑ\81клаÑ\81Ñ\81оваÑ\8f_адÑ\80еÑ\81аÑ\86иÑ\8f CIDR]-Ñ\81инÑ\82акÑ\81иÑ\81 Ñ\83же ÐºÑ\83Ñ\82Ñ\8bÑ\81а; IPv4 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° Ñ\81амой Ð±Ð°Ð´Ó\9fÑ\8bм Ð»Ñ\83оно Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ð»Ñ\83Ñ\8d /$1, Ð½Ð¾ IPv6 Ð¿Ñ\80оÑ\82окол Ð¿Ð¾Ð½Ð½Ð° â\80\94 /$2.",
        "ipbreason-dropdown": "*Блокировкаослэн огшоры мугъёссы\n** Ӧрекчась информациез ватсан\n** Бамъёслэсь текстсэс быдтон\n** Спам-чӧлсконъёс педпал сайтъёс вылэ\n** Валантэм/жаг текстэз бамъёсы ватсан\n** Викиавторъёсыз кышкатъян/ултӥяллян\n** Лэзёнтэм ужан трос аккаунтъёсын\n** Викиавторлэн ярантэм нимыз",
-       "ipbsubmit": "Ð\90дÑ\80еÑ\81Ñ\8aÑ\91Ñ\81Ñ\8bн Ñ\82а Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c/пÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cÑ\91Ñ\81",
+       "ipbsubmit": "Та Ð²Ð¸ÐºÐ¸Ð°Ð²Ñ\82оÑ\80 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80оваÑ\82Ñ\8c ÐºÐ°Ñ\80Ñ\8bнÑ\8b",
        "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",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} гожтэмъёсы",
        "unblocked": "[[User:$1|$1]] разблокировать каремын.",
        "expiringblock": "йылпумъяськоз $1 $2",
        "anononlyblock": "анонимъёс гинэ",
        "noautoblockblock": "автоблокировка ӧвӧл",
-       "createaccountblock": "учётной записьёсыз кылдытон дугдытэмын",
+       "createaccountblock": "аккаунтъёсыз кылдытон дугдытэмын",
        "emailblock": "гожтэтъёсыз ыстылыны уг луы",
        "blocklist-nousertalk": "уг быгаты ас вераськон бамзэ вошъяны",
        "blocklink": "блокировать карыны",
        "blocklogtext": "Викиавторъёсты блокировкаосын но разблокировкаосын журнал.\nАвтоматически блокировать кариськись IP-адресъёс татын уг адӟытӥсько.\nУчке [[Special:BlockList|списокез али кутӥськись блокировкаослы]].",
        "unblocklogentry": "разблокировать кариз $1",
        "block-log-flags-anononly": "аноним викиавторъёс гинэ",
-       "block-log-flags-nocreate": "регистрация учётной книгая ужъёсты быдэстон",
-       "block-log-flags-noemail": "лÑ\8dзÑ\8cÑ\8bмÑ\82Ñ\8d Ð³Ð¾Ð¶Ñ\82Ñ\8dÑ\82 Ñ\8bÑ\81Ñ\82он",
+       "block-log-flags-nocreate": "аккаунтъёсыз кылдытон дугдытэмын",
+       "block-log-flags-noemail": "гожÑ\82Ñ\8dÑ\82Ñ\8aÑ\91Ñ\81Ñ\8bз Ñ\8bÑ\81Ñ\82Ñ\8bлÑ\8bнÑ\8b Ñ\83г Ð»Ñ\83Ñ\8b",
        "block-log-flags-nousertalk": "уг быгаты ас вераськон бамзэ вошъяны",
        "range_block_disabled": "Администраторъёслэн диапазонъёсыз блокировать карыны луонлыксы дугдытэмын.",
        "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
        "exif-colorspace": "Буёлъёслэн пространствозы",
        "exif-datetimeoriginal": "Нырысь дата но дыр",
        "exif-datetimedigitized": "Цифраослы пӧрмытонлэн датаез но дырыз",
-       "exif-disclaimer": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8bнÑ\8b Ð¿Ñ\83миÑ\82 Ð»Ñ\83он",
+       "exif-disclaimer": "Ð\9aÑ\8bл ÐºÑ\83Ñ\82Ñ\8dмлÑ\8dÑ\81Ñ\8c ÐºÑ\83Ñ\88Ñ\82Ó¥Ñ\81Ñ\8cкон",
        "exif-orientation-1": "Огшоры",
        "namespacesall": "ваньзэ",
        "monthsall": "ваньзэ",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
        "tags-title": "Меткаос",
        "logentry-delete-delete": "$1 {{GENDER:$2|быдтӥз}} $3 бамез",
-       "logentry-delete-restore": "$1 {{GENDER:$2|вÑ\8bлÑ\8cÑ\8bÑ\81Ñ\8c}} Ð±Ð°Ð¼ $3",
-       "logentry-block-block": "$1 {{GENDER:$2|заблокировать}} {{GENDER:$4|$3}} ын дыраз $5 $6",
-       "logentry-block-reblock": "$1 {{GENDER:$2|воштыны}} блокировка дыръя {{GENDER:$4|$3}} ын дыраз $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|заблокировать}} {{GENDER:$4|$3}} ын дыраз $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|воштыны}} блокировка дыръя {{GENDER:$4|$3}} ын дыраз $5 $6",
+       "logentry-delete-restore": "$1 {{GENDER:$2|беÑ\80ен Ñ\81Ñ\91Ñ\82ӥз}} $3 Ð±Ð°Ð¼ÐµÐ·",
+       "logentry-block-block": "$1 {{GENDER:$2|заблокировать кариз}} {{GENDER:$4|$3}} дырлы: $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|воштӥз}} блокировкалэсь йылпумъянзэ {{GENDER:$4|$3}} понна дырлы: $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|заблокировать кариз}} {{GENDER:$4|$3}} дырлы: $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|воштӥз}} блокировкалэсь йылпумъянзэ {{GENDER:$4|$3}} понна дырлы: $5 $6",
        "logentry-move-move": "$1 $3 бамлы $4 выль ним {{GENDER:$2|сётӥз}}",
        "logentry-newusers-create": "$1 нимо учётной запись {{GENDER:$2|кылдытэмын}} вал",
        "logentry-upload-upload": "$1 {{GENDER:$2|понӥз}} $3",
index de19903..7d515d6 100644 (file)
        "missing-revision": "Версія #$1 сторінки «{{FULLPAGENAME}}» не існує.\n\nІмовірно, Ви перейшли за застарілим посиланням на вилучену сторінку.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "userpage-userdoesnotexist": "Користувач під назвою \"<nowiki>$1</nowiki>\" не зареєстрований. Переконайтеся, що ви хочете створити/редагувати цю сторінку.",
        "userpage-userdoesnotexist-view": "Обліковий запис користувача «$1» не зареєстровано.",
-       "blocked-notice-logextract": "Цей користувач наразі заблокований.\nОстанній запис у журналі блокувань такий:",
+       "blocked-notice-logextract": "{{GENDER:$1|Цей користувач|Ця користувачка}} наразі {{GENDER:$1|заблокований|заблокована}}.\nОстанній запис у журналі блокувань такий:",
        "clearyourcache": "<strong>Увага:</strong> Після збереження слід очистити кеш оглядача, щоб побачити зміни.\n* <strong>Firefox / Safari:</strong> тримайте <em>Shift</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em> чи <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Apple Mac)\n* <strong>Google Chrome:</strong> натисніть <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Apple Mac)\n* <strong>Internet Explorer:</strong> тримайте <em>Ctrl</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em>\n* <strong>Opera:</strong> очистіть кеш за допомогою <em>Інструменти → Налаштування</em> (<em>Opera → Побажання</em> на Apple Mac) та перейдіть на <em>Приватність & безпека → очистити дані браузера → кеш</em>",
        "usercssyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
        "userjsyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
        "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|1=групи|груп}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 (до $2)",
        "prefs-registration": "Час реєстрації:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Справжнє ім'я:",
        "editinguser": "Зміна прав {{GENDER:$1|користувача}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Перегляд прав {{GENDER:$1|користувача|користувачки}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
-       "userrights-viewusergroup": "Перегляд груп користувача",
+       "userrights-viewusergroup": "Перегляд груп {{GENDER:$1|користувача|користувачки}}",
        "saveusergroups": "Зберегти групи {{GENDER:$1|користувачів}}",
        "userrights-groupsmember": "Член груп:",
        "userrights-groupsmember-auto": "Неявний член:",
-       "userrights-groups-help": "Ви можете змінити групи, до яких належить цей користувач:\n* Якщо біля назви групи стоїть позначка, то користувач належить до цієї групи.\n* Якщо позначка не стоїть — користувач не належить до відповідної групи.\n* Зірочка означає, що ви не можете вилучити користувача з групи, якщо додасте його до неї, і навпаки.",
+       "userrights-groups-help": "Ви можете змінити групи, до яких належить {{GENDER:$1|цей користувач|ця користувачка}}:\n* Якщо біля назви групи стоїть позначка, то {{GENDER:$1|користувач|користувачка}} належить до цієї групи.\n* Якщо позначка не стоїть — {{GENDER:$1|користувач|користувачка}} не належить до відповідної групи.\n* Зірочка «*» означає, що Ви не можете вилучити {{GENDER:$1|користувача|користувачку}} з групи, якщо додасте {{GENDER:$1|його|її}} до неї, і навпаки.\n* Решітка «#» означає, що Ви можете зменшити строк членства в групі, але не збільшити.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нема дозволу змінювати права користувачів на інших вікі.",
        "userrights-nodatabase": "База даних $1 не існує або не є локальною.",
        "userrights-changeable-col": "Групи, які ви можете змінити",
        "userrights-unchangeable-col": "Групи, які ви не можете змінити",
        "userrights-irreversible-marker": "$1*",
+       "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": "Користувачі",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показати",
        "rcfilters-activefilters": "Активні фільтри",
+       "rcfilters-restore-default-filters": "Відновити стандартні фільтри",
+       "rcfilters-clear-all-filters": "Очистити фільтри",
        "rcfilters-search-placeholder": "Фільтруйте нові редагування (переглядайте або почніть вводити)",
        "rcfilters-invalid-filter": "Недійсний фільтр",
+       "rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
        "rcfilters-filterlist-title": "Фільтри",
        "rcfilters-filterlist-noresults": "Фільтри не знайдено",
+       "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-filter-editsbyother-description": "Редагування, виконані іншими користувачами (не Вами).",
+       "rcfilters-filtergroup-userExpLevel": "Рівень досвіду (тільки для зареєстрованих користувачів)",
        "rcfilters-filter-userExpLevel-newcomer-label": "Новачки",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Ð\94Ñ\83же Ð½Ð¾Ð²Ñ\96 Ñ\80едакÑ\82оÑ\80и: Ð¼ÐµÐ½Ñ\88 ніж 10 редагувань і 4 дні активності.",
+       "rcfilters-filter-userExpLevel-newcomer-description": "Ð\9cенÑ\88е ніж 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-filtergroup-automated": "Автоматизовані редагування",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Редагування, зроблені з допомогою автоматизованих засобів.",
+       "rcfilters-filter-humans-label": "Людина (не бот)",
+       "rcfilters-filter-humans-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": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "uploaded-setting-handler-svg": "SVG, який встановлює атрибут «handler» з віддаленою адресою/даними/сценарієм, заблоковано. У завантаженому SVG-файлі знайдено <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "SVG, який встановлює будь-який атрибут з віддаленим URL, заблоковано. У завантаженому SVG-файлі знайдено <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "У завантаженому SVG-файлі знайдено фільтр зображення з URL: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploadscriptednamespace": "Цей SVG-файл містить недопустимий простір назв «$1».",
+       "uploadscriptednamespace": "Цей SVG-файл містить недопустимий простір назв «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "Не вдалося проаналізувати XML у завантаженому файлі.",
        "uploadvirus": "Файл містить вірус! Див. $1",
        "uploadjava": "Файл є ZIP-архівом, що містить .class-файл Java.\nЗавантаження Java-файлів не дозволене, бо вони можуть використовуватися для обходу системи безпеки.",
        "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 мс}}",
        "apisandbox-results-fixtoken": "Виправте токен і надішліть ще раз",
        "apisandbox-results-fixtoken-fail": "Не вдалося викликати токен «$1».",
        "emailccsubject": "Копія вашого повідомлення до $1: $2",
        "emailsent": "Електронне повідомлення надіслано",
        "emailsenttext": "Ваше електронне повідомлення надіслано.",
-       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}. {{GENDER:$2|Ваш}} електронний лист потрапить безпосередньо до {{GENDER:$1|початковго відправника|початкової відправниці}}, відкривши {{GENDER:$1|йому|їй}} {{GENDER:$2|Вашу}} електронну адресу.",
+       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}. Якщо Ви відповісте на цей лист, Ваш електронний лист буде надіслано безпосередньо до {{GENDER:$1|початковго відправника|початкової відправниці}}, відкривши {{GENDER:$1|йому|їй}} {{GENDER:$2|Вашу}} електронну адресу.",
        "usermessage-summary": "Залишити системне повідомлення.",
        "usermessage-editor": "Системний вісник",
        "usermessage-template": "MediaWiki:UserMessage",
        "svg-long-error": "неправильний SVG-файл: $1",
        "show-big-image": "Повна роздільність",
        "show-big-image-preview": "Розмір при попередньому перегляді: $1.",
-       "show-big-image-preview-differ": "Розмір цього $3-превью для вихідного $2-файлу: $1.",
+       "show-big-image-preview-differ": "Розмір цього попереднього перегляду $3 для вихідного $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Інша роздільність|Інші роздільності}}: $1.",
        "show-big-image-size": "$1 × $2 пікселів",
        "file-info-gif-looped": "кільцеве",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|оновив|оновила}} мітки запису журналу $5 сторінки $3 ({{PLURAL:$7|додано}} $6; {{PLURAL:$9|вилучено}} $8)",
        "rightsnone": "(нема)",
        "revdelete-summary": "коментар до редагування",
+       "rightslogentry-temporary-group": "$1 (тимчасово, до $2)",
        "feedback-adding": "Додавання відгуку на сторінку ...",
        "feedback-back": "Назад",
        "feedback-bugcheck": "Чудово! Просто перевірте, що це не одна з вже [$1 відомих помилок].",
        "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": "сесій на основі кук",
index c688878..860697d 100644 (file)
        "saveprefs": "محفوظ",
        "restoreprefs": "تمام ابتدائی ترتیبات کو بحال کریں",
        "prefs-editing": "ترمیم کاری",
-       "rows": "صفیں:",
-       "columns": "قطاریں:",
        "searchresultshead": "تلاش",
        "stub-threshold": "نامکمل ربط کے فارمیٹ کی حد ($1):",
        "stub-threshold-sample-link": "نمونہ",
        "uploadscripted": "اس فائل میں ایچ ٹی ایم ایل یا اسکرپٹ کوڈ کا استعمال کیا گیا ہے لہذا عین ممکن ہے کہ کوئی ویب براؤزر اس کی غلط تشریح کرے۔",
        "upload-scripted-pi-callback": "ایسی کسی فائل کو اپلوڈ نہیں کیا جا سکتا جس میں ایکس ایم ایل اسٹائل شیٹ پر عمل کرنے کی ہدایت ہو۔",
        "uploaded-hostile-svg": "اپلوڈ کردہ ایس وی جی فائل کے اسٹائل عنصر میں غیر محفوظ سی ایس ایس دریافت ہوئی ہے۔",
-       "uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"$1\" موجود ہے۔",
+       "uploadscriptednamespace": "اس ایس وی جی فائل میں غیر قانونی نام فضا \"<nowiki>$1</nowiki>\" موجود ہے۔",
        "uploadinvalidxml": "اپلوڈ کردہ فائل میں موجود ایکس ایم ایل کا تجزیہ نہیں کیا جا سکا۔",
        "uploadvirus": "اس فائل میں وائرس موجود ہے!\nتفصیلات: $1",
        "upload-source": "اصل فائل",
        "feedback-useragent": "یوزر ایجنٹ:",
        "searchsuggest-search": "تلاش",
        "searchsuggest-containing": "نتائج...",
-       "api-error-autoblocked": "آپ کے آئی پی پتے پر خودکار طور پر پابندی لگا دی گئی ہے، کیونکہ اسے کسی ممنوع صارف نے استعمال کیا ہے۔",
-       "api-error-badaccess-groups": "آپ کو اس ویکی میں فائلیں اپلوڈ کرنے کی اجازت نہیں ہے۔",
        "api-error-badtoken": "داخلی نقص: غلط ٹوکن۔",
-       "api-error-blocked": "آپ کی ترمیم کاری پر پابندی لگا دی گئی ہے۔",
-       "api-error-copyuploaddisabled": "یوآرایل کے ذریعہ اس سرور پر اپلوڈ کو غیر فعال کر دیا گیا ہے۔",
-       "api-error-duplicate": "یکساں مواد کی حامل {{PLURAL:$1|ایک اور فائل|مزید فائلیں}} ویکی پر موجود {{PLURAL:$1|ہے|ہیں}}۔",
-       "api-error-duplicate-archive": "یکساں مواد کی حامل {{PLURAL:$1|ایک اور فائل|مزید فائلیں}} ویکی پر موجود {{PLURAL:$1|تھی|تھیں}}، لیکن {{PLURAL:$1|اسے|انہیں}} حذف کر دیا گیا۔",
-       "api-error-empty-file": "آپ کی ارسال کردہ فائل خالی تھی۔",
        "api-error-emptypage": "نئے خالی صفحات بنانے کی اجازت نہیں ہے۔",
-       "api-error-fetchfileerror": "داخلی نقص: فائل کو اخذ کرنے کے دوران میں کچھ غلط ہوا ہے۔",
-       "api-error-fileexists-forbidden": "«$1» کے نام سے ایک فائل پہلے سے موجود ہے، اسے تبدیل نہیں کیا جا سکتا۔",
-       "api-error-fileexists-shared-forbidden": "«$1» کے نام سے مشترکہ ذخیرے میں ایک فائل پہلے سے موجود ہے، اسے تبدیل نہیں کیا جا سکتا۔",
-       "api-error-file-too-large": "آپ کی ارسال کردہ فائل بہت بڑی تھی۔",
-       "api-error-filename-tooshort": "فائل کا نام انتہائی مختصر ہے۔",
-       "api-error-filetype-banned": "فائل کی اس قسم پر پابندی عائد ہے۔",
-       "api-error-filetype-banned-type": "$1 نوعیت کی {{PLURAL:$4|فائل|فائلوں}} کی اجازت نہیں۔\nاجازت یافتہ نوعیت کی {{PLURAL:$3|فائل|فائلیں}} $2 {{PLURAL:$3|ہے|ہیں}}۔",
-       "api-error-filetype-missing": "فائل کی توسیع موجود نہیں",
-       "api-error-hookaborted": "آپ نے جو تبدیلی کرنے کی کوشش کی اسے کسی توسیع نے منسوخ کر دیا۔",
-       "api-error-http": "داخلی نقص: سرور سے رابطہ نہیں ہو سکا",
-       "api-error-illegal-filename": "اس نام کی فائل ممنوع ہے۔",
-       "api-error-internal-error": "داخلی نقص: ویکی پر آپ کے اپلوڈ کی انجام دہی کے دوران میں کچھ غلط واقع ہوا۔",
-       "api-error-invalid-file-key": "داخلی نقص: عارضی ذخیرے میں فائل نہیں مل سکی۔",
-       "api-error-missingparam": "داخلی نقص: درخواست میں مفقود متغیرات",
-       "api-error-missingresult": "داخلی نقص: نہیں بتایا جا سکتا کہ نقل و چسپاں کا عمل کامیاب ہوا یا نہیں۔",
-       "api-error-mustbeloggedin": "فائلیں اپلوڈ کرنے کے لیے آپ کا داخل ہونا ضروری ہے۔",
-       "api-error-mustbeposted": "داخلی نقص: یہ درخواست HTTP POST کی متقاضی ہے۔",
-       "api-error-noimageinfo": "اپلوڈ کامیاب رہا لیکن فائل کے متعلق سرور نے ہمیں کسی قسم کی معلومات بہم نہیں پہنچائیں۔",
-       "api-error-nomodule": "داخلی نقص: کسی ماڈیول کو مرتب نہیں کیا گیا۔",
-       "api-error-ok-but-empty": "داخلی نقص: سرور سے کوئی جواب نہیں ملا۔",
-       "api-error-overwrite": "موجودہ فائل کو دوبارہ اپلوڈ کرنے کی اجازت نہیں۔",
-       "api-error-ratelimited": "مختصر وقت میں آپ اس ویکی میں اجازت یافتہ تعداد سے زیادہ فائلوں کو اپلوڈ کرنے کی کوشش کر رہے ہیں۔\nبراہ کرم کچھ منٹ بعد دوبارہ کوشش کریں۔",
-       "api-error-stashfailed": "داخلی نقص: عارضی فائل رکھنے میں سرور کو ناکامی ہوئی۔",
        "api-error-publishfailed": "داخل نقص: عارضی فائل شائع کرنے میں سرور کو ناکامی ہوئی۔",
-       "api-error-stasherror": "نہاں خانے میں فائل کو اپلوڈ کرتے وقت کوئی نقص واقع ہوا۔",
-       "api-error-stashedfilenotfound": "نہاں خانے میں رکھی گئی فائل وہاں سے اپلوڈ کرنے کے دوران نہیں ملی۔",
-       "api-error-stashpathinvalid": "وہ جگہ غلط ہے جہاں پوشیدہ فائل ملنی چاہیے تھی۔",
-       "api-error-stashfilestorage": "نہاں خانے میں فائل کو رکھتے وقت کوئی نقص واقع ہوا۔",
-       "api-error-stashzerolength": "سرور اس فائل کو پوشیدہ نہ کر سکا کیونکہ اس کی لمبائی صفر ہے۔",
-       "api-error-stashnotloggedin": "اپلوڈ کے نہاں خانے میں فائلوں کو محفوظ کرنے کے لیے آپ کا داخل ہونا ضروری ہے۔",
-       "api-error-stashwrongowner": "فائل کی جس کلید کے ذریعہ آپ نہاں خانے میں رسائی کی کوشش کر رہے ہیں وہ آپ کی نہیں ہے۔",
-       "api-error-stashnosuchfilekey": "فائل کی جس کلید کے ذریعہ آپ نہاں خانے میں رسائی کی کوشش کر رہے ہیں وہ موجود نہیں۔",
-       "api-error-timeout": "متوقع مدت کے دوران میں سرور نے کوئی جواب نہیں دیا۔",
-       "api-error-unclassified": "نامعلوم نقص واقع ہوا۔",
-       "api-error-unknown-code": "نامعلوم نقص: \"$1\" ۔",
-       "api-error-unknown-error": "داخلی نقص: آپ کی فائل کو اپلوڈ کرنے کے دوران میں کچھ غلط ہو گیا ہے۔",
+       "api-error-stashfailed": "داخلی نقص: عارضی فائل رکھنے میں سرور کو ناکامی ہوئی۔",
        "api-error-unknown-warning": "نامعلوم انتباہ: \"$1\"",
        "api-error-unknownerror": "نامعلوم نقص: \"$1\"",
-       "api-error-uploaddisabled": "اس ویکی پر اپلوڈ کی سہولت غیر فعال ہے۔",
-       "api-error-verification-error": "شاید فائل خراب ہے یا غلط توسیع کی حامل ہے۔",
-       "api-error-was-deleted": "اس نام کی فائل پہلے اپلوڈ کی گئی تھی اور معاً بعد حذف کر دی گئی۔",
        "duration-seconds": "$1 {{PLURAL:$1|سیکنڈ}}",
        "duration-minutes": "$1 {{PLURAL:$1|منٹ}}",
        "duration-hours": "$1 {{PLURAL:$1|گھنٹہ|گھنٹے}}",
index 9446b05..c72fc02 100644 (file)
        "passwordreset-emaildisabled": "Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.",
        "passwordreset-username": "Nome utente:",
        "passwordreset-domain": "Dominio",
-       "passwordreset-capture": "Vixuałixare el contenuto del mesajo de posta ełetronega?",
-       "passwordreset-capture-help": "Se se sełesiona sta caxeła, l'indiriso de posta ełetronega (co' ła password tenporanea) ve vegnarà mostrà anca a voialtri oltre che esare invià a 'l utente.",
        "passwordreset-email": "Indiriso de posta ełetronega",
        "passwordreset-emailtitle": "Detaji de l'account so {{SITENAME}}",
        "passwordreset-emailtext-ip": "Cualcheduni (probabilmente ti, co indiriso IP $1) ga richiesto l'invio de na nova password par l'aceso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente asocià|I utenti asociadi}} a sto indiriso de posta ełetronega łi xe:\n\n$2\n\n{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.\n\nSarìa mejo acedare e deçidare na nova password sùito. Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
        "userinvalidcssjstitle": "'''Ocio:'''  No ghe xe nissuna skin con nome \"$1\". Nota che le pagine par i .css e .js personalizà le gà l'iniziale del titolo minuscola, par esenpio {{ns:user}}:Esenpio/vector.css e no {{ns:user}}:Esenpio/Vector.css.",
        "updated": "(Agiornà)",
        "note": "'''Nota:'''",
-       "previewnote": "Sta cua ła xe soło n'anteprima; i canbiamenti a ła pajina NO i xe gnancora stà salvài!",
+       "previewnote": "'''Tiente in mente che sta qua la xe solo n'anteprima.'''\nI to canbiamenti NO i xe gnancora stà salvài!",
        "continue-editing": "Va a l'area de modifega",
        "previewconflict": "Sta anteprima la corisponde al testo ne la casèla de edizion de sora, e la fa védar come vegnarà fora la pagina se te machi \"Salva la pagina\" in sto momento.",
        "session_fail_preview": "No xè stà possibiłe salvar le to modifiche parché i dati de la session i xè andai persi.\nPar piaser, riproa da novo.\nSe no funsiona gnancora, proa a [[Special:UserLogout|scołegarte]] e a cołegarte de novo.'''",
        "saveprefs": "Salva le preferense",
        "restoreprefs": "Ripristina le inpostassion predefinìe",
        "prefs-editing": "Canbiamento",
-       "rows": "Righe:",
-       "columns": "Cołone:",
        "searchresultshead": "Riserca",
        "stub-threshold": "Valor minimo par i <a href=\"#\" class=\"stub\">colegamenti ai stub</a>:",
        "stub-threshold-disabled": "Disativà",
        "userrights-reason": "Motivassion:",
        "userrights-no-interwiki": "No te ghè i parmessi necessari par modificar i diriti dei utenti su altri siti.",
        "userrights-nodatabase": "El database $1 no l'esiste mìa o no l'è un database local.",
-       "userrights-nologin": "Par assegnarghe diriti ai utenti te ghè da [[Special:UserLogin|efetuar l'acesso]] come aministrador.",
-       "userrights-notallowed": "No te ghe i parmesi necesari par xontarghe o cavarghe diriti ai utenti.",
        "userrights-changeable-col": "Grupi che te pol canbiar",
        "userrights-unchangeable-col": "Grupi che no te pol canbiar",
        "userrights-conflict": "Conflito de diriti utente! Aplica de novo le to modifiche.",
        "right-siteadmin": "Bloca e desbloca el database",
        "right-override-export-depth": "Esporta le pàxene, includendo le pàxene ligàe fin a na profondità de 5",
        "right-sendemail": "Mandarghe e-mail a cheialtri utenti",
-       "right-passwordreset": "Vedi i mesaji de rinpostasion de ła password",
        "newuserlogpage": "Novi utenti",
        "newuserlogpagetext": "Sto qua el xè el registro dei novi utenti registrai.",
        "rightslog": "Diriti de i utenti",
        "sp-contributions-search": "Serca contributi",
        "sp-contributions-username": "Indirizo IP o nome utente:",
        "sp-contributions-toponly": "Mostra solo i contributi che i xe l'ultima revision de la pagina",
+       "sp-contributions-newonly": "Fame védar solo le creassion de pagina",
+       "sp-contributions-hideminor": "Scondi i canbiamenti picenini",
        "sp-contributions-submit": "Riserca",
        "whatlinkshere": "Punta qua",
        "whatlinkshere-title": "Pagine che ponta a ''$1''",
        "feedback-thanks-title": "Grassie!",
        "searchsuggest-search": "Serca drento de {{SITENAME}}",
        "searchsuggest-containing": "che contien...",
-       "api-error-badaccess-groups": "Nó te si autorixà a cargar documenti so sta wiki.",
        "api-error-badtoken": "Eror interno: token fałà.",
-       "api-error-copyuploaddisabled": "El cargamento tramite URL el xe dixabiłità so sto server.",
-       "api-error-duplicate": "So'l sito {{PLURAL:$1|ghe xe xà 'n altro documento|ghe xe xà altri documenti}} có 'l steso contegnuo.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ghe xera 'n altro file|Ghe xera altri file}} xà inte'l sito có 'l steso contegnuo, ma {{PLURAL:$1|el xe sta scansełà|i xe stai scansełai}}.",
-       "api-error-empty-file": "El file sełesionà el gera vodo.",
        "api-error-emptypage": "Ła creasion de nove pàjine vode nó ła xe consentia.",
-       "api-error-fetchfileerror": "Eror interno: ghe xe sta un problema durante el recupero del documento.",
-       "api-error-fileexists-forbidden": "Un file de nome \"$1\" 'l existe xà e nò 'l pol esar sovrascrito.",
-       "api-error-fileexists-shared-forbidden": "Un file de nome \"$1\" 'l existe xà inte'l repository condivixo e nó 'l pol esar sovrascrito.",
-       "api-error-file-too-large": "El file sełesionà el gera masa grando.",
-       "api-error-filename-tooshort": "El nome del file el xe massa curto.",
-       "api-error-filetype-banned": "Sto tipo de file el xe vietà.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nó 'l xe un tipo de file consentio|nó i xe tipi de file consentìi}}. {{PLURAL:$3|El tipo de file consentio el xe|I tipi de file consentìi i xe}} $2.",
-       "api-error-filetype-missing": "Al file ghe manca l'estension.",
-       "api-error-hookaborted": "Ła modifega che te ghe proà a far ła xe sta interota da na estension.",
-       "api-error-http": "Eror interno: inposibiłe conetarse al server.",
-       "api-error-illegal-filename": "El nome del file nó 'l xe parmeso.",
-       "api-error-internal-error": "Eror interno: calcosa xe ndà storo có l'elaborasion del to cargamento so ła wiki.",
-       "api-error-invalid-file-key": "Eror interno: file nó prexente inte ła carteła de i file tenporanei.",
-       "api-error-missingparam": "Eror interno: parametri de ła dimanda mancanti.",
-       "api-error-missingresult": "Eror interno: inposibiłe determinar se ła copia ła xe riusia.",
-       "api-error-mustbeloggedin": "Te ghe da efetuar 'l aceso par cargar i file.",
-       "api-error-mustbeposted": "Eror interno: ła dimanda dimanda HTTP POST.",
-       "api-error-noimageinfo": "El cargamento el xe riusio, ma 'l server nó el ne ga dato gnauna informasion so'l file.",
-       "api-error-nomodule": "Eror interno: nó xe sta inpostà el moduło de cargamento.",
-       "api-error-ok-but-empty": "Eror interno: nisuna risposta dal server.",
-       "api-error-overwrite": "Nó xe parmeso de sorascrìvar un file existente.",
-       "api-error-stashfailed": "Eror interno: el server nó 'l xe riusio a memorixar el documento tenporaneo.",
        "api-error-publishfailed": "Eror interno: el server nó 'l xe riusio a publicar el documento tenporaneo.",
-       "api-error-timeout": "El server nó 'l ga risposto entro el tenpo previsto.",
-       "api-error-unclassified": "Se gà verifegà un eror sconosùo.",
-       "api-error-unknown-code": "Eror sconosùo: \"$1\"",
-       "api-error-unknown-error": "Eror interno: calcosa xe ndà storto có se jera drio proar a cargar el file.",
+       "api-error-stashfailed": "Eror interno: el server nó 'l xe riusio a memorixar el documento tenporaneo.",
        "api-error-unknown-warning": "Avixo sconosùo: \"$1\".",
        "api-error-unknownerror": "Eror sconosùo: \"$1\".",
-       "api-error-uploaddisabled": "El cargamento el xe dixabiłità so sta wiki.",
-       "api-error-verification-error": "Sto file el podaria esar danegià, o 'ver l'estension sbałià.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|secondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index d4ff264..ca65ea9 100644 (file)
        "searcharticle": "Xem",
        "history": "Lịch sử trang",
        "history_short": "Lịch sử",
+       "history_small": "lịch sử",
        "updatedmarker": "được cập nhật kể từ lần xem cuối",
        "printableversion": "Bản để in",
        "permalink": "Liên kết thường trực",
        "botpasswords-label-appid": "Tên bot:",
        "botpasswords-label-create": "Tạo",
        "botpasswords-label-update": "Cập nhật",
-       "botpasswords-label-cancel": "Huỷ bỏ",
+       "botpasswords-label-cancel": "Hủy bỏ",
        "botpasswords-label-delete": "Xoá",
        "botpasswords-label-resetpassword": "Đặt lại mật khẩu",
        "botpasswords-label-grants": "Các quyền có liên quan:",
        "blockedtitle": "Thành viên bị cấm",
        "blockedtext": "'''Tên người dùng hoặc địa chỉ IP của bạn đã bị cấm.'''\n\nNgười thực hiện cấm là $1.\nLý do được cung cấp là ''$2''.\n\n* Bắt đầu cấm: $8\n* Kết thúc cấm: $6\n* Mục tiêu cấm: $7\n\nBạn có thể liên hệ với $1 hoặc một [[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.\nBạn không thể sử dụng tính năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn tài khoản]] và bạn không bị khóa chức năng đó.\nĐịa chỉ IP hiện tại của bạn là $3, và mã số cấm là #$5.\nXin hãy ghi kèm tất cả các thông tin trên vào thư yêu cầu của bạn.",
        "autoblockedtext": "Địa chỉ IP của bạn đã bị tự động cấm vì một người nào đó đã sử dụng nó, $1 là thành viên đã thực hiện cấm.\nLý do được cung cấp là:\n\n:''$2''\n\n* Bắt đầu cấm: $8\n* Kết thúc cấm: $6\n* Mục tiêu cấm: $7\n\nBạn có thể liên hệ với $1 hoặc một trong số các\n[[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.\n\nChú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn]] và bạn không bị cấm dùng chức năng đó.\n\nĐịa chỉ IP hiện tại của bạn là $3, mã số cấm là $5.\nXin hãy ghi kèm tất cả các chi tiết trên vào thư yêu cầu của bạn.",
+       "systemblockedtext": "Tên người dùng hoặc địa chỉ IP của bạn bị MediaWiki cấm tự động.\nLý do được cung cấp là:\n\n:<em>$2</em>\n\n* Bắt đầu cấm: $8\n* Kết thúc cấm: $6\n* Mục tiêu cấm: $7\n\nĐịa chỉ IP hiện tại của bạn là $3.\nXin vui lòng bao gồm tất cả các chi tiết bên trên khi nào hỏi về tác vụ này.",
        "blockednoreason": "không đưa ra lý do",
        "whitelistedittext": "Bạn phải $1 để sửa trang.",
        "confirmedittext": "Bạn cần phải xác nhận địa chỉ thư điện tử trước khi được sửa đổi trang. Xin hãy đặt và xác nhận địa chỉ thư điện tử của bạn dùng trang [[Special:Preferences|tùy chọn]].",
        "search-interwiki-caption": "Các dự án liên quan",
        "search-interwiki-default": "Kết quả từ $1:",
        "search-interwiki-more": "(thêm)",
+       "search-interwiki-more-results": "thêm kết quả",
        "search-relatedarticle": "Liên quan",
        "searchrelated": "có liên quan",
        "searchall": "tất cả",
        "saveprefs": "Lưu tùy chọn",
        "restoreprefs": "Mặc định lại toàn bộ tùy chọn (trong tất cả các phần)",
        "prefs-editing": "Sửa đổi",
-       "rows": "Số hàng:",
-       "columns": "Số cột:",
        "searchresultshead": "Tìm kiếm",
        "stub-threshold": "Định dạng liên kết đến sơ khai ($1) cho các trang ngắn hơn:",
        "stub-threshold-sample-link": "ví dụ",
        "youremail": "Thư điện tử:",
        "username": "{{GENDER:$1}}Tên người dùng:",
        "prefs-memberingroups": "{{GENDER:$2}}Thành viên của {{PLURAL:$1|nhóm|các nhóm}}:",
+       "group-membership-link-with-expiry": "$1 (cho đến $2)",
        "prefs-registration": "Lúc mở tài khoản:",
        "yourrealname": "Tên thật:",
        "yourlanguage": "Ngôn ngữ:",
        "userrights-user-editname": "Nhập tên thành viên:",
        "editusergroup": "Tải nhóm người dùng",
        "editinguser": "Thay đổi quyền hạn của người dùng <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Sửa nhóm thành viên",
+       "viewinguserrights": "Xem quyền hạn của người dùng <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Sửa nhóm {{GENDER:$1}}thành viên",
+       "userrights-viewusergroup": "Xem nhóm {{GENDER:$1}}người dùng",
        "saveusergroups": "Lưu nhóm {{GENDER:$1}}người dùng",
        "userrights-groupsmember": "Thuộc nhóm:",
        "userrights-groupsmember-auto": "Ngầm thuộc nhóm:",
-       "userrights-groups-help": "Bạn có thể xếp thành viên này vào nhóm khác:\n* Hộp kiểm được đánh dấu có nghĩa rằng thành viên thuộc về nhóm đó.\n* Hộp không được đánh dấu có nghĩa rằng thành viên không thuộc về nhóm đó.\n* Dấu * có nghĩa là bạn sẽ không thể loại thành viên ra khỏi nhóm một khi bạn đã đưa thành viên vào, hoặc ngược lại.",
+       "userrights-groups-help": "Bạn có thể xếp thành viên này vào nhóm khác:\n* Hộp kiểm được đánh dấu có nghĩa rằng thành viên thuộc về nhóm đó.\n* Hộp không được đánh dấu có nghĩa rằng thành viên không thuộc về nhóm đó.\n* Dấu * có nghĩa là bạn sẽ không thể loại thành viên ra khỏi nhóm một khi bạn đã đưa thành viên vào, hoặc ngược lại.\n* Dấu # có nghĩa là bạn chỉ có thể trì hoãn thời hạn của nhóm này; bạn không thể đẩy sớm thời hạn.",
        "userrights-reason": "Lý do:",
        "userrights-no-interwiki": "Bạn không có quyền thay đổi quyền hạn của thành viên tại các wiki khác.",
        "userrights-nodatabase": "Cơ sở dữ liệu $1 không tồn tại hoặc nằm ở bên ngoài.",
        "userrights-changeable-col": "Những nhóm bạn có thể thay đổi",
        "userrights-unchangeable-col": "Những nhóm bạn không thể thay đổi",
+       "userrights-expiry-current": "Hết hạn $1",
+       "userrights-expiry-none": "Vô hạn",
+       "userrights-expiry": "Thời hạn:",
+       "userrights-expiry-existing": "Thời hạn hiện thời: $3, $2",
+       "userrights-expiry-othertime": "Thời gian khác:",
+       "userrights-expiry-options": "1 ngày:1 day,1 tuần:1 week,1 tháng:1 month,3 tháng:3 months,6 tháng:6 months,1 năm:1 year",
+       "userrights-invalid-expiry": "Thời hạn của nhóm “$1” không hợp lệ.",
+       "userrights-expiry-in-past": "Thời hạn của nhóm “$1” đã xảy ra ở quá khứ.",
+       "userrights-cannot-shorten-expiry": "Bạn không thể đẩy sớm thời hạn của nhóm “$1”. Chỉ có những người dùng có quyền thêm hay xóa nhóm này có thể đẩy sớm thời hạn.",
        "userrights-conflict": "Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng xem lại và xác nhận các thay đổi của bạn.",
        "group": "Nhóm:",
        "group-user": "Thành viên thông thường",
        "action-upload_by_url": "tải lên tập tin này từ địa chỉ URL",
        "action-writeapi": "dùng API để sửa đổi",
        "action-delete": "xóa trang này",
-       "action-deleterevision": "xóa phiên bản này",
-       "action-deletedhistory": "xem các phiên bản đã bị xóa của trang này",
+       "action-deleterevision": "xóa phiên bản",
+       "action-deletelogentry": "xóa mục nhật trình",
+       "action-deletedhistory": "xem các phiên bản đã bị xóa của trang",
+       "action-deletedtext": "xem văn bản của phiên bản đã xóa",
        "action-browsearchive": "tìm kiếm trang đã bị xóa",
-       "action-undelete": "phục hồi trang này",
-       "action-suppressrevision": "xem và phục hồi phiên bản ẩn này",
+       "action-undelete": "phục hồi trang",
+       "action-suppressrevision": "xem và phục hồi phiên bản ẩn",
        "action-suppressionlog": "xem nhật trình ẩn giấu này",
        "action-block": "cấm không cho người dùng này sửa đổi",
        "action-protect": "thay đổi mức khóa của trang này",
        "action-userrights-interwiki": "sửa đổi quyền của người dùng tại wiki khác",
        "action-siteadmin": "khóa hoặc mở khóa cơ sở dữ liệu",
        "action-sendemail": "gửi thư điện tử",
+       "action-editmyoptions": "sửa đổi tùy chọn của bạn",
        "action-editmywatchlist": "sửa đổi danh sách theo dõi của mình",
        "action-viewmywatchlist": "xem danh sách theo dõi của mình",
        "action-viewmyprivateinfo": "xem thông tin cá nhân của bạn",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Xem",
+       "rcfilters-activefilters": "Bộ lọc hiện hành",
+       "rcfilters-restore-default-filters": "Mặc định lại các bộ lọc",
+       "rcfilters-clear-all-filters": "Xóa sạch các bộ lọc",
+       "rcfilters-search-placeholder": "Lọc các thay đổi gần đây (duyệt hoặc bắt đầu đánh chữ)",
+       "rcfilters-invalid-filter": "Bộ lọc không hợp lệ",
+       "rcfilters-empty-filter": "Không có bộ lọc hiện hành. Tất cả các đóng góp được hiển thị.",
+       "rcfilters-filterlist-title": "Bộ lọc",
+       "rcfilters-filterlist-noresults": "Không tìm thấy bộ lọc",
+       "rcfilters-filtergroup-registration": "Trạng thái đăng ký thành viên",
+       "rcfilters-filter-registered-label": "Đã đăng ký",
+       "rcfilters-filter-registered-description": "Người dùng đã đăng nhập.",
+       "rcfilters-filter-unregistered-label": "Vô danh",
+       "rcfilters-filter-unregistered-description": "Người dùng chưa đăng nhập.",
+       "rcfilters-filtergroup-authorship": "Người sửa đổi",
+       "rcfilters-filter-editsbyself-label": "Bạn",
+       "rcfilters-filter-editsbyself-description": "Các sửa đổi của bạ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-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.",
+       "rcfilters-filter-humans-label": "Con người (không phải bot)",
+       "rcfilters-filter-humans-description": "Các sửa đổi của người thật.",
+       "rcfilters-filtergroup-significance": "Sự quan trọng",
+       "rcfilters-filter-minor-label": "Sửa đổi nhỏ",
+       "rcfilters-filter-minor-description": "Các sửa đổi được tác giả đánh dấu là nhỏ.",
+       "rcfilters-filter-major-label": "Sửa đổi không nhỏ",
+       "rcfilters-filter-major-description": "Các sửa đổi không được tác giả đánh dấu là nhỏ.",
+       "rcfilters-filtergroup-changetype": "Kiểu thay đổi",
+       "rcfilters-filter-pageedits-label": "Sửa đổi trang",
+       "rcfilters-filter-pageedits-description": "Các sửa đổi đối với nội dung, thảo luận, miêu tả thể loại, …",
+       "rcfilters-filter-newpages-label": "Tạo trang",
+       "rcfilters-filter-newpages-description": "Các sửa đổi tạo trang mới.",
+       "rcfilters-filter-categorization-label": "Thay đổi thể loại",
+       "rcfilters-filter-categorization-description": "Các tác vụ xếp trang vào thể loại hoặc gỡ trang khỏi thể loại.",
+       "rcfilters-filter-logactions-label": "Tác vụ được ghi trong nhật trình",
+       "rcfilters-filter-logactions-description": "Các tác vụ bảo quản, mở tài khoản, xóa trang, tải lên, …",
        "rcnotefrom": "Dưới đây là {{PLURAL:$5|thay đổi duy nhất|các thay đổi}} từ <strong>$3 $4</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
        "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "uploaded-setting-handler-svg": "Đã ngăn cản mã SVG đặt thuộc tính “handler” là từ xa/dữ liệu/kịch bản. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-remote-url-svg": "Đã ngăn cản mã SVG đặt thuộc tính style nào đó là URL ngoài máy. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-image-filter-svg": "Đã phát hiện bộ lọc hình ảnh có URL: <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
-       "uploadscriptednamespace": "Tập tin SVG này chứa không gian tên “$1” không được cho phép",
+       "uploadscriptednamespace": "Tập tin SVG này chứa không gian tên “<nowiki>$1</nowiki>” không được cho phép",
        "uploadinvalidxml": "Không thể phân tích mã XML trong tập tin tải lên.",
        "uploadvirus": "Tập tin có virút! Chi tiết: $1",
        "uploadjava": "Tập tin ZIP này chứa một tập tin Java .class.\nKhông được phép tải lên các tập tin Java, bởi vì chúng có thể vượt qua các hạn chế bảo mật.",
        "uncategorizedcategories": "Thể loại chưa phân loại",
        "uncategorizedimages": "Tập tin chưa được phân loại",
        "uncategorizedtemplates": "Bản mẫu chưa được phân loại",
+       "uncategorized-categories-exceptionlist": " # Danh sách các thể loại không nên liệt kê trong Special:UncategorizedCategories. Mỗi dòng một thể loại với tiền tố “*”. Các dòng bắt đầu với ký tự khác (kể cả khoảng cách) đuợc bỏ qua. Hãy dùng “#” để chú thích.",
        "unusedcategories": "Thể loại trống",
        "unusedimages": "Tập tin chưa dùng",
        "wantedcategories": "Thể loại cần thiết",
        "apisandbox-sending-request": "Đang gửi yêu cầu API...",
        "apisandbox-loading-results": "Nhận kết quả API...",
        "apisandbox-results-error": "Một lỗi xuất hiện khi tải các đáp ứng truy vấn API: $1.",
+       "apisandbox-request-selectformat-label": "Hiển thị dữ liệu yêu cầu dưới dạng:",
+       "apisandbox-request-format-url-label": "Chuỗi truy vấn URL",
        "apisandbox-request-url-label": "URL của yêu cầu:",
+       "apisandbox-request-json-label": "Yêu cầu dưới dạng JSON:",
        "apisandbox-request-time": "Thời gian yêu cầu: $1 ms",
        "apisandbox-results-fixtoken": "Sửa lại dấu hiệu và gửi lại",
        "apisandbox-results-fixtoken-fail": "Thất bại khi lấy dấu hiệu “$1”.",
        "emailccsubject": "Bản sao của thư gửi cho $1: $2",
        "emailsent": "Đã gửi",
        "emailsenttext": "Thư của bạn đã được gửi.",
-       "emailuserfooter": "Thư điện tử này được $1 gửi đến $2 thông qua chức năng “{{int:emailuser}}” của {{SITENAME}}.",
+       "emailuserfooter": "Thư điện tử này được $1 gửi đến $2 thông qua chức năng “{{int:emailuser}}” của {{SITENAME}}. Nếu bạn trả lời thư điện tử này, thư của bạn sẽ được gửi trực tiếp cho người gưi ban đầu, bằng cách đó cho họ biết địa chỉ thư điện tử của bạn.",
        "usermessage-summary": "Đang để lại thông điệp hệ thống.",
        "usermessage-editor": "Trình thông điệp hệ thống",
        "watchlist": "Danh sách theo dõi",
        "changecontentmodel-emptymodels-title": "Không có sẵn kiểu nội dung nào",
        "changecontentmodel-emptymodels-text": "Không thể chuyển đổi nội dung tại [[:$1]] thành nội dung dưới định dạng nào.",
        "log-name-contentmodel": "Nhật trình thay đổi kiểu nội dung",
-       "log-description-contentmodel": "Sự kiện có liên quan đến kiểu nội dung của trang.",
+       "log-description-contentmodel": "Đây là danh sách các thay đổi về mô hình nội dung của trang, cũng như các trang được tạo với mô hình nội dung không chuẩn.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2}}đã tạo trang $3 với kiểu nội dung không mặc định “$5”",
        "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi kiểu nội dung của trang $3 từ “$4” thành “$5”",
        "logentry-contentmodel-change-revertlink": "lùi lại",
        "proxyblockreason": "Địa chỉ IP của bạn đã bị cấm vì là proxy mở. Xin hãy liên hệ nhà cung cấp dịch vụ Internet hoặc bộ phận hỗ trợ kỹ thuật của bạn và thông báo với họ về vấn đề an ninh nghiêm trọng này.",
        "sorbsreason": "Địa chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng.",
        "sorbs_create_account_reason": "Địa chỉ chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng. Bạn không thể mở tài khoản.",
+       "softblockrangesreason": "Không cho phép đóng góp vô danh từ địa chỉ IP của bạn ($1). Xin hãy đăng nhập.",
        "xffblockreason": "Đầu đề X-Forwarded-For chứa một địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của một máy chủ proxy bạn đang sử dụng. Lý do cấm ban đầu là: $1",
        "cant-see-hidden-user": "Thành viên bạn muốn cấm đã bị cấm trước đây hoặc đã bị ẩn đi. Vì bạn không có quyền hideuser, bạn không thể xem hoặc thay đổi mức cấm của thành viên.",
        "ipbblocked": "Bạn không thể cấm hay bỏ cấm người dùng khác vì chính bạn đang bị cấm.",
        "cant-move-to-user-page": "Bạn không có quyền di chuyển một trang đến trang cá nhân (ngoại trừ đến trang con của trang cá nhân).",
        "cant-move-category-page": "Bạn không có quyền di chuyển trang thể loại.",
        "cant-move-to-category-page": "Bạn không có quyền di chuyển một trang vào không gian tên Thể loại.",
+       "cant-move-subpages": "Bạn không có quyền di chuyển trang con.",
+       "namespace-nosubpages": "Không gian tên “$1” không cho phép trang con.",
        "newtitle": "Tên mới:",
        "move-watch": "Theo dõi trang này",
        "movepagebtn": "Di chuyển trang",
        "pageinfo-length": "Chiều dài của trang (byte)",
        "pageinfo-article-id": "Mã số trang",
        "pageinfo-language": "Ngôn ngữ nội dung trang",
+       "pageinfo-language-change": "thay đổi",
        "pageinfo-content-model": "Kiểu nội dung trang",
        "pageinfo-content-model-change": "thay đổi",
        "pageinfo-robot-policy": "Ghi chỉ mục bởi robot",
        "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",
        "feedback-bugcheck": "Tuyệt! Chỉ cần kiểm tra nó chưa được [$1 báo cáo trước đây].",
        "feedback-useragent": "Tác nhân người dùng:",
        "searchsuggest-search": "Tìm kiếm {{SITENAME}}",
        "searchsuggest-containing": "có chứa…",
-       "api-error-autoblocked": "Địa chỉ IP của bạn bị cấm tự động vì nó đã được sử dụng bởi một người dùng bị cấm.",
-       "api-error-badaccess-groups": "Bạn không được phép tải tập tin lên wiki này.",
        "api-error-badtoken": "Lỗi nội bộ: Dấu hiệu bị hỏng.",
-       "api-error-blocked": "Bạn đã bị cấm không được sửa đổi.",
-       "api-error-copyuploaddisabled": "Chức năng tải lên từ URL đã bị tắt trên máy chủ này.",
-       "api-error-duplicate": "Wiki này đã có {{PLURAL:$1|tập tin|$1 tập tin}} cùng nội dung có tên khác.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Một|Các}} tập tin khác cùng nội dung đã tồn tại trên website, nhưng {{PLURAL:$1|nó|chúng}} đã bị xóa.",
-       "api-error-empty-file": "Bạn đã gửi tập tin rỗng.",
        "api-error-emptypage": "Không cho phép tạo mới các trang rỗng.",
-       "api-error-fetchfileerror": "Lỗi nội bộ: Việc tải tập tin bị thất bại.",
-       "api-error-fileexists-forbidden": "Một tập tin với tên “$1” đã tồn tại; không thể ghi đè nó.",
-       "api-error-fileexists-shared-forbidden": "Một tập tin với tên “$1” đã tồn tại ở kho tập tin dùng chung; không thể ghi đè nó.",
-       "api-error-file-too-large": "Bạn đã gửi tập tin lớn quá hạn.",
-       "api-error-filename-tooshort": "Tên tập tin ngắn quá.",
-       "api-error-filetype-banned": "Kiểu tập tin này đã bị cấm.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Định dạng|Các định dạng}} $1 không được chấp nhận. Chỉ chấp nhận {{PLURAL:$3|loại tập tin|các loại tập tin}} sau: $2.",
-       "api-error-filetype-missing": "Tên tập tin bị thiếu phần mở rộng.",
-       "api-error-hookaborted": "Sửa đổi của bạn bị hook phần mở rộng hủy bỏ.",
-       "api-error-http": "Lỗi nội bộ: Không thể kết nối với dịch vụ.",
-       "api-error-illegal-filename": "Không được đặt tên tập tin này.",
-       "api-error-internal-error": "Lỗi nội bộ: Việc xử lý tập tin tải lên của bạn trên wiki bị thất bại.",
-       "api-error-invalid-file-key": "Lỗi nội bộ: Không tìm thấy tập tin trong kho tạm.",
-       "api-error-missingparam": "Lỗi nội bộ: Yêu cầu thiếu tham số.",
-       "api-error-missingresult": "Lỗi nội bộ: Không rõ việc sao chép có thành công.",
-       "api-error-mustbeloggedin": "Bạn phải đăng nhập để tải lên tập tin.",
-       "api-error-mustbeposted": "Phần mềm này có lỗi: nó không sử dụng phương pháp HTTP chính xác.",
-       "api-error-noimageinfo": "Đã tải lên tập tin thành công, nhưng máy chủ không cung cấp thông tin về tập tin.",
-       "api-error-nomodule": "Lỗi nội bộ: Mô đun tải lên không được định rõ.",
-       "api-error-ok-but-empty": "Lỗi nội bộ: Máy chủ không phản hồi.",
-       "api-error-overwrite": "Không được ghi đè một tập tin đã tồn tại.",
-       "api-error-ratelimited": "Bạn cố tải lên nhiều tập tin trong một thời gian ngắn vượt quá hạn chế của wiki này.",
-       "api-error-stashfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.",
        "api-error-publishfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc xuất bản tập tin tạm.",
-       "api-error-stasherror": "Đã xuất hiện lỗi khi tải tập tin lên hàng đợi.",
-       "api-error-stashedfilenotfound": "Không tìm thấy tập tin khi thử tải nó lên từ hàng đợi.",
-       "api-error-stashpathinvalid": "Đường dẫn mong đợi đến tập tin đợi tải lên là không hợp lệ.",
-       "api-error-stashfilestorage": "Đã xuất hiện lỗi khi tải tập tin lên từ hàng đợi.",
-       "api-error-stashzerolength": "Máy chủ không thể lưu tập tin vào hàng đợi vì nó không có nội dung.",
-       "api-error-stashnotloggedin": "Bạn phải đăng nhập để lưu tập tin vào hàng đợi tải lên.",
-       "api-error-stashwrongowner": "Không thể truy cập một tập tin không phải của bạn trong hàng đợi tải lên.",
-       "api-error-stashnosuchfilekey": "Bạn không thể truy cập chìa khóa tập tin đợi tải lên vì chìa khóa này không tồn tại.",
-       "api-error-timeout": "Máy chủ không đáp ứng trong thời gian dự kiến.",
-       "api-error-unclassified": "Gặp lỗi không ngờ",
-       "api-error-unknown-code": "Lỗi không rõ: “$1”",
-       "api-error-unknown-error": "Lỗi nội bộ: Việc tải lên tập tin của bạn bị thất bại vì lý do không rõ.",
-       "api-error-unknown-warning": "Cảnh báo không rõ: $1",
+       "api-error-stashfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.",
+       "api-error-unknown-warning": "Cảnh báo không rõ: “$1”.",
        "api-error-unknownerror": "Lỗi không rõ: “$1”.",
-       "api-error-uploaddisabled": "Chức năng tải lên đã bị tắt trên wiki này.",
-       "api-error-verification-error": "Tập tin này có thể bị hỏng hoặc có phần mở rộng sai.",
-       "api-error-was-deleted": "Một tập tin cùng tên này đã được tải lên và bị xóa về sau.",
        "duration-seconds": "$1 giây",
        "duration-minutes": "$1 phút",
        "duration-hours": "$1 giờ",
        "pagelang-language": "Ngôn ngữ",
        "pagelang-use-default": "Sử dụng ngôn ngữ mặc định",
        "pagelang-select-lang": "Chọn ngôn ngữ",
+       "pagelang-reason": "Lý do",
        "pagelang-submit": "Áp dụng",
+       "pagelang-nonexistent-page": "Trang $1 không tồn tại.",
+       "pagelang-unchanged-language": "Trang $1 đã có ngôn ngữ là $2.",
+       "pagelang-unchanged-language-default": "Trang $1 đã có ngôn ngữ là ngôn ngữ nội dung mặc định của wiki.",
+       "pagelang-db-failed": "Cơ sở dữ liệu không thể thay đổi ngôn ngữ của trang.",
        "right-pagelang": "Thay đổi ngôn ngữ của trang",
        "action-pagelang": "thay đổi ngôn ngữ của trang",
        "log-name-pagelang": "Nhật trình thay đổi ngôn ngữ",
        "mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
        "mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Thêm thể loại…",
+       "mw-widgets-usersmultiselect-placeholder": "Thêm nữa…",
        "sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.",
        "sessionprovider-generic": "phiên $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie",
        "usercssispublic": "Xin lưu ý: Các trang con CSS không nên chứa dữ liệu bí mật, vì những người dùng khác có thể xem các trang này.",
        "restrictionsfield-badip": "Địa chỉ hoặc dải IP không hợp lệ: $1.",
        "restrictionsfield-label": "Các dải IP được cho phép:",
-       "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng<br><code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "Mỗi dòng một địa chỉ IP hoặc dải CIDR. Để kích hoạt tất cả mọi địa chỉ IP, sử dụng:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "phiên bản $1",
+       "pageid": "số trang $1"
 }
index 9ca5fde..172f08b 100644 (file)
        "whatlinkshere-filters": "Mga panara",
        "whatlinkshere-submit": "Kadto-a",
        "block": "Pugngi an gumaramit",
-       "blockip": "Pugngi an{{GENDER:$1|gumaramit}}",
+       "blockip": "Pugngi an {{GENDER:$1|gumaramit}}",
        "blockip-legend": "Pugngi an gumaramit",
        "ipaddressorusername": "IP address o agnay-hit-gumaramit:",
        "ipbexpiry": "Matitima an dulot:",
index 51150e4..8093c68 100644 (file)
@@ -16,7 +16,8 @@
                        "Silovan",
                        "David1010",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Otogi"
                ]
        },
        "tog-underline": "რცხუეფიშ ათოღაზუა:",
        "viewyourtext": "თქვა შეილებუნა ქოძირათ '''თქვანი რედაქტირაფეფიშ''' დაჭყაფური ტექსტი თე ხასჷლას დო გეჭოფათ თიშ ანგი.",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "<strong>ყურადღება:</strong> თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც.",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის |გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
        "passwordreset-emaildisabled": "ამ ვიკიში ელ.ფოსტის ფუნქციები გამორთულია.",
        "passwordreset-username": "მახვარებუშ ჯოხო:",
        "passwordreset-domain": "დომენი:",
-       "passwordreset-capture": "გამოსული ელ-ფოსტის ხილვა?",
-       "passwordreset-capture-help": "თუ მონიშნავთ ამ უჯრას, მაშინ თქვენ შეგეძლებათ მომხმარებლისათვის გაგზავნილი ელ.ფოსტის ნახვა (დროებითი პაროლით).",
        "passwordreset-email": "ელ. ფოსტის მისამართი:",
        "passwordreset-emailtitle": "ანგარიშის მონაცემები {{SITENAME}}-თვის",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "saveprefs": "შენახვა",
        "restoreprefs": "ყველა საწყისი პარამეტრის აღდგენა (ყველა სექციაში)",
        "prefs-editing": "რედაქტირება",
-       "rows": "რიგები:",
-       "columns": "სვეტები",
        "searchresultshead": "გორუა",
        "stub-threshold": "გაფორმების გასაუმჯობესებლად <a href=\"#\" class=\"stub\"> მოცემულია ესკიზების ბმულები</a> (ბაიტებში):",
        "stub-threshold-disabled": "გათიშულია",
        "userrights-reason": "სამანჯელი:",
        "userrights-no-interwiki": "თქვენ არ გაქვთ მომხმარებლის უფლებების რედაქტირების უფლება სხვა ვიკი-ებში.",
        "userrights-nodatabase": "მონაცემთა ბაზა $1 არ არსებობს, ან არ არის ლოკალური.",
-       "userrights-nologin": "თქვენ უნდა [[Special:UserLogin|წარადგინოთ თავი სისტემისადმი]] ადმინისისტრატორის ანგარიშით იმისთვის, რომ გასცეთ მომხმარებელთა უფლებები.",
-       "userrights-notallowed": "თქვენ არ გაქვთ მომხმარებელთა უფლებების შეცვლის უფლება.",
        "userrights-changeable-col": "ჯგუფები, რომლებიც შეგიძლიათ შეცვალოთ",
        "userrights-unchangeable-col": "ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ",
        "userrights-conflict": "მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ ხელმეორედ შეინახოთ თქვენი ცვლილებები.",
-       "userrights-removed-self": "თქვენ წარმატებით წაშალეთ საკუთარი უფლება. შესაბამისად, თქვენ აღარ გექნებათ ამ გვერდთან წვდომის საშუალება",
        "group": "ჯგუფი:",
        "group-user": "მახვარებუეფი",
        "group-autoconfirmed": "ავტომატურად დადასტურებული მომხმარებლები",
        "right-siteadmin": "მონაცემთა ბაზის დაბლოკვა და განბლოკვა",
        "right-override-export-depth": "გვერდების ექსპორტირება, დაკავშირებული გვერდების ჩათვლით 5-მდე სიიღრმით",
        "right-sendemail": "გაგუგზავნე ელექტრონული ფოსტა სხვა მომხმარებლებს",
-       "right-passwordreset": "ელ.ფოსტის ნახვა პაროლის შეცვლით",
        "right-managechangetags": "[[Special:Tags|tags]] შექმნა და წაშლა მონაცემთა ბაზიდან",
        "right-applychangetags": "[[Special:Tags|tags]] მიღება თქვენ ცვლილებებთან ერთად",
        "right-changetags": "თვითნებური [[Special:Tags|tags]] დამატება ან წაშლა ცალკეულ ცვლილებებსა და ჟურნალის ჩანაწერებში",
        "uploaddisabledtext": "ფაილების ატვირთვა შეუძლებელია.",
        "php-uploaddisabledtext": "ფაილების ატვირთვა შეჩერებულია PHP-ით. გთხოვთ შეამოწმოთ file_uploads-ის მნიშვნელობა.",
        "uploadscripted": "ფაილი შეიცავს HTML-კოდს, ან სკრიპტს, რომელიც ბროუზერმა შეიძლება არასწორედ გაანალიზოს.",
-       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"$1\".",
+       "uploadscriptednamespace": "ეს SVG ფაილი შეიცავს სახელთა არაკორექტულ სივრცეს \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "XML ჩატვირთულ ფაილში არ შეიძლება იყოს ანალიზირებული.",
        "uploadvirus": "ფაილი ვირუსს შეიცავს! \nდეტალები: $1",
        "uploadjava": "ეს არის ZIP-ფაილი, რომელიც Java .class ფაილს შეიცავს.\nჯავა-ფაილების ატვირთვა დაუშვებელია, ვინაიდან მათ შესაძლოა შეზღუდონ უსაფრთხოება.",
index 91a3ad8..b4fd680 100644 (file)
        "searcharticle": "גיין",
        "history": "בלאט היסטאריע",
        "history_short": "היסטאָריע",
+       "history_small": "היסטאריע",
        "updatedmarker": "דערהיינטיגט זינט מיין לעצטע וויזיט",
        "printableversion": "דרוק ווערסיע",
        "permalink": "שטענדיגער לינק",
        "createacct-email-ph": "קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס",
        "createacct-another-email-ph": "אַרײַנגעבן בליצפּאָסט אַדרעס",
        "createaccountmail": "ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס",
+       "createaccountmail-help": "קען ווערן באניצט צו שאפֿן קאנטע פֿאר א צווייטן אן צו דערגיין דאס פאסווארט.",
        "createacct-realname": "עכטער נאמען (אפציאנאל)",
        "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "selfredirect": "<strong>ווארענונג:</strong> איר טוט ווײַטערפירן דעם בלאט צו זיך אליין.\nאיר העט אפשר ספעציפיצירט א פאלשן ווײַטערפירונג־ציל  אדער איר רעדאקטירט דעם פאלשן בלאט.\nטאמער קליקט איר נאכאמאל \"{{int:savearticle}}\", וועט מען טאקע שאפן די ווײַטערפירונג.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
        "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
-       "summary-preview": "ס×\9a\94×\9b×\9c ×¤×\90ר×\90×\95×\99ס×\93×\99×\92×¢ ×\95×\95×\99×\99×\96×\95× ×\92:",
-       "subject-preview": "טעמע פאראויסדיגע ווייזונג:",
+       "summary-preview": "פ×\90ר×\90×\95×\99סק×\95ק ×¤Ö¿×\95×\9f ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92־רע×\96×\95×\9e×¢:",
+       "subject-preview": " פאראויסקוק פֿון טעמע:",
        "previewerrortext": "א פעלער האט פאסירט ביים פרובירן פארויסקוקן אײַערע ענדערונגען.",
        "blockedtitle": "באַניצער איז בלאקירט",
        "blockedtext": "'''אייער באניצער נאמען אדער IP אדרעס איז געווארן בלאקירט.'''\n\nדעם בלאק האט $1 געמאכט פון וועגן ''$2''.\n\n* בלאקירן הייבט אן: $8\n* בלאקירן גייט אויס: $6\n* בלאק מכוון צו: $7\n\nאיר קענט זיך ווענדן צו $1 אדער צו אנדערע [[{{MediaWiki:Grouppage-sysop}}|אדמיניסטראטארן]] אדורכצורעדן דעם בלאק.\n\nגיט אכט אז איר קענט נישט ניצן די \"שיקט דעם באניצער א ע-פאסט\" אייגנקייט אויב האט איר נישט איינגעשטעלט אין אייערע [[Special:Preferences|קונטע פרעפערענצן]] א גילטיקן בליצפאסט אדרעסדאס אדער איר זענט בלאקירט פון שיקן בליצפאסט.\n\nאייער IP אדרעס איז $3, און דער בלאק האט נומער #$5. ביטע שיקט איינעם פון די צוויי (אדער זיי ביידע) ווען איר ווענדט זיך צו די אדמיניסטראטורן.",
        "content-model-css": "CSS",
        "content-json-empty-object": "ליידיגער אביעקט",
        "content-json-empty-array": "ליידיגער אריי",
+       "deprecated-self-close-category": "בלעטער וואס ניצן אומגילטיגע אליין־פֿאַרמאַכטע HTML טאַגן",
        "duplicate-args-warning": "<strong>ווארענונג:</strong> [[:$1]] רופט [[:$2]] מיט מער ווי איין ווערט פארן פאראמעטער \"$3\". נאר דעם לעצטן ווערט וועט מען ניצן.",
        "duplicate-args-category": "בלעטער וואס ניצן געטאפלטע ארגומענטן אין א מוסטער־רוף",
        "duplicate-args-category-desc": "דער בלאט אנטהאלט מוסטער־אויפרופן וואס ניצן דופליקאטן פון ארגומענטן, ווי למשל <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "search-interwiki-caption": "שוועסטער פראיעקטן",
        "search-interwiki-default": "רעזולטאטן פון $1:",
        "search-interwiki-more": "(נאך)",
+       "search-interwiki-more-results": "נאך רעזולטאטן",
        "search-relatedarticle": "פארבינדן",
        "searchrelated": "פארבינדן",
        "searchall": "אלץ",
        "saveprefs": "אויפֿהיטן",
        "restoreprefs": "צוריקשטעלן אלע גרונטלעכע שטעלונגען (אין אלע אפטיילן)",
        "prefs-editing": "באַאַרבעטן",
-       "rows": "שורות:",
-       "columns": "עמודים:",
        "searchresultshead": "זוכן",
        "stub-threshold": "שוועל פֿאַר שטומף לינק פֿאָרמאַטירונג ($1):",
        "stub-threshold-sample-link": "ביישפיל",
        "youremail": "ע-פאסט:",
        "username": "{{GENDER:$1|באַניצער־נאָמען}}:",
        "prefs-memberingroups": "{{GENDER:$2|מיטגליד}} אין {{PLURAL:$1|גרופע|גרופעס}}:",
+       "group-membership-link-with-expiry": "$1 (ביז $2)",
        "prefs-registration": "אײַנשרײַבן צײַט:",
        "yourrealname": "עכטער נאָמען:",
        "yourlanguage": "שפּראַך:",
        "userrights-user-editname": "לייגט אריין א באַניצער-נאמען:",
        "editusergroup": "לאדן באַניצער גרופּעס",
        "editinguser": "ענדערן באַניצער רעכטן פון  {{GENDER:$1|באַניצער|באַניצערין}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "רעדאַקטירן באַניצער גרופעס",
-       "userrights-viewusergroup": "באַקוקן באַניצער גרופעס",
+       "userrights-editusergroup": "רעדאַקטירן {{GENDER:$1|באַניצער|באַניצערין}} גרופעס",
+       "userrights-viewusergroup": "באַקוקן {{GENDER:$1|באַניצער|באַניצערין}} גרופעס",
        "saveusergroups": "אויפֿהיטן {{GENDER:$1|באַניצער}} גרופעס",
        "userrights-groupsmember": "מיטגליד פון:",
        "userrights-groupsmember-auto": "אויטאמטישער מיטגליד פֿון:",
-       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען דער באַניצער געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.",
+       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען {{GENDER:$1|דער באַניצער|די באַניצערין}} געהערט:\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-existing": "עקזיסטירנדע אויסלאז צײַט: $3, $2",
+       "userrights-expiry-othertime": "אַנדער צײט:",
+       "userrights-expiry-options": "1 טאג:1 day,1 וואך:1 week,1 Monat:1 month,3 מאנאט:3 months,6 מאנאטן:6 months,1 יאר:1 year",
        "userrights-conflict": "קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.",
        "group": "גרופע:",
        "group-user": "באניצערס",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "ווייזן",
+       "rcfilters-invalid-filter": "אומגילטיגער פֿילטער",
+       "rcfilters-filterlist-title": "פֿילטערס",
+       "rcfilters-filterlist-noresults": "קיין פֿילטערס נישט געטראפֿן",
+       "rcfilters-filter-bots-label": "באט",
        "rcnotefrom": "פֿאלגנד {{PLURAL:$5|איז די ענדערונג| זענען די ענדערונגען}} זײַט <strong>$3, $4</strong> (ביז <strong>$1</strong>).",
        "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "rcshowhideminor": "$1 מינערדיגע ענדערונגען",
        "uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט.",
        "php-uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.\nזייט אזוי גוט בודק זיין די file_uploads שטעלונג.",
        "uploadscripted": "די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער",
-       "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"$1\"",
+       "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"<nowiki>$1</nowiki>\"",
        "uploadinvalidxml": "דאס XML אין דער ארויפגעלאדענער טעקע קען מען נישט פארזירן.",
        "uploadvirus": "די טעקע האָט אַ ווירוס! פרטים: <div dir=\"rtl\">$1</div>",
        "upload-source": "מקור טעקע",
        "pageswithprop-text": "דער בלאט האלט א רשימה פון בלעטער וואס ניצן א געוויסע בלאט אייגנשאפט.",
        "pageswithprop-prop": "אייגנשאפט נאמען:",
        "pageswithprop-submit": "גייט",
-       "pageswithprop-prophidden-long": "לא גער טעקסט אייגנשאפט־ווערט באהאלטן ($1)",
+       "pageswithprop-prophidden-long": "לאנגער טעקסט אייגנשאפט־ווערט באהאלטן ($1)",
        "pageswithprop-prophidden-binary": "בינארישער אייגנשאפט־ווערט באהאלטן ($1)",
        "doubleredirects": "געטאפלטע ווײַטערפֿירונגען",
        "doubleredirectstext": "דער בלאט רעכנט אויס בלעטער וואס פירן ווייטער צו אנדערע ווייטערפירן בלעטער.\nיעדע שורה אנטהאלט א לינק צום ערשטן און צווייטן ווייטערפירונג, ווי אויך די ציל פון דער צווייטער ווייטערפירונג, וואס רוב מאל געפינט זיך די ריכטיגע ציל וואו די ערשטע ווייטערפירונג זאל ווייזן.\n<del>אויסגעשטראכענע</del> טעמעס זענען שוין געלייזט.",
        "emailccsubject": "קאפיע פון אײַער מעלדונג צו $1: $2",
        "emailsent": "ע-פאסט געשיקט",
        "emailsenttext": "אײַער אי-בריוו איז געשיקט געווארן.",
-       "emailuserfooter": "דער בליצבריוו איז {{GENDER:$1|געשיקט געווארן}} דורך $1 צו {{GENDER:$2|$2}} מיט דער \"{{int:emailuser}}\" פֿונקציע בײ {{SITENAME}}. {{GENDER:$2|אייער}} ע־פאסט וועט מען שיקן גראד be sent directly to the {{GENDER:$1|צום אריגינעלן אפשיקער|צו דער אריגינעלער אפשיקערין}}, וואס וועט אויפדעקן {{GENDER:$2|אייער}} ע־פאסט אדרעס צו {{GENDER:$1|אים|איר}}.",
+       "emailuserfooter": "דער בליצבריוו איז {{GENDER:$1|געשיקט געווארן}} דורך $1 צו {{GENDER:$2|$2}} מיט דער \"{{int:emailuser}}\" פֿונקציע בײ {{SITENAME}}. אַז {{GENDER:$2|איר}} װעט ענטפֿערן דעם ע־פאסט, וועט מען שיקן {{GENDER:$1|אייער}} ע־פאסט גראד {{GENDER:$1|צום אריגינעלן אפשיקער|צו דער אריגינעלער אפשיקערין}}, וואס וועט אויפדעקן {{GENDER:$2|אייער}} ע־פאסט אדרעס צו {{GENDER:$1|אים|איר}}.",
        "usermessage-summary": "איבערלאזן סיסטעם אָנזאָג",
        "usermessage-editor": "סיסטעם שליח",
        "usermessage-template": "MediaWiki:באניצער־מעלדונג",
        "feedback-thanks": "ייש\"כ! אײַער פֿידבעק איז געווארן ארויפגעלעגט צום בלאט \"[$2 $1]\".",
        "searchsuggest-search": "זוכן {{SITENAME}}",
        "searchsuggest-containing": "כולל…",
-       "api-error-badaccess-groups": "איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.",
        "api-error-badtoken": "אינערלעכער גרײַז: סימן טויג נישט.",
-       "api-error-copyuploaddisabled": "אַרויפֿלאָדן דורך URL איז אומאַקטיווירט אויף דעם סערווירער.",
-       "api-error-duplicate": "שוין דאָ אין דער וויקי {{PLURAL:$1|אַן אַנדער טעקע|אַנדערע טעקעס}} מיטן זעלבן תוכן.",
-       "api-error-duplicate-archive": "ס'איז שוין געווען {{PLURAL:$1| אַן אַנדער טעקע | [$1 עטלעכע אַנדערע טעקעס]}} אויף דעם פּלאַץ מיטן זעלביקן תוכן, אָבער {{PLURAL:$1| עס איז|זיי זענען}} געווארן אויסגעמעקט.",
-       "api-error-empty-file": "די טעקע וואָס איר האט אײַנגעגעבן איז ליידיג.",
        "api-error-emptypage": "שאפן נייע ליידיקע בלעטער איז נישט ערלויבט.",
-       "api-error-fetchfileerror": "אינערלעכער גרײַז: עפעס איז קאַליע געווארן בײַם ברענגען די טעקע.",
-       "api-error-fileexists-forbidden": "שוין פאראן א טעקע מיטן נאמען \"$1\" , און מען קען זי נישט אריבערשרייבן.",
-       "api-error-fileexists-shared-forbidden": "שוין פאראן א טעקע מיטן נאמען \"$1\" אין דער געמיינזאמער טעקע רעפאזיטאריע, און מען קען זי נישט אריבערשרייבן.",
-       "api-error-file-too-large": "די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.",
-       "api-error-filename-tooshort": "דער טעקע־נאָמען איז צו קורץ.",
-       "api-error-filetype-banned": "דער טיפ טעקע איז געאַסרט.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|איז נישט קיין דערלויבטער טעקע־טיפ |זענען נישט קיין דערלויבטע טעקע־טיפן}}. {{PLURAL:$3|דערלויבטער טעקע־טיפ איז|דערלויבטע טעקע־טיפן זענען}} $2.",
-       "api-error-filetype-missing": "די טעקע פֿעלט אַן ענדונג.",
-       "api-error-hookaborted": "די מאדיפיצירונג איר האט פרובירט קען נישט ווערן דורכגעפירט צוליב א פארברייטערונג.",
-       "api-error-http": "אינערלעכער גרײַז: נישט געקענט פֿאַרבינדן צום סערווירער.",
-       "api-error-illegal-filename": "דער טעקע־נאָמען איז נישט ערלויבט.",
-       "api-error-internal-error": "אינערלעכער גרײַז: עפעס איז קאַליע געווארן בײַם פראצעסירן אײַער אַרופֿלאָד אויף דער וויקי.",
-       "api-error-invalid-file-key": "אינערלעכער גרײַז: נישט געטראפֿן טעקע אין צײַטווײַליקן שפייכלער",
-       "api-error-missingparam": "אינערלעכער גרײַז: פֿעלן פאראמעטערס אין פֿאַרלאַנג",
-       "api-error-missingresult": "אינערלעכער גרײַז: נישט געקענט פֿעסטשטעלן צי קאפירן איז געווען דערפֿאלגרייך.",
-       "api-error-mustbeloggedin": "איר דארפֿט זײַן אַרײַנלאגירט אַרויפֿצולאָדן טעקעס.",
-       "api-error-mustbeposted": "אינערלעכער גרײַז: פֿאַרלאַנג פֿאדערט HTTP POST.",
-       "api-error-noimageinfo": "דער אַרויפֿלאָד איז געווען דערפֿאלגרײַך, אָבער דער סערווירער האט נישט געגעבן אונדז קיין אינפֿאָרמאַציע וועגן דער טעקע.",
-       "api-error-nomodule": "אינערלעכער גרײַז: קיין ארויפֿלאָדן מאָדול נישט געשטעלט.",
-       "api-error-ok-but-empty": "אינערלעכער גרײַז: קיין ענטפֿער פֿון סערווירער.",
-       "api-error-overwrite": "מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.",
-       "api-error-stashfailed": "אינערלעכער גרײַז: סערווירער האט נישט געקענט אײַנשפייכלערן צייַטווייַליקע טעקע.",
        "api-error-publishfailed": "אינערלעכער גרײַז: סערווירער האט נישט געזדאנזשעט פארעפנטלעכן צייַטווייַליקע טעקע.",
-       "api-error-timeout": "דער סערווירער האט ניט געענטפֿערט אינערהאַלב דער דערוואַרטעטער צייַט.",
-       "api-error-unclassified": "אַן אומבאַקאַנט טעות איז פֿארגעקומען.",
-       "api-error-unknown-code": "אומבאַקאַנט טעות: \" $1 \"",
-       "api-error-unknown-error": "אינערלעכער גרײַז: עפעס איז קאַליע געווארן בײַם אַרויפֿלאָדן אײַער טעקע.",
-       "api-error-unknown-warning": "אומבאַקאַנטע ווארענונג: $1",
+       "api-error-stashfailed": "אינערלעכער גרײַז: סערווירער האט נישט געקענט אײַנשפייכלערן צייַטווייַליקע טעקע.",
+       "api-error-unknown-warning": "אומבאַקאַנטע ווארענונג: \"$1\".",
        "api-error-unknownerror": "אומבאַקאַנט טעות: \" $1 \"",
-       "api-error-uploaddisabled": "ארויפֿלאָדן איז אומאַקטיווירט אויף דער וויקי",
-       "api-error-verification-error": "די טעקע איז מעגלעך פֿארדארבן, אדער האט א פֿאַלשע ענדונג.",
        "duration-seconds": "$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}",
        "duration-minutes": "$1 {{PLURAL:$1|מינוט|מינוט}}",
        "duration-hours": "$1 {{PLURAL:$1|שעה|שעה'ן}}",
index 02e3341..19f211a 100644 (file)
@@ -30,7 +30,8 @@
                        "Jdforrester",
                        "Tungakl",
                        "Suzukaze-c",
-                       "Asdfugil"
+                       "Asdfugil",
+                       "Deryck Chan"
                ]
        },
        "tog-underline": "連結加底線:",
@@ -48,6 +49,7 @@
        "tog-watchdefault": "將我修改嘅頁同檔案加入監視清單",
        "tog-watchmoves": "將我移動嘅頁同檔案加入監視清單",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
+       "tog-watchuploads": "將我上載嘅檔案加入監視清單",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做小修改",
        "tog-previewontop": "喺修改欄上邊顯示預覽",
@@ -71,7 +73,7 @@
        "tog-ccmeonemails": "喺我寄電郵畀其他人嗰陣,寄返封副本畀我。",
        "tog-diffonly": "響差異下面唔顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏類",
-       "tog-norollbackdiff": "進行反轉之後略過差異",
+       "tog-norollbackdiff": "進行反轉之後唔睇差異",
        "tog-useeditwarning": "當我離開未保存好嘅修改嗰陣警告我",
        "tog-prefershttps": "簽到後繼續用加密連線",
        "underline-always": "全部",
        "searcharticle": "去",
        "history": "版史",
        "history_short": "歷史",
+       "history_small": "歷史",
        "updatedmarker": "我上次來之後嘅修改",
        "printableversion": "可打印版本",
        "permalink": "固定連結",
        "talk": "討論",
        "views": "去睇",
        "toolbox": "架撐",
+       "tool-link-emailuser": "電郵畀呢個{{GENDER:$1|用戶}}",
        "userpage": "去睇用戶頁",
        "projectpage": "去睇專題頁",
        "imagepage": "去睇檔案頁",
        "laggedslavemode": "警告:呢頁可能未包括最新嘅更新。",
        "readonly": "資料庫鎖咗",
        "enterlockreason": "輸入鎖資料庫嘅原因,同埋預計幾耐後會解鎖",
-       "readonlytext": "{{SITENAME}}資料庫而家鎖住咗,唔改得;可能因為維修緊。搞掂就會正常返。\n\n管理員嘅解釋: $1",
+       "readonlytext": "{{SITENAME}}è³\87æ\96\99庫è\80\8c家é\8e\96ä½\8få\92\97ï¼\8cå\94\94æ\94¹å¾\97ï¼\9bå\8f¯è\83½å\9b ç\82ºç¶­ä¿®ç·\8aã\80\82æ\90\9eæ\8e\82å°±æ\9c\83正常è¿\94ã\80\82\n\n系統管ç\90\86å\93¡å\98\85解é\87\8bï¼\9a $1",
        "missing-article": "資料庫搵唔到你要嘅版,「$1」 $2。\n\n通常係因為修訂歷史頁上面,由過時嘅連結去到刪除咗嘅版所引起嘅。\n\n如果唔係,你可能係搵到軟件裏面嘅臭蟲。\n請記低 URL 地址,向[[Special:ListUsers/sysop|管理員]]報告。",
        "missingarticle-rev": "(修訂#: $1)",
        "missingarticle-diff": "(差異: $1, $2)",
        "mypreferencesprotected": "你無權改呢版你嘅個人設定。",
        "ns-specialprotected": "特別頁係唔可以編輯嘅。",
        "titleprotected": "呢個標題已經俾[[User:$1|$1]]保護咗防止去開。原因係<em>$2</em>。",
-       "filereadonlyerror": "改唔到檔案 \"$1\",因為檔案庫 \"$2\" 而家係唯讀。\n\n負責鎖嘅管理員嘅解釋:\"$3\"。",
+       "filereadonlyerror": "æ\94¹å\94\94å\88°æª\94æ¡\88 \"$1\"ï¼\8cå\9b ç\82ºæª\94æ¡\88庫 \"$2\" è\80\8c家ä¿\82å\94¯è®\80ã\80\82\n\n負責é\8e\96å\98\85系統管ç\90\86å\93¡å\98\85解é\87\8bï¼\9a\"$3\"ã\80\82",
        "invalidtitle-knownnamespace": "名域 \"$2\" 同版名 \"$3\" 無效嘅標題",
        "invalidtitle-unknownnamespace": "未知名域號碼 \"$1\" 同版名 \"$2\" 無效嘅標題",
        "exception-nologin": "未簽到",
        "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
        "virus-unknownscanner": "未知嘅防病毒:",
        "logouttext": "<strong>你而家已經簽退咗。</strong>\n\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
+       "cannotlogoutnow-title": "而家簽走唔到",
+       "cannotlogoutnow-text": "用緊$1嗰陣唔可以簽走。",
        "welcomeuser": "歡迎,$1!",
        "welcomecreation-msg": "你個戶口已經起好。\n唔好唔記得去改改你嘅{{SITENAME}}[[Special:Preferences|喜好設定]]喎。",
        "yourname": "用戶名:",
        "cannotlogin-title": "簽到唔到",
        "cannotlogin-text": "冇可能簽到",
        "cannotloginnow-title": "而家簽到唔到",
+       "cannotloginnow-text": "用緊$1嗰陣唔可以簽到。",
+       "cannotcreateaccount-title": "開唔到新戶口",
+       "cannotcreateaccount-text": "呢個維基唔准直接開戶",
        "yourdomainname": "你嘅網域:",
        "password-change-forbidden": "你唔可以改呢個維基站嘅密碼。",
        "externaldberror": "驗證資料庫出錯,或者唔允許你更新你嘅外部帳戶。",
        "login": "登入",
+       "login-security": "確認你嘅身份",
        "nav-login-createaccount": "登入/開新戶口",
        "userlogin": "登入/開新戶口",
        "userloginnocreate": "登入",
        "userlogin-resetpassword-link": "唔記得密碼?",
        "userlogin-helplink2": "幫我簽到",
        "userlogin-loggedin": "您目前用{{GENDER:$1|$1}}身份簽到,\n請用下面表格用另一身份簽到。",
+       "userlogin-reauth": "請你簽到多次,確認你真係{{GENDER:$1|$1}}。",
        "userlogin-createanother": "開過個戶口",
        "createacct-emailrequired": "電郵地址",
        "createacct-emailoptional": "電郵地址(可以唔填)",
        "createacct-reason-ph": "開過個戶口嘅原因",
        "createacct-submit": "開戶口",
        "createacct-another-submit": "開戶口",
+       "createacct-continue-submit": "繼續開戶",
+       "createacct-another-continue-submit": "繼續開戶",
        "createacct-benefit-heading": "{{SITENAME}}係由你同其他人貢獻。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯|次編輯}}",
        "createacct-benefit-body2": "{{PLURAL:$1|版|版}}",
        "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
-       "badretype": "ä½ å\85¥å\98\85å¯\86碼å\94\94ä¸\80è\87´。",
+       "badretype": "ä½ å\85¥å\98\85å¯\86碼å\89\8då¾\8cä¸\8dä¸\80。",
        "usernameinprogress": "呢個名嘅戶口已經開緊。\n請等等。",
        "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
        "loginerror": "登入錯誤",
        "eauthentsent": "確認電郵已經傳送到指定嘅電郵地址。\n喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。",
        "throttled-mailpassword": "一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用,響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。",
        "mailerror": "傳送電郵錯誤: $1",
-       "acct_creation_throttle_hit": "利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口,係響呢段時間嘅上限。\n結果,利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。",
+       "acct_creation_throttle_hit": "利用你呢個IP地址嘅訪客響上$2已經開咗$1個戶口,係響呢段時間嘅上限。\n所以,利用呢個IP地址嘅訪客暫時唔可以再開新戶口。",
        "emailauthenticated": "你嘅電郵地址已經喺 $2 $3 確認。",
        "emailnotauthenticated": "你嘅電郵地址重未確認。\n任何傳送電郵嘅功能都唔會運作。",
        "noemailprefs": "響你嘅喜好設定度設置一個電郵地址令到呢啲功能開始運作。",
        "createacct-another-realname-tip": "真名可以唔填。\n如果你畀埋佢,有需要嘅時候會用佢來標示你嘅工夫。",
        "pt-login": "簽到",
        "pt-login-button": "簽到",
+       "pt-login-continue-button": "繼續簽到",
        "pt-createaccount": "開戶口",
        "pt-userlogout": "簽走",
        "php-mail-error-unknown": "響 PHP 嘅 mail() 參數度出現咗未知嘅錯誤",
        "newpassword": "新密碼:",
        "retypenew": "打多次新密碼:",
        "resetpass_submit": "設定密碼同登入",
-       "changepassword-success": "ä½ å\98\85å¯\86碼已ç¶\93æ\88\90å\8a\9få\99\89æ\94¹å\92\97ï¼\81",
+       "changepassword-success": "你嘅密碼已經改咗!",
        "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
+       "botpasswords": "機械人密碼",
+       "botpasswords-disabled": "唔俾用機械人密碼。",
        "botpasswords-label-create": "創造",
        "botpasswords-label-update": "上載",
        "botpasswords-label-cancel": "取消",
        "minoredit": "呢個係小修改",
        "watchthis": "睇實呢一頁",
        "savearticle": "儲存呢頁",
+       "savechanges": "記好",
        "publishpage": "發佈呢頁",
        "publishchanges": "發佈修改",
        "preview": "預覽",
        "editusergroup": "編輯用戶組",
        "editinguser": "改緊<strong>[[User:$1|$1]]</strong>嘅用戶權限 $2",
        "userrights-editusergroup": "編輯用戶組",
-       "saveusergroups": "儲存用戶組",
+       "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": "現時到期嘅時間: $2 $3",
+       "userrights-expiry-othertime": "其它時間:",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "group": "組:",
        "group-user": "用戶",
        "rightslogtext": "呢個係用戶權力嘅修改日誌。",
        "action-read": "讀呢版",
        "action-edit": "編輯呢版",
-       "action-createpage": "開版",
+       "action-createpage": "建立呢頁",
        "action-createtalk": "開討論版",
        "action-createaccount": "開呢個用戶戶口",
        "action-history": "睇呢頁嘅歷史",
        "action-suppressionlog": "睇呢個私有日誌",
        "action-block": "封鎖呢位用戶嘅編輯",
        "action-protect": "改呢版嘅保護等級",
+       "action-rollback": "速還原某版最後修改人之修改",
        "action-import": "由其它wiki度倒入版",
        "action-importupload": "由檔案上載度倒入版",
        "action-patrol": "標示其它嘅編輯做已巡查嘅",
        "action-userrights": "編輯全部嘅權限",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
-       "action-sendemail": "電郵",
+       "action-sendemail": "電郵",
        "action-editmywatchlist": "改監視清單",
        "action-viewmywatchlist": "睇監視清單",
        "action-viewmyprivateinfo": "睇你嘅私人資料",
        "recentchanges-legend-heading": "<strong>標記:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
        "recentchanges-submit": "顯示",
+       "rcfilters-filter-editsbyself-description": "你改嘅嘢。",
+       "rcfilters-filter-editsbyother-label": "其他人改嘅嘢",
+       "rcfilters-filter-editsbyother-description": "其他人(唔係你)改嘅嘢",
+       "rcfilters-filtergroup-userExpLevel": "經驗級別(只限簽咗到嘅用戶)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "新手",
+       "rcfilters-filter-userExpLevel-newcomer-description": "少過4日、10次編輯",
+       "rcfilters-filter-userExpLevel-learner-label": "學徒",
+       "rcfilters-filter-userExpLevel-learner-description": "編輯數同經驗多過「新手」但少過「老手」。",
+       "rcfilters-filter-userExpLevel-experienced-label": "老手",
+       "rcfilters-filter-userExpLevel-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-significance": "顯著度",
+       "rcfilters-filter-minor-label": "細編輯",
+       "rcfilters-filter-minor-description": "作者話程度細嘅修改。",
+       "rcfilters-filter-major-label": "唔細嘅編輯",
+       "rcfilters-filter-major-description": "作者冇話程度細嘅修改。",
+       "rcfilters-filtergroup-changetype": "修改類別",
        "rcnotefrom": "下面嘅{{PLURAL:$5|改動}}由 <strong>$3 $4</strong> 開始(顯示到'''$1''')。",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "uploaddisabledtext": "檔案上載已經停用。",
        "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
        "uploadscripted": "呢個檔案包含可能會誤被瀏覽器解釋執行嘅 HTML 或 script 代碼。",
-       "uploadscriptednamespace": "呢個SVG文件可能有“$1”嘅非法字詞響度",
+       "uploadscriptednamespace": "呢個SVG文件可能有“<nowiki>$1</nowiki>”嘅非法字詞響度",
        "uploadinvalidxml": "分析唔到已經上傳咗嘅XML文件",
        "uploadvirus": "呢個檔案有病毒!\n詳情:$1",
        "uploadjava": "呢個係個ZIP檔案包括Java .class檔案。\n因為保安問題,上傳Java檔案係禁止左嘅。",
        "allpagesbadtitle": "提供嘅頁面名無效,又或者有一個跨語言或跨wiki嘅字頭。佢可能包括一個或多個字係唔可以用響標題度嘅。",
        "allpages-bad-ns": "{{SITENAME}}係無一個空間名叫做\"$1\"。",
        "allpages-hide-redirects": "收埋跳轉",
+       "cachedspecial-viewing-cached-ttl": "以下資料,來自暫存,上次更新係$1之前嘅事。",
        "cachedspecial-refresh-now": "睇最新。",
        "categories": "類",
        "categoriespagetext": "下面嘅{{PLURAL:$1|類}}有版或媒體。\n[[Special:UnusedCategories|未用類]]唔會響呢度列示。\n請同時參閱[[Special:WantedCategories|需要嘅分類]]。",
        "delete-legend": "刪除",
        "historywarning": "<strong>警告:</strong>你要刪除嘅頁面有大約$1次嘅修訂:",
        "confirmdeletetext": "你準備刪除一個頁面或者圖像,包括佢嘅所有歷史版本。\n請確認你打算噉做,而且你知道後果係點,加上確認你噉做冇違反到[[{{MediaWiki:Policy-url}}]]。",
-       "actioncomplete": "æ\93\8dä½\9cå®\8cæ\88\90",
-       "actionfailed": "æ\93\8dä½\9c失æ\95\97",
+       "actioncomplete": "æ\90\9eæ\8e\82",
+       "actionfailed": "æ\90\9eå\94\94æ\8e\82",
        "deletedtext": "\"$1\"已經刪除。最近嘅刪除記錄請睇$2。",
        "dellogpage": "刪除日誌",
        "dellogpagetext": "以下係最近嘅刪除清單。",
        "feedback-thanks-title": "多謝!",
        "searchsuggest-search": "搵{{SITENAME}}",
        "searchsuggest-containing": "名單傳送緊...",
-       "api-error-unclassified": "發生未知嘅錯誤。",
-       "api-error-unknown-code": "未知嘅出錯:$1。",
        "api-error-unknown-warning": "未知嘅警告:$1。",
        "api-error-unknownerror": "未知嘅出錯:$1。",
-       "api-error-uploaddisabled": "呢個維基唔畀上載檔案。",
-       "api-error-verification-error": "檔案壞咗或者用錯副檔名。",
        "duration-seconds": "$1 {{PLURAL:$1|秒}}",
        "duration-minutes": "$1 {{PLURAL:$1|分鐘}}",
        "duration-hours": "$1{{PLURAL:$1|個鐘}}",
index 03a882e..1e61710 100644 (file)
@@ -93,7 +93,8 @@
                        "Arthur2e5",
                        "Myy730",
                        "SolidBlock",
-                       "D41D8CD98F"
+                       "D41D8CD98F",
+                       "Wmr"
                ]
        },
        "tog-underline": "链接下划线:",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|分类}}",
-       "category_header": "å\88\86ç±»â\80\9c$1â\80\9d中的页面",
+       "category_header": "å\88\86ç±»â\80\9c$1â\80\9dä¸\8b的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
        "category-empty": "<em>本分类目前不含有任何页面或媒体文件。</em>",
        "resettokens": "重置密钥",
        "resettokens-text": "您可以在这里重置允许访问与您的账户有关的特定私人数据的密钥。\n\n如果您意外将它们分享给他人,或是您的账户已经被入侵,您应该重置它们。",
        "resettokens-no-tokens": "没有可以重置的密钥。",
-       "resettokens-tokens": "密钥:",
+       "resettokens-tokens": "令牌:",
        "resettokens-token-label": "$1(当前值:$2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|对你的监视列表中的页面的更改]]的网页feed(Atom/RSS)的密钥",
        "resettokens-done": "密钥已重置。",
        "selfredirect": "<strong>警告:</strong>您正在将此页面重定向至它自己。您可能指定了错误的重定向目标,或者您正在编辑错误的页面。如果您再次点击“{{int:savearticle}}”,重定向仍将被创建。",
        "missingcommenttext": "请在下面输入评论。",
        "missingcommentheader": "<strong>提示:</strong>您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
-       "summary-preview": "摘要预览:",
-       "subject-preview": "主题预览:",
+       "summary-preview": "编辑摘要的预览:",
+       "subject-preview": "主题预览:",
        "previewerrortext": "尝试预览您的更改时发生未知错误。",
        "blockedtitle": "用户被封禁",
        "blockedtext": "<strong>您的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联络$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当您在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。您当前的IP地址是$3,该封禁ID是#$5。请在您做出的任何查询中包含所有上述详情。",
        "search-interwiki-caption": "姊妹项目",
        "search-interwiki-default": "来自$1的结果:",
        "search-interwiki-more": "(更多)",
+       "search-interwiki-more-results": "更多结果",
        "search-relatedarticle": "相关",
        "searchrelated": "相关",
        "searchall": "所有",
        "prefs-advancedwatchlist": "高级选项",
        "prefs-displayrc": "显示",
        "prefs-displaywatchlist": "显示",
-       "prefs-tokenwatchlist": "密钥",
+       "prefs-tokenwatchlist": "令牌",
        "prefs-diffs": "差异对比",
        "prefs-help-prefershttps": "该设置将在下次登录时生效。",
        "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "editusergroup": "加载用户组",
        "editinguser": "更改{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
        "viewinguserrights": "查看{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
-       "userrights-editusergroup": "编辑用户组",
-       "userrights-viewusergroup": "查看用户组",
+       "userrights-editusergroup": "编辑{{GENDER:$1|用户}}组",
+       "userrights-viewusergroup": "查看{{GENDER:$1|用户}}组",
        "saveusergroups": "保存{{GENDER:$1|用户}}组",
        "userrights-groupsmember": "用户组:",
        "userrights-groupsmember-auto": "自动用户组:",
-       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\9b´æ\94¹è¯¥ç\94¨æ\88·ç\9a\84ç\94¨æ\88·ç»\84ï¼\9a\n* é\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·å±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\9cªé\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·ä¸\8då±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\98\9få\8f·ï¼\88*ï¼\89表示ä¸\80æ\97¦æ·»å\8a è¯¥ç\94¨æ\88·ç»\84å\90\8eä¸\8dè\83½å\88 é\99¤ï¼\8cå\8f\8dä¹\8b亦ç\84。",
+       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\9b´æ\94¹è¯¥ç\94¨æ\88·ç\9a\84ç\94¨æ\88·ç»\84ï¼\9a\n* é\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·å±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\9cªé\80\89中ç\9a\84é\80\89项æ¡\86表示该ç\94¨æ\88·ä¸\8då±\9eäº\8e该ç\94¨æ\88·ç»\84ã\80\82\n* æ\98\9få\8f·ï¼\88*ï¼\89表示ä¸\80æ\97¦æ\82¨è¢«æ·»å\8a è\87³è¯¥ç\94¨æ\88·ç»\84å\90\8eï¼\8cæ\82¨ä¸\8dè\83½äº²è\87ªç§»é\99¤å\85¶æ\9d\83é\99\90ï¼\8cå\8f\8dä¹\8b亦ç\84¶ã\80\82\n* äº\95å\8f·ï¼\88#ï¼\89表示æ\82¨å\8fªå\8f¯ä»¥æ\8e¨è¿\9f该ç\94¨æ\88·ç»\84ç\9a\84è¿\87æ\9c\9fæ\97¶é\97´ï¼\9bæ\82¨ä¸\8dè\83½å°\86å\85¶æ\8f\90å\89\8d。",
        "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-conflict": "用户权限的更改存在冲突!请检查并确认您的更改。",
        "group": "用户组:",
        "group-user": "用户",
        "rcfilters-invalid-filter": "无效过滤器",
        "rcfilters-empty-filter": "没有活跃的过滤器。已显示所有贡献。",
        "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
+       "rcfilters-highlightbutton-title": "高亮结果",
+       "rcfilters-highlightmenu-title": "选择颜色",
        "rcfilters-filterlist-noresults": "找不到过滤器",
        "rcfilters-filtergroup-registration": "用户注册",
        "rcfilters-filter-registered-label": "已注册",
        "recentchangeslinked-feed": "相关更改",
        "recentchangeslinked-toolbox": "相关更改",
        "recentchangeslinked-title": "与“$1”有关的更改",
-       "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|的监视列表]]中的页面以<strong>粗体</strong>显示。",
+       "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|的监视列表]]中的页面以<strong>粗体</strong>显示。",
        "recentchangeslinked-page": "页面名称:",
        "recentchangeslinked-to": "显示链到所给出的页面",
        "recentchanges-page-added-to-category": "[[:$1]]已添加至分类",
        "uploaded-setting-handler-svg": "通过远程/数据/脚本设置“handler”属性的SVG时受阻。在上传的SVG文件中找到<code>$1=\"$2\"</code>。",
        "uploaded-remote-url-svg": "通过远程URL设置任意样式属性的SVG时受阻。在上传的SVG文件中找到<code>$1=\"$2\"</code>。",
        "uploaded-image-filter-svg": "在上传的SVG文件中找到图片过滤器带URL:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploadscriptednamespace": "此SVG文件包含非法名字空间“$1”。",
+       "uploadscriptednamespace": "此SVG文件包含非法名字空间“<nowiki>$1</nowiki>”。",
        "uploadinvalidxml": "上传文件中的XML无法解析。",
        "uploadvirus": "该文件包含病毒!\n详情:$1",
        "uploadjava": "该文件是 ZIP 文件,其中包含 Java 的.class 文件。上传Java文件不被允许,因为它们可能绕过限制,从而引起安全问题。",
        "randompage-nopages": "在以下{{PLURAL:$2|名字空间}}中没有页面:$1。",
        "randomincategory": "分类中随机页面",
        "randomincategory-invalidcategory": "“$1”不是一个有效的分类名称。",
-       "randomincategory-nopages": "[[:Category:$1|$1]]å\88\86类中没有页面。",
+       "randomincategory-nopages": "[[:Category:$1|$1]]å\88\86ç±»ä¸\8b没有页面。",
        "randomincategory-category": "分类:",
        "randomincategory-legend": "分类中随机页面",
        "randomincategory-submit": "提交",
        "ancientpages": "最老页面",
        "move": "移动",
        "movethispage": "移动本页",
-       "unusedimagestext": "以下文件实际存在,但并没有插入任何页面。请注意,其他网站可能会使用直接URL链接某个文件,因此它即使被实际使用也可能在这里列出。",
+       "unusedimagestext": "存在以下没有插入任何页面的文件。请注意,其他网站可能会使用直接URL链接某个文件,因此它即使被实际使用也可能在这里列出。",
        "unusedcategoriestext": "以下分类页面实际存在,即使没有其它页面或分类利用它们。",
        "notargettitle": "无目标",
        "notargettext": "您还没有指定一个目标页面或用户以进行此项操作。",
        "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的编辑,更改回$2的最后版本。",
+       "rollback-success": "已恢复{{GENDER:$3|$1}}的编辑;更改回{{GENDER:$4|$2}}的最后版本。",
        "rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]",
        "sessionfailure-title": "会话无效",
        "sessionfailure": "似乎您的登录会话有问题;\n为了防止会话劫持,这个操作已经被取消。\n请返回先前的页面,重新载入该页面,然后重试。",
        "tooltip-pt-mytalk": "{{GENDER:|您}}的讨论页面",
        "tooltip-pt-anontalk": "有关本IP地址的编辑的讨论",
        "tooltip-pt-preferences": "{{GENDER:|您}}的设置",
-       "tooltip-pt-watchlist": "正在监视更改的页面的列表",
+       "tooltip-pt-watchlist": "正在监视更改的页面的列表",
        "tooltip-pt-mycontris": "{{GENDER:|您}}的贡献的列表",
        "tooltip-pt-anoncontribs": "来自此IP地址的编辑列表",
        "tooltip-pt-login": "我们鼓励您登录;然而,这不是强制性的",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
        "lastmodifiedatby": "本页面被$3最后修改于$1 $2。",
-       "othercontribs": "å\9fºäº\8e$1ç\9a\84å·¥ä½\9cã\80\82",
+       "othercontribs": "å\9fºäº\8e$1ç\9a\84å\8a³å\8a¨æ\88\90æ\9e\9cã\80\82",
        "others": "其他",
        "siteusers": "{{SITENAME}}{{PLURAL:$2|{{GENDER:$1|用户}}}}$1",
        "anonusers": "{{SITENAME}}匿名{{PLURAL:$2|用户}}$1",
        "variantname-gan-hant": "hant",
        "variantname-kk-cyrl": "kk-cyrl",
        "metadata": "元数据",
-       "metadata-help": "此文件中包含有扩展的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。\n\n如果此文件的源文件已经被修改,一些信息在修改后的文件中将不能完全反映出来。",
+       "metadata-help": "此文件中包含有额外的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。如果文件自初始状态已受到修改,一些详细说明可能无法反映修改后的文件。",
        "metadata-expand": "显示详细资料",
        "metadata-collapse": "隐藏详细资料",
        "metadata-fields": "在本信息中所列出的 EXIF 元数据域将包含在图片显示页面,当元数据表损坏时只显示以下信息。\n其他的元数据默认为隐藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "htmlform-user-not-exists": "<strong>$1</strong>不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
-       "logentry-delete-delete_redir": "$1通过覆盖{{GENDER:$2|删除}}重定向$3",
+       "logentry-delete-delete_redir": "$1通过覆盖{{GENDER:$2|删除}}重定向$3",
        "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3",
        "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4",
        "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4",
        "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": "基于cookie的会话",
index e15367a..ac9b60e 100644 (file)
                        "1233thehongkonger",
                        "Maskers",
                        "Knch903",
-                       "Winstonyin"
+                       "Winstonyin",
+                       "Wmr",
+                       "烈羽",
+                       "和平奮鬥救地球"
                ]
        },
        "tog-underline": "底線標示連結:",
        "talk": "討論",
        "views": "檢視",
        "toolbox": "工具",
-       "tool-link-userrights": "更改{{GENDER:$1|使用者}}群組",
+       "tool-link-userrights": "變更{{GENDER:$1|使用者}}群組",
        "tool-link-userrights-readonly": "檢視{{GENDER:$1|使用者}}群組",
        "tool-link-emailuser": "寄信給這位{{GENDER:$1|使用者}}",
        "userpage": "檢視使用者頁面",
        "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
        "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
-       "summary-preview": "摘要預覽:",
+       "summary-preview": "預覽摘要:",
        "subject-preview": "主旨預覽:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "blockedtitle": "使用者已被封鎖",
        "newarticle": "(新)",
        "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 使用說明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
        "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位址可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:CreateAccount|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
-       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
+       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
        "noarticletext-nopermission": "此頁面目前沒有內容,\n您可以在其它頁面中 [[Special:Search/{{PAGENAME}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
        "missing-revision": "頁面名稱 \"{{FULLPAGENAME}}\" 的 #$1 修訂版本不存在。\n\n通常是因連結到過期的歷史頁面,該頁面已被刪除。\n詳情請參考 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "search-interwiki-caption": "姐妹專案",
        "search-interwiki-default": "來自 $1 的結果:",
        "search-interwiki-more": "(更多)",
+       "search-interwiki-more-results": "更多結果",
        "search-relatedarticle": "相關",
        "searchrelated": "相關",
        "searchall": "全部",
        "editusergroup": "載入使用者群組",
        "editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
        "viewinguserrights": "檢視{{GENDER:$1|使用者}}<strong>[[User:$1|$1]]</strong>的使用者權限 $2",
-       "userrights-editusergroup": "編輯使用者群組",
-       "userrights-viewusergroup": "檢視使用者群組",
+       "userrights-editusergroup": "編輯{{GENDER:$1|使用者}}群組",
+       "userrights-viewusergroup": "檢視{{GENDER:$1|使用者}}群組",
        "saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
        "userrights-groupsmember": "所屬群組:",
        "userrights-groupsmember-auto": "所屬隱含群組:",
        "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-expiry": "期限:",
+       "userrights-expiry-othertime": "其他時間:",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
        "group": "群組:",
        "group-user": "使用者",
        "rcfilters-search-placeholder": "過濾最近變更(瀏覽或開始輸入)",
        "rcfilters-invalid-filter": "過濾規則無效",
        "rcfilters-filterlist-title": "篩選器",
+       "rcfilters-filterlist-feedbacklink": "在新(測試版)過濾器中提供反饋",
+       "rcfilters-highlightmenu-title": "選擇顏色",
        "rcfilters-filterlist-noresults": "找不到過濾規則",
+       "rcfilters-filter-registered-label": "已註冊",
+       "rcfilters-filter-unregistered-label": "未註冊",
        "rcfilters-filtergroup-authorship": "編輯者",
        "rcfilters-filter-editsbyself-label": "您自己的編輯",
        "rcfilters-filter-editsbyself-description": "您的編輯。",
        "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-learner-description": "活躍的天數以及編輯數比「新手」多,但比「有經驗的使用者」少。",
        "rcfilters-filter-userExpLevel-experienced-label": "有經驗的使用者",
        "rcfilters-filter-userExpLevel-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
+       "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-pageedits-label": "頁面編輯",
+       "rcfilters-filter-newpages-label": "頁面創建",
+       "rcfilters-filter-newpages-description": "創立新頁面的編緝。",
+       "rcfilters-filter-categorization-label": "分類變更",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
        "rcshowhideminor": "$1 小修訂",
        "uploaded-setting-handler-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用 remote/data/script 設定 \"handler\" 屬性。",
        "uploaded-remote-url-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用任何遠端 URL 設定樣式。",
        "uploaded-image-filter-svg": "於已上傳的 SVG 檔案中找到圖片過濾器使用 URL:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"$1\"。",
+       "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"<nowiki>$1</nowiki>\"。",
        "uploadinvalidxml": "無法解析已上傳檔案中的 XML。",
        "uploadvirus": "該檔案含有病毒!\n詳細資料:$1",
        "uploadjava": "該檔案為包含 Java .class 檔案的 ZIP 檔案。\n因 Java 檔案可能跳過安全檢查造成安全性問題,不允許上傳 Java 檔案。",
        "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請返回上一頁,重新讀取該頁面再試一次。",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
        "metadata": "詮釋資料",
-       "metadata-help": "æ­¤æª\94æ¡\88å\8c\85å\90«é¡\8då¤\96ç\9a\84è³\87è¨\8aï¼\8cå\8f¯è\83½ç\94±æ\95¸ä½\8dç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8fæ©\9fæ\89\80建ç«\8bç\9a\84ã\80\82\nè\8b¥ä¿®æ\94¹æ­¤æª\94æ¡\88ï¼\8cé\83¨ä»½è³\87è¨\8aå°\87ç\84¡æ³\95ä¿\9dç\95\99。",
+       "metadata-help": "æ­¤æ\96\87件中å\8c\85å\90«é¡\8då¤\96ä¿¡æ\81¯ã\80\82é\80\99äº\9bä¿¡æ\81¯å\8f¯è\83½æ\98¯ç\94±æ\95¸ç¢¼ç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8få\84\80å\9c¨å\89µå»ºæ\88\96æ\95¸å­\97å\8c\96é\81\8eç¨\8b中æ\89\80æ·»å\8a ç\9a\84ã\80\82å¦\82æ\9e\9cæ\96\87件è\87ªå\88\9då§\8bç\8b\80æ\85\8bå·²å\8f\97å\88°ä¿®æ\94¹ï¼\8cä¸\80äº\9b詳細說æ\98\8eå\8f¯è\83½ç\84¡æ³\95å\8f\8dæ\98 ä¿®æ\94¹å¾\8cç\9a\84æ\96\87件。",
        "metadata-expand": "顯示詳細資料",
        "metadata-collapse": "隱藏詳細資料",
        "metadata-fields": "在本訊息中所列出的 EXIF 詮釋資料域將包含在圖片顯示頁面,當詮釋資料表損壞時只顯示以下訊息。\n其他的詮釋資料預設為隱藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "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": "取消隱藏編輯摘要",
        "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": "以 cookie 為基礎的連線階段",
        "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>",
        "revid": "修訂 $1",
        "pageid": "頁面 ID $1"
 }
index d99a721..8a43998 100644 (file)
@@ -317,7 +317,7 @@ $magicWords = [
        'pagesincategory_files'     => [ '0', 'فايلات', 'ملفات', 'files' ],
 ];
 
-// (bug 16469) Override Eastern Arabic numberals, use Western
+// (T18469) Override Eastern Arabic numberals, use Western
 $digitTransformTable = [
        '0' => '0',
        '1' => '1',
index a2a7e7d..d7614cc 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'fr';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Dibar',
@@ -32,6 +34,8 @@ $namespaceAliases = [
        'Kaozeadenn_Skeudenn' => NS_FILE_TALK,
 ];
 
+$namespaceGenderAliases = [];
+
 $specialPageAliases = [
        'Activeusers'               => [ 'ImplijerienOberiant' ],
        'Allmessages'               => [ 'HollGemennadennoù' ],
index cb26337..b38287e 100644 (file)
@@ -128,6 +128,7 @@ $specialPageAliases = [
 ];
 
 $magicWords = [
+       'redirect'                  => [ '0', '#REDIRECCIÓ', '#REDIRECCIO', '#REDIRECT' ],
        'numberofarticles'          => [ '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ],
        'numberoffiles'             => [ '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ],
        'numberofusers'             => [ '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ],
@@ -169,8 +170,7 @@ $datePreferences = [
 $defaultDateFormat = 'dmy';
 
 $bookstoreList = [
-       'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
-       'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
+       'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.cat/search*cat/X?SEARCH=$1',
        'inherit' => true,
 ];
 
index 90f1128..94b0a34 100644 (file)
@@ -106,10 +106,10 @@ $specialPageAliases = [
        'Mostlinkedtemplates'       => [ 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ],
        'Mostrevisions'             => [ 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ],
        'Movepage'                  => [ 'Přesunout_stránku', 'Přejmenovat_stránku' ],
-       'Mycontributions'           => [ 'Mé_příspěvky', 'Me_prispevky' ],
+       'Mycontributions'           => [ 'Moje_příspěvky', 'Mé_příspěvky', 'Me_prispevky' ],
        'MyLanguage'                => [ 'V_mém_jazyce', 'Můj_jazyk' ],
-       'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka' ],
-       'Mytalk'                    => [ 'Moje_diskuse' ],
+       'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka', 'Má_stránka' ],
+       'Mytalk'                    => [ 'Moje_diskuse', 'Má_diskuse' ],
        'Myuploads'                 => [ 'Moje_soubory', 'Mé_soubory' ],
        'Newimages'                 => [ 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ],
        'Newpages'                  => [ 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ],
index 689586b..b9280ea 100644 (file)
@@ -105,7 +105,7 @@ $namespaceAliases = [];
  * Example:
  * @code
  * $namespaceGenderAliases = [
- *     NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
+ *   NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
  * ];
  * @endcode
  */
index bf65812..c74d37b 100644 (file)
@@ -105,4 +105,4 @@ $magicWords = [
        'img_center'                => [ '1', 'erdian', 'center', 'centre' ],
 ];
 
-$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* Bug 15717 */
+$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* T17717 */
index 2bf6ce2..7b3b31a 100644 (file)
@@ -25,8 +25,13 @@ $namespaceNames = [
        NS_TEMPLATE_TALK    => 'Prantilla_caraba',
        NS_HELP             => 'Ayua',
        NS_HELP_TALK        => 'Ayua_caraba',
-       NS_CATEGORY         => 'Categoria',
-       NS_CATEGORY_TALK    => 'Categoria_caraba',
+       NS_CATEGORY         => 'Categoría',
+       NS_CATEGORY_TALK    => 'Categoría_caraba',
+];
+
+$namespaceAliases = [ // T157846
+       'Categoria' => NS_CATEGORY,
+       'Categoria_caraba' => NS_CATEGORY_TALK,
 ];
 
 $namespaceGenderAliases = [
index 6281208..e034035 100644 (file)
@@ -28,5 +28,5 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Ñemohenda_myangekõi',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
index 3b788a3..5488b9a 100644 (file)
@@ -13,26 +13,34 @@ $fallback = 'id';
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Astamiwa',
-       NS_TALK             => 'Dhiskusi',
+       NS_TALK             => 'Parembugan',
        NS_USER             => 'Panganggo',
-       NS_USER_TALK        => 'Dhiskusi_Panganggo',
-       NS_PROJECT_TALK     => 'Dhiskusi_$1',
+       NS_USER_TALK        => 'Parembugan_Panganggo',
+       NS_PROJECT_TALK     => 'Parembugan_$1',
        NS_FILE             => 'Gambar',
-       NS_FILE_TALK        => 'Dhiskusi_Gambar',
+       NS_FILE_TALK        => 'Parembugan_Gambar',
        NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'Dhiskusi_MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Parembugan_MediaWiki',
        NS_TEMPLATE         => 'Cithakan',
-       NS_TEMPLATE_TALK    => 'Dhiskusi_Cithakan',
+       NS_TEMPLATE_TALK    => 'Parembugan_Cithakan',
        NS_HELP             => 'Pitulung',
-       NS_HELP_TALK        => 'Dhiskusi_Pitulung',
+       NS_HELP_TALK        => 'Parembugan_Pitulung',
        NS_CATEGORY         => 'Kategori',
-       NS_CATEGORY_TALK    => 'Dhiskusi_Kategori',
+       NS_CATEGORY_TALK    => 'Parembugan_Kategori',
 ];
 
-$namespaceAliases = [
-       'Gambar_Dhiskusi' => NS_FILE_TALK,
+$namespaceAliases = [ // Kept former namespaces for backwards compatibility - T155957
+       'Cithakan_Dhiskusi'  => NS_TEMPLATE_TALK,
+       'Dhiskusi'           => NS_TALK,
+       'Dhiskusi_$1'        => NS_PROJECT_TALK,
+       'Dhiskusi_Cithakan'  => NS_TEMPLATE_TALK,
+       'Dhiskusi_Gambar'    => NS_FILE_TALK,
+       'Dhiskusi_Kategori'  => NS_CATEGORY_TALK,
+       'Dhiskusi_MediaWiki' => NS_MEDIAWIKI_TALK,
+       'Dhiskusi_Panganggo' => NS_USER_TALK,
+       'Dhiskusi_Pitulung'  => NS_HELP_TALK,
+       'Kategori_Dhiskusi'  => NS_CATEGORY_TALK,
        'MediaWiki_Dhiskusi' => NS_MEDIAWIKI_TALK,
-       'Cithakan_Dhiskusi' => NS_TEMPLATE_TALK,
-       'Pitulung_Dhiskusi' => NS_HELP_TALK,
-       'Kategori_Dhiskusi' => NS_CATEGORY_TALK,
+       'Pitulung_Dhiskusi'  => NS_HELP_TALK,
+       'Gambar_Dhiskusi'    => NS_FILE_TALK,
 ];
index 256abd7..d5f8f75 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-# $fallback = 'ru'; // bug 27785
+# $fallback = 'ru'; // T29785
 
 $namespaceNames = [
        NS_MEDIA            => 'Медиа',
index bb18959..f12be20 100644 (file)
@@ -70,7 +70,7 @@ $namespaceAliases = [
        'Diskusyón_de_Katēggoría'  => NS_CATEGORY_TALK,
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $specialPageAliases = [
index a44e0ac..6a71ca7 100644 (file)
@@ -18,5 +18,5 @@ $namespaceGenderAliases = [];
 
 $linkPrefixExtension = true;
 
-# Same as the French (bug 8485)
+# Same as the French (T10485)
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
index 767a305..2aa25ad 100644 (file)
@@ -36,7 +36,7 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Neneuhcāyōtl_tēixnāmiquiliztli',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $namespaceAliases = [
diff --git a/languages/messages/MessagesNrm.php b/languages/messages/MessagesNrm.php
new file mode 100644 (file)
index 0000000..6cb8c47
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Norman (normaund)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fr';
index 1d9e0e5..eb8ed88 100644 (file)
@@ -19,7 +19,7 @@
  * @author לערי ריינהארט
  */
 
-$fallback = 'ca';
+$fallback = 'ca, fr';
 
 $bookstoreList = [
        'Amazon.fr' => 'https://www.amazon.fr/exec/obidos/ISBN=$1'
index d7b5bea..01a9d1a 100644 (file)
@@ -120,7 +120,7 @@ $dateFormats = [
 
 $fallback8bitEncoding = 'iso-8859-2';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // @bug 2749
+       ',' => "\xc2\xa0", // T4749
        '.' => ','
 ];
 
index f020303..78503cc 100644 (file)
@@ -111,7 +111,7 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
+$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # T23168, T29633
 
 $specialPageAliases = [
        'Activeusers'               => [ 'Utilizadores_activos' ],
index d8282dc..8488159 100644 (file)
@@ -36,7 +36,7 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Katiguriya_rimanakuy',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $specialPageAliases = [
index 523783e..e960abd 100644 (file)
@@ -32,5 +32,5 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Samiyachiy_rimanakuy',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
index 01c33ee..d2ce357 100644 (file)
@@ -321,7 +321,7 @@ $magicWords = [
 
 $linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // @bug 2749
+       ',' => "\xc2\xa0", // T4749
        '.' => ','
 ];
 
index 797e443..c30e963 100644 (file)
@@ -44,7 +44,7 @@ $namespaceNames = [
 ];
 
 $namespaceAliases = [
-       // Aliases for Polish namespaces (bug 34988).
+       // Aliases for Polish namespaces (T36988).
        'Specjalna'            => NS_SPECIAL,
        'Dyskusja'             => NS_TALK,
        'Użytkownik'           => NS_USER,
index 8e1020b..4f385cf 100644 (file)
@@ -50,7 +50,7 @@ $namespaceNames = [
 $namespaceAliases = [
        'సభ్యులు' => NS_USER,
        'సభ్యులపై_చర్చ' => NS_USER_TALK,
-       'సభ్యుడు' => NS_USER, # set for bug 11615
+       'సభ్యుడు' => NS_USER, # set for T13615
        'సభ్యునిపై_చర్చ' => NS_USER_TALK,
        'బొమ్మ' => NS_FILE,
        'బొమ్మపై_చర్చ' => NS_FILE_TALK,
index a7978be..f62614b 100644 (file)
@@ -20,7 +20,7 @@ $fallback = 'nl';
 
 /**
  * Namespace names
- * (bug 8708)
+ * (T10708)
  */
 $namespaceNames = [
        NS_MEDIA            => 'Media',
diff --git a/maintenance/CodeCleanerGlobalsPass.inc b/maintenance/CodeCleanerGlobalsPass.inc
new file mode 100644 (file)
index 0000000..5e8e754
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Psy CodeCleaner to allow PHP super globals.
+ *
+ * https://github.com/bobthecow/psysh/issues/353
+ *
+ * Copyright © 2017 Justin Hileman <justin@justinhileman.info>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ *
+ * @author Justin Hileman <justin@justinhileman.info>
+ */
+
+/**
+ * Prefix the real command with a bunch of 'global $VAR;' commands, one for each global.
+ * This will make the shell behave as if it was running in the global scope (almost;
+ * variables created in the shell won't become global if no global variable by that name
+ * existed before).
+ */
+class CodeCleanerGlobalsPass extends \Psy\CodeCleaner\CodeCleanerPass {
+       private static $superglobals = [
+               'GLOBALS', '_SERVER', '_ENV', '_FILES', '_COOKIE', '_POST', '_GET', '_SESSION'
+       ];
+
+       public function beforeTraverse( array $nodes ) {
+               $names = [];
+               foreach ( array_diff( array_keys( $GLOBALS ), self::$superglobals ) as $name ) {
+                       array_push( $names, new \PhpParser\Node\Expr\Variable( $name ) );
+               }
+
+               array_unshift( $nodes, new \PhpParser\Node\Stmt\Global_( $names ) );
+
+               return $nodes;
+       }
+}
+
index 3925efe..62dc36c 100644 (file)
@@ -38,6 +38,7 @@ $maintClass = false;
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * Abstract maintenance class for quickly writing and churning out
diff --git a/maintenance/addSite.php b/maintenance/addSite.php
new file mode 100755 (executable)
index 0000000..1ebc4f6
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/..';
+
+require_once $basePath . '/maintenance/Maintenance.php';
+
+/**
+ * Maintenance script for adding a site definition into the sites table.
+ *
+ * @since 1.29
+ *
+ * @license GNU GPL v2+
+ * @author Florian Schmidt
+ */
+class AddSite extends Maintenance {
+
+       public function __construct() {
+               $this->addDescription( 'Add a site definition into the sites table.' );
+
+               $this->addArg( 'globalid', 'The global id of the site to add, e.g. "wikipedia".', true );
+               $this->addArg( 'group', 'In which group this site should be sorted in.', true );
+               $this->addOption( 'language', 'The language code of the site, e.g. "de".' );
+               $this->addOption( 'interwiki-id', 'The interwiki ID of the site.' );
+               $this->addOption( 'navigation-id', 'The navigation ID of the site.' );
+               $this->addOption( 'pagepath', 'The URL to pages of this site, e.g.' .
+                       ' https://example.com/wiki/\$1.' );
+               $this->addOption( 'filepath', 'The URL to files of this site, e.g. https://example
+               .com/w/\$1.' );
+
+               parent::__construct();
+       }
+
+       /**
+        * Imports the site described by the parameters (see self::__construct()) passed to this
+        * maintenance sccript into the sites table of MediaWiki.
+        */
+       public function execute() {
+               $siteStore = MediaWikiServices::getInstance()->getSiteStore();
+               $siteStore->reset();
+
+               $globalId = $this->getArg( 0 );
+               $group = $this->getArg( 1 );
+               $language = $this->getOption( 'language' );
+               $interwikiId = $this->getOption( 'interwiki-id' );
+               $navigationId = $this->getOption( 'navigation-id' );
+               $pagepath = $this->getOption( 'pagepath' );
+               $filepath = $this->getOption( 'filepath' );
+
+               if ( !is_string( $globalId ) || !is_string( $group ) ) {
+                       echo "Arguments globalid and group need to be strings.\n";
+                       return false;
+               }
+
+               if ( $siteStore->getSite( $globalId ) !== null ) {
+                       echo "Site with global id $globalId already exists.\n";
+                       return false;
+               }
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( $globalId );
+               $site->setGroup( $group );
+               if ( $language !== null ) {
+                       $site->setLanguageCode( $language );
+               }
+               if ( $interwikiId !== null ) {
+                       $site->addInterwikiId( $interwikiId );
+               }
+               if ( $navigationId !== null ) {
+                       $site->addNavigationId( $navigationId );
+               }
+               if ( $pagepath !== null ) {
+                       $site->setPagePath( $pagepath );
+               }
+               if ( $filepath !== null ) {
+                       $site->setFilePath( $filepath );
+               }
+
+               $siteStore->saveSites( [ $site ] );
+
+               if ( method_exists( $siteStore, 'reset' ) ) {
+                       $siteStore->reset();
+               }
+
+               echo "Done.\n";
+       }
+}
+
+$maintClass = 'AddSite';
+require_once RUN_MAINTENANCE_IF_MAIN;
index ddd1d7b..08287cd 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-archive-ar_id.sql
 --
--- Bug 39675. Add archive.ar_id.
+-- T41675. Add archive.ar_id.
 
 ALTER TABLE /*$wgDBprefix*/archive
     ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
index f5ff1f1..f8b6340 100644 (file)
@@ -1,11 +1,11 @@
 --
 -- patch-categorylinks-better-collation.sql
 --
--- Bugs 164, 1211, 23682.  This is the second version of this patch; the
+-- T2164, T3211, T25682.  This is the second version of this patch; the
 -- changes are also incorporated into patch-categorylinks-better-collation2.sql,
 -- for the benefit of trunk users who applied the original.
 --
--- Due to bug 25254, the length limit of 255 bytes for cl_sortkey_prefix
+-- Due to T27254, the length limit of 255 bytes for cl_sortkey_prefix
 -- is also enforced in php. If you change the length of that field, make
 -- sure to also change the check in LinksUpdate.php.
 ALTER TABLE /*$wgDBprefix*/categorylinks
index d4b51b5..ded8454 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-extenallinks-el_id.sql
 --
--- Bug 15441. Add externallinks.el_id.
+-- T17441. Add externallinks.el_id.
 
 ALTER TABLE /*$wgDBprefix*/externallinks
     ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
index 742841e..c516aaf 100644 (file)
@@ -1,4 +1,4 @@
--- Increase the length of up_property from 32 -> 255 bytes. Bug 19408
+-- Increase the length of up_property from 32 -> 255 bytes. T21408
 
 ALTER TABLE /*_*/user_properties
        MODIFY up_property varbinary(255);
diff --git a/maintenance/archives/patch-user_groups-primary-key.sql b/maintenance/archives/patch-user_groups-primary-key.sql
new file mode 100644 (file)
index 0000000..e3c8735
--- /dev/null
@@ -0,0 +1,5 @@
+-- Convert unique index into a primary key on user_groups
+
+ALTER TABLE /*$wgDBprefix*/user_groups
+  DROP INDEX ug_user_group,
+  ADD PRIMARY KEY (ug_user, ug_group);
index 2ce2c9e..b329f94 100644 (file)
@@ -1,7 +1,5 @@
--- Primary key and expiry column in user_groups table
+-- Add expiry column in user_groups table
 
 ALTER TABLE /*$wgDBprefix*/user_groups
-  DROP INDEX ug_user_group,
-  ADD PRIMARY KEY (ug_user, ug_group),
   ADD COLUMN ug_expiry varbinary(14) NULL default NULL,
   ADD INDEX ug_expiry (ug_expiry);
index befafc1..286fb58 100644 (file)
@@ -27,6 +27,8 @@
 require_once __DIR__ . '/Maintenance.php';
 require_once __DIR__ . '/../includes/export/DumpFilter.php';
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * @ingroup Dump Maintenance
  */
index c92a720..b2f7e96 100644 (file)
@@ -41,7 +41,7 @@ class BenchUtf8TitleCheck extends Benchmarker {
                        "United States of America", // 7bit ASCII
                        "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn",
-                       // This comes from bug 36839
+                       // This comes from T38839
                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
                        . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
                        . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
index c8f393d..e0da027 100644 (file)
@@ -146,7 +146,7 @@ class ImageCleanup extends TableCleanup {
                 * if the target title exists in the image table, or if both the
                 * original and target titles exist in the page table, append
                 * increasing version numbers until the target title exists in
-                * neither.  (See also bug 16916.)
+                * neither.  (See also T18916.)
                 */
                $version = 0;
                $final = $new;
index 863d74a..83ab35c 100644 (file)
@@ -38,31 +38,43 @@ class CleanupRemovedModules extends Maintenance {
                parent::__construct();
                $this->addDescription(
                        'Remove cache entries for removed ResourceLoader modules from the database' );
-               $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+               $this->setBatchSize( 500 );
        }
 
        public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
                $dbw = $this->getDB( DB_MASTER );
                $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
                $moduleNames = $rl->getModuleNames();
-               $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
-               $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+               $res = $dbw->select( 'module_deps',
+                       [ 'md_module', 'md_skin' ],
+                       $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1',
+                       __METHOD__
+               );
+               $rows = iterator_to_array( $res, false );
 
-               $this->output( "Cleaning up module_deps table...\n" );
-               $i = 1;
                $modDeps = $dbw->tableName( 'module_deps' );
-               do {
-                       // $dbw->delete() doesn't support LIMIT :(
-                       $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
-                       $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
                        $numRows = $dbw->affectedRows();
                        $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
                        $i++;
-                       wfWaitForSlaves();
-               } while ( $numRows > 0 );
-               $this->output( "done\n" );
+               }
+
+               $this->output( "Done\n" );
        }
 }
 
-$maintClass = "CleanupRemovedModules";
+$maintClass = 'CleanupRemovedModules';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 650fae0..ccc6406 100644 (file)
@@ -138,14 +138,14 @@ class TitleCleanup extends TableCleanup {
                                $prior = $title->getDBkey();
                        }
 
-                       # Old cleanupTitles could move articles there. See bug 23147.
+                       # Old cleanupTitles could move articles there. See T25147.
                        $ns = $row->page_namespace;
                        if ( $ns < 0 ) {
                                $ns = 0;
                        }
 
                        # Namespace which no longer exists. Put the page in the main namespace
-                       # since we don't have any idea of the old namespace name. See bug 68501.
+                       # since we don't have any idea of the old namespace name. See T70501.
                        if ( !MWNamespace::exists( $ns ) ) {
                                $ns = 0;
                        }
index b8001a4..70f3654 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
  *
index d8661c1..5d92eec 100644 (file)
@@ -27,6 +27,8 @@
 require_once __DIR__ . '/backup.inc';
 require_once __DIR__ . '/../includes/export/WikiExporter.php';
 
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * @ingroup Maintenance
  */
@@ -212,7 +214,6 @@ TEXT
                // We do /not/ retry upon failure, but delegate to encapsulating logic, to avoid
                // individually retrying at different layers of code.
 
-               // 1. The LoadBalancer.
                try {
                        $this->lb = wfGetLBFactory()->newMainLB();
                } catch ( Exception $e ) {
@@ -220,7 +221,6 @@ TEXT
                                . " rotating DB failed to obtain new load balancer (" . $e->getMessage() . ")" );
                }
 
-               // 2. The Connection, through the load balancer.
                try {
                        $this->db = $this->lb->getConnection( DB_REPLICA, 'dump' );
                } catch ( Exception $e ) {
index 1d6f31d..79f75ef 100644 (file)
@@ -72,7 +72,7 @@ class FixDoubleRedirects extends Maintenance {
                        'rd_from = pa.page_id',
                        'rd_namespace = pb.page_namespace',
                        'rd_title = pb.page_title',
-                       'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // bug 40352
+                       'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // T42352
                        'pb.page_is_redirect' => 1,
                ];
 
index 87af5b8..fb00bed 100644 (file)
@@ -523,7 +523,7 @@ class GenerateSitemap extends Maintenance {
        function fileEntry( $url, $date, $priority ) {
                return
                        "\t<url>\n" .
-                       // bug 34666: $url may contain bad characters such as ampersands.
+                       // T36666: $url may contain bad characters such as ampersands.
                        "\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
                        "\t\t<lastmod>$date</lastmod>\n" .
                        "\t\t<priority>$priority</priority>\n" .
@@ -545,7 +545,7 @@ class GenerateSitemap extends Maintenance {
         * @param int $namespace
         */
        function generateLimit( $namespace ) {
-               // bug 17961: make a title with the longest possible URL in this namespace
+               // T19961: make a title with the longest possible URL in this namespace
                $title = Title::makeTitle( $namespace, str_repeat( "\xf0\xa8\xae\x81", 63 ) . "\xe5\x96\x83" );
 
                $this->limit = [
index a0fe381..2a102b2 100644 (file)
@@ -106,7 +106,7 @@ class HHVMMakeRepo extends Maintenance {
                $cmd = wfEscapeShellArg(
                        $hhvm,
                        '--hphp',
-                   '--target', 'hhbc',
+                       '--target', 'hhbc',
                        '--format', 'binary',
                        '--force', '1',
                        '--keep-tempdir', '1',
index 4a3d2d6..23bdb3f 100644 (file)
@@ -497,7 +497,7 @@ class ImportImages extends Maintenance {
        # (preferably batching files too).
        private function getFileCommentFromSourceWiki( $wiki_host, $file ) {
                $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+                       . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
                $body = Http::get( $url, [], __METHOD__ );
                if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
                        return false;
@@ -508,7 +508,7 @@ class ImportImages extends Maintenance {
 
        private function getFileUserFromSourceWiki( $wiki_host, $file ) {
                $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+                       . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
                $body = Http::get( $url, [], __METHOD__ );
                if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
                        return false;
diff --git a/maintenance/initUserPreference.php b/maintenance/initUserPreference.php
new file mode 100644 (file)
index 0000000..f4da570
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Initialize a user preference based on the value
+ * of another preference.
+ *
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that initializes a user preference
+ * based on the value of another preference.
+ *
+ * @ingroup Maintenance
+ */
+class InitUserPreference extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption(
+                       'target',
+                       'Name of the user preference to initialize',
+                       true,
+                       true,
+                       't'
+               );
+               $this->addOption(
+                       'source',
+                       'Name of the user preference to take the value from',
+                       true,
+                       true,
+                       's'
+               );
+               $this->setBatchSize( 300 );
+       }
+
+       public function execute() {
+               $target = $this->getOption( 'target' );
+               $source = $this->getOption( 'source' );
+               $this->output( "Initializing '$target' based on the value of '$source'\n" );
+
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $iterator = new BatchRowIterator(
+                       $dbr,
+                       'user_properties',
+                       [ 'up_user', 'up_property' ],
+                       $this->mBatchSize
+               );
+               $iterator->setFetchColumns( [ 'up_user', 'up_value' ] );
+               $iterator->addConditions( [
+                       'up_property' => $source,
+                       'up_value IS NOT NULL',
+                       'up_value != 0',
+               ] );
+
+               $processed = 0;
+               foreach ( $iterator as $batch ) {
+                       foreach ( $batch as $row ) {
+                               $values = [
+                                       'up_user' => $row->up_user,
+                                       'up_property' => $target,
+                                       'up_value' => $row->up_value,
+                               ];
+                               $dbw->upsert(
+                                       'user_properties',
+                                       $values,
+                                       [ 'up_user', 'up_property' ],
+                                       $values,
+                                       __METHOD__
+                               );
+
+                               $processed += $dbw->affectedRows();
+                       }
+               }
+
+               $this->output( "Processed $processed user(s)\n" );
+               $this->output( "Finished!\n" );
+       }
+}
+
+$maintClass = 'InitUserPreference'; // Tells it to run the class
+require_once RUN_MAINTENANCE_IF_MAIN;
index bced265..9fee611 100644 (file)
@@ -84,7 +84,6 @@ U+05E03布|U+05E03布|U+04F48佈|
 U+05E18帘|U+07C3E簾|U+05E18帘|
 U+05E2D席|U+05E2D席|U+084C6蓆|
 U+05E72干|U+05E72干|U+04E7E乾|U+05E79幹|U+069A6榦|
-U+05E7A幺|U+04E48么|
 U+05E76并|U+04E26並|U+04F75併|
 U+05E78幸|U+05E78幸|U+05016倖|
 U+05E7F广|U+05EE3廣|U+05E7F广|
index 17d2f21..19ec7b1 100644 (file)
 於志贺
 覆盖
 五箇山
-麽麽
-幺厮
-幺半群
-幺元
-幺爹
-幺叔
-幺舅
-幺爸
-幺妈
-幺姨
-幺娘
-幺妹
-幺小
-幺姓
-姓幺
-幺氏
-麽氏
-幺蛾子
-幺麽
-幺麽小丑
-幺凤
-幺二三
-幺篇
-幺谦
 阿部正瞭
 醯酱
 醯鸡
index bae5fd8..6975e25 100644 (file)
 著絲 着丝
 著麼 着么
 著人 着人
-著什麼      着什么
+著什 着什
 著他 着他
 著令 着令
 著位 着位
 飃著 飘着
 沈著 沉着
 擡著 抬着
\91\97ç\94\9a麽      着什么
\91\97ç\94\9a麼      着什么
 滿著 满着
 滿著名      满著名
 滿著作      满著作
 三極體      三极管
 軟體 软件
 軟體動物   软体动物
+軟體生物   软体生物
 軟體家具   软体家具
 網路 网络
 人工智慧   人工智能
 奈及利亞   尼日利亚
 尼日爾      尼日尔
 巴貝多      巴巴多斯
-巴布亞紐幾內亞  巴布亚新几内亚
 布吉納法索        布基纳法索
 蒲隆地      布隆迪
 帛琉 帕劳
 賓·拉登    本·拉登
 歐巴馬      奥巴马
 北韓 北朝鲜
+台北韓      台北韩
 寮人民民主共和國       老挝人民民主共和国
 寮語 老挝语
 蘭卡威      浮罗交怡
 厄利垂亚   厄立特里亚
 亞歷山卓   亚历山大
 雅穆索戈   亚穆苏克罗
-畿內亞      几内亚
 索馬利蘭   索马里兰
 吉力馬札羅        乞力马扎罗
 索馬利亞   索马里
 千里達      特立尼达
 托巴哥      多巴哥
 多明尼加   多米尼加
+斯堪地那維亞     斯堪的纳维亚
 頻寬 带宽
 數位相機   数码相机
 數位照相機        数码照相机
index 31e02c2..7a07259 100644 (file)
@@ -6,9 +6,11 @@
 汙    污
 溼    濕
 硅    矽
+幺    么
 計畫 計劃
 吧台 吧枱
 坐台 坐枱
+坐台铁      坐台鐵
 妆台 妝枱
 弹珠台      彈珠枱
 折台 摺枱
 占有五不   占有五不
 吞占 吞佔
 一地里      一地裏
-一年里      一年裏
 中文里      中文裏
 英文里      英文裏
 古文里      古文裏
 市里的      市裏的
 年代里      年代裏
 年里 年裏
+年里约      年里約 #里约奧運
 店里 店裏
 庙里 廟裏
 往里 往裏
 点里 點裏
 点里程      點里程
 鼓里 鼓裏
+殿里 殿裏
+队里 隊裏
 世纪里      世紀裏
 夜晚里      夜晚裏
 参数里      參數裏
 沖著。      沖著。
 沖著,      沖著,
 衝著 衝着
\91\97ç\94\9a麽      ç\9d\80ç\94\9a麽
\91\97ç\94\9a麼      ç\9d\80ç\94\9a麼
 存著 存着
 存著名      存著名
 存著作      存著作
 塞席爾      塞舌爾
 安地卡及巴布達  安提瓜和巴布達
 巴貝多      巴巴多斯
-巴布亞紐幾內亞  巴布亞新畿內亞
+紐幾內亞   新幾內亞
 布吉納法索        布基納法索
 蒲隆地      布隆迪
 帕劳 帛琉
 阿拉伯聯合大公國       阿拉伯聯合酋長國
 馬爾地夫   馬爾代夫
 馬利共和國        馬里共和國
+斯堪地那維亞     斯堪的納維亞
 台球 桌球
 撞球 桌球
 冰淇淋      雪糕
 亞斯文      阿斯旺
 奈及利亞   尼日利亞
 雅穆索戈   雅穆蘇克雷
-幾內亞      畿內亞
-几内亚      畿內亞
 衣索匹亞   埃塞俄比亚
 吉力馬札羅        乞力馬札羅
 厄利垂亚   厄立特里亞
index dee2164..6f3304f 100644 (file)
@@ -75,6 +75,7 @@
 於梨华      於梨华
 於潜 於潜
 於志贺      於志贺
+於戏 於戏
 憑藉 凭借
 藉端 借端
 藉故 借故
 么姨 幺姨
 么娘 幺娘
 么孃 幺娘
-幺孃 幺娘
 么弟 幺弟
 么妹 幺妹
 么小 幺小
 么姓 幺姓
 么氏 幺氏
 么蛾子      幺蛾子
-幺厮 幺厮
-麼麼 麽麽
-么麼 幺麽
 么鳳 幺凤
 么二三      幺二三
 么篇 幺篇
-么謙 幺谦
 六么 六幺
 老么 老幺
 么正 幺正
 么女 幺女
 么九 幺九
 么子 幺子
-这么 这么
-那么 那么
-什么 什么
-怎么 怎么
-多么 多么
+姓么 姓幺
+么兒 幺儿
+么喝 幺喝
+么爺 幺爷
+么雞 幺鸡
+么麼 幺麽
+幺麽 幺麽
+麽氏 麽氏
+麼氏 麽氏
 乾乾淨淨   干干净净
 乾乾脆脆   干干脆脆
 肉乾乾      肉干干
index 075deab..d983932 100644 (file)
@@ -15,6 +15,7 @@
 锎    鉲
 钚    鈽
 硅    矽
+幺    么
 煙草 菸草
 烟草 菸草
 煙蒂 菸蒂
 尼日尔      尼日
 尼日爾      尼日
 巴巴多斯   巴貝多
-巴布亚新几内亚  巴布亞紐幾內亞
-巴布亞新畿內亞  巴布亞紐幾內亞
 布基纳法索        布吉納法索
 布基納法索        布吉納法索
 布隆迪      蒲隆地
 波利尼西亚        玻里尼西亞
 波利尼西亞        玻里尼西亞
 新几内亚   紐幾內亞
+新幾內亞   紐幾內亞
 约翰斯顿岛        強斯頓環礁
 巴尔米拉环礁     帕邁拉環礁
 马恩岛      曼島
 阿斯旺      亞斯文
 雅穆苏克雷        雅穆索戈
 雅穆蘇克雷        雅穆索戈
-畿內亞      幾內亞
 索马里兰   索馬利蘭
 索馬里蘭   索馬利蘭
 乞力马扎罗        吉力馬札羅
 得克薩斯   德克薩斯
 蒙特利尔   蒙特婁
 蒙特利爾   蒙特婁
+斯堪的纳维亚     斯堪地那維亞
+斯堪的納維亞     斯堪地那維亞
 麦克尔      麥可
 迈克尔      麥可
 魯賓斯·巴里切羅        魯本·巴瑞切羅
index 3c7ea7a..f106db1 100644 (file)
 划龍舟      划龍舟
 划龍船      划龍船
 只影響      只影響
+義联 義联
+杠轂 杠轂
+局促 侷促
+開山辟谷   開山辟谷
+戲院里      戲院里
+么半 么半
+么元 么元
+么爹 么爹
+么叔 么叔
+么舅 么舅
+么爸 么爸
+么媽 么媽
+么姨 么姨
+么娘 么娘
+么孃 么孃
 么弟 么弟
+么妹 么妹
+么小 么小
+么姓 么姓
+么氏 么氏
+么蛾子      么蛾子
+么鳳 么鳳
+么二三      么二三
+么篇 么篇
 六么 六么
-么雞 么雞
+老么 老么
 么正 么正
 么女 么女
 么九 么九
 么子 么子
-么半 么半
-義联 義联
-杠轂 杠轂
-局促 侷促
-開山辟谷   開山辟谷
-戲院里      戲院里
+姓么 姓么
+么兒 么兒
+么喝 么喝
+么爺 么爺
+么雞 么雞
+么麼 么麼
 惨淡 慘澹
 恶心 噁心
 证谏 証諫
index b4cd628..4effa8e 100644 (file)
 丑三
 丑表功
 公孫丑
-么麼小丑
 平平當當
 滿滿當當
 當當丁丁
 布穀鳥
 穀祿
 穀城縣
+穀氨
+穀胱
 颳雪
 广部
 亂鬨鬨
 喧鬨
 起鬨
 內鬨
-於後
 猜三划五
 划龍舟
 划龍船
 上簽署
 上簽發
 上簽約
+上簽了
 中簽名
 中簽字
 中簽收
 中簽署
 中簽發
 中簽約
+中簽了
 下簽名
 下簽字
 下簽收
 下簽署
 下簽發
 下簽約
+下簽了
 犖确
 磽确
 确瘠
 蒼朮
 赤朮
 朮赤
+莪朮
 博爾朮
+巴而朮
+朮虎高
+耶律朮烈
 髼鬆
 皮鬆
 濛鬆雨
 叶韻
 叶音
 叶恭弘
-置於
-散於
-播於
-國於
-敗於
-畢於
-畢業於
-寒於
-任於
-拘於
-插於
-中於
-敏於
-聽於
-短於
-成於
-樊於期
-淡於
-禍於
-格於
-猛於
-施於
-拒人於
-拒於
-潰於
-窮於
-相於
-形於
-半於
-詢於
-美於
-醜於
-好於
-坏於
-強於
-弱於
-差於
-劣於
-染指於
-存於
-隱於
-藏於
-嚴於
-寬於
-給於
-危於
-於徵
-離於
-麗於
-下於
-亞於
-同於
-屑於
-絕於
-致於
-遜於
-任教於
-教於
-自於
-來於
-附於
-阻於
-囿於
-直於
-建於
-都於
-役於
-助於
-害於
-損於
-益於
-從於
-隨於
-順於
-汲於
-溺於
-迷於
-醉於
-行於
-泥於
-身於
-足於
-溢於
-畏於
-視於
-衷於
-狃於
-疲於
-通於
-老於
-耿於
-服於
-臻於
-匿於
-因於
-似於
-遷於
-怒於
-心於
-集於
-容於
 新紮
 紙紮
 紮鐵
 影相弔
 哀弔
 唁弔
-安於
-迫於
-罷於
-蹪於
-甚於
-等於
-定於
-利於
-對於
-歸於
-難於
-移禍於
-生於
-立於
-多於
-勝於
-傳於
-流於
-過於
-關於
-毀於
-基於
-急於
-嫁禍於
-見於
-鑒於
-始於
-出於
-輕於
-幸於
-怠於
-止於
-至於
-拙於
-忠於
-終於
-重於
-垂於
-善於
-死於
-屬於
-浮於
-在於
-易於
-精於
-由於
-補於
-位於
-寓於
-源於
-且於
-長於
-現於
-較於
-分布於
-散於
-優於
-早於
-晚於
-感於
-用於
-處於
-助於
-便於
-戰於
-葬於
-困於
-適於
-苦於
-落於
-取決於
-着眼於
 鬼谷子
 谷子敬
 洪谷子
 瑞城里
 金城里
 西湖里
+坑口里
 子里甲
 水里商工
 車里雅賓斯克
 區裡有
 實驗裡
 註裡
+殿裡
+隊裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 首發
 高后
 升高後
 提高後
-0年 # 協助分詞
-1年
-2年
-3年
-4年
-5年
-6年
-7年
-8年
-9年
-〇年
-零年
-一年
-兩年
-二年
-三年
-四年
-五年
-六年
-七年
-八年
-九年
-十年
-百年
-千年
-萬年
-億年
 周后
 0周後
 1周後
 伊達里子
 濱田里佳子
 王田里
+田里穗
 小井里
 西井里
 碧河里
 吧檯
 賭檯
 坐檯
+坐台鐵
 妝檯
 餐檯
 工作檯
index 92643bd..e6aac9c 100644 (file)
 乾地
 方誌
 編髮
+颳去
+刮去
+么
+換髮
+谷氨酸
+幸免於難
+勝于
+善于
+安于
+寓于
+對于
+屬于
+忠于
+急于
+歸于
+生于
+由于
+終于
+見于
+過于
+長于
+關于
+難于
index 9585ed8..bbedf0c 100644 (file)
@@ -75,7 +75,7 @@ class ManageJobs extends Maintenance {
                $skipped = 0;
                foreach ( $queue->getAllAbandonedJobs() as $job ) {
                        /** @var Job $job */
-                       if ( $job->getQueuedTimestamp() < $lastRepushTime ) {
+                       if ( $job->getQueuedTimestamp() < wfTimestamp( TS_UNIX, $lastRepushTime ) ) {
                                ++$skipped;
                                continue; // already re-pushed in prior round
                        }
index 396be1d..597a876 100644 (file)
@@ -79,7 +79,7 @@ class MigrateUserGroup extends Maintenance {
                        $affected += $dbw->affectedRows();
                        $this->commitTransaction( $dbw, __METHOD__ );
 
-                       // Clear cache for the affected users (bug 40340)
+                       // Clear cache for the affected users (T42340)
                        if ( $affected > 0 ) {
                                // XXX: This also invalidates cache of unaffected users that
                                // were in the new group and not in the group.
index 1c633be..78f0671 100644 (file)
@@ -301,7 +301,7 @@ CREATE TABLE /*_*/categorylinks (
   -- conversion algorithm is run.  We store this so that we can update
   -- collations without reparsing all pages.
   -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See bug 25254.
+  -- code in LinksUpdate.php. See T27254.
   cl_sortkey_prefix varbinary(255) NOT NULL default 0x,
 
   -- This isn't really used at present. Provided for an optional
@@ -528,7 +528,7 @@ CREATE TABLE /*_*/ipblocks (
   -- Size chosen to allow IPv6
   -- FIXME: these fields were originally blank for single-IP blocks,
   -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (bug 49504).
+  -- should be fixed to be blank again for such blocks (T51504).
   ipb_range_start varchar(255) NOT NULL,
   ipb_range_end varchar(255) NOT NULL,
 
index 522871d..80e8011 100644 (file)
@@ -26,6 +26,7 @@
 
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -571,7 +572,7 @@ class NamespaceConflictChecker extends Maintenance {
        /**
         * Merge page histories
         *
-        * @param integer $id The page_id
+        * @param stdClass $row Page row
         * @param Title $newTitle The new title
         * @return bool
         */
index 5e44faf..a9457c2 100644 (file)
@@ -136,7 +136,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 
                $content = $rev->getContent();
                if ( !$content ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $id = $row->$idCol;
                        $this->output( "Content of $table $id unavailable!\n" );
 
index 095c266..fb97e91 100644 (file)
@@ -156,10 +156,10 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                } catch ( Exception $e ) {
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
-                       return false; // bug 22624?
+                       return false; // T24624?
                }
                if ( !is_string( $text ) ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
                        return false;
@@ -185,11 +185,11 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                } catch ( Exception $e ) {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
-                       return false; // bug 22624?
+                       return false; // T24624?
                }
                $text = $rev->getSerializedData();
                if ( !is_string( $text ) ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
                        return false;
index b354399..cf65c69 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends purge requests for pages edited in a date
  * range to squid/varnish.
diff --git a/maintenance/purgeModuleDeps.php b/maintenance/purgeModuleDeps.php
new file mode 100644 (file)
index 0000000..3088baa
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Remove all cache entries for ResourceLoader modules from the database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Timo Tijhof
+ */
+
+use MediaWiki\MediaWikiServices;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to purge the module_deps database cache table.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeModuleDeps extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Remove all cache entries for ResourceLoader modules from the database' );
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
+               $dbw = $this->getDB( DB_MASTER );
+               $res = $dbw->select( 'module_deps', [ 'md_module', 'md_skin' ], [], __METHOD__ );
+               $rows = iterator_to_array( $res, false );
+
+               $modDeps = $dbw->tableName( 'module_deps' );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
+                       $i++;
+               }
+
+               $this->output( "Done\n" );
+       }
+}
+
+$maintClass = 'PurgeModuleDeps';
+require_once RUN_MAINTENANCE_IF_MAIN;
index d073282..3520279 100644 (file)
@@ -140,7 +140,7 @@ class RebuildFileCache extends Maintenance {
 
                                        MediaWiki\suppressWarnings(); // header notices
                                        // Cache ?action=view
-                                       $wgRequestTime = microtime( true ); # bug 22852
+                                       $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
                                        $article->view();
                                        $context->getOutput()->output();
@@ -148,7 +148,7 @@ class RebuildFileCache extends Maintenance {
                                        $viewHtml = ob_get_clean();
                                        $viewCache->saveToFileCache( $viewHtml );
                                        // Cache ?action=history
-                                       $wgRequestTime = microtime( true ); # bug 22852
+                                       $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
                                        Action::factory( 'history', $article, $context )->show();
                                        $context->getOutput()->output();
index fb24a1d..06fcbaf 100644 (file)
@@ -272,7 +272,9 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               foreach ( $content->getSecondaryDataUpdates( $page->getTitle() ) as $update ) {
+               $updates = $content->getSecondaryDataUpdates(
+                       $page->getTitle(), /* $old = */ null, /* $recursive = */ false );
+               foreach ( $updates as $update ) {
                        DeferredUpdates::addUpdate( $update );
                }
        }
diff --git a/maintenance/shell.php b/maintenance/shell.php
new file mode 100644 (file)
index 0000000..47ef804
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Modern interactive shell within the MediaWiki engine.
+ *
+ * Merely wraps around http://psysh.org/ and drop an interactive PHP shell in
+ * the global scope.
+ *
+ * Copyright © 2017 Antoine Musso <hashar@free.fr>
+ * Copyright © 2017 Gergő Tisza <tgr.huwiki@gmail.com>
+ * Copyright © 2017 Justin Hileman <justin@justinhileman.info>
+ * Copyright © 2017 Wikimedia Foundation Inc.
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ *
+ * @author Antoine Musso <hashar@free.fr>
+ * @author Justin Hileman <justin@justinhileman.info>
+ * @author Gergő Tisza <tgr.huwiki@gmail.com>
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Interactive shell with completion and global scope.
+ *
+ */
+class MediaWikiShell extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->addOption( 'd',
+                       'For back compatibility with eval.php. ' .
+                       '0 send debug to stdout. ' .
+                       'With 1 additionally initialize database with debugging ',
+                       false, true
+               );
+       }
+
+       public function execute() {
+               if ( !class_exists( \Psy\Shell::class ) ) {
+                       $this->error( 'PsySH not found. Please run composer with the --dev option.', 1 );
+               }
+
+               $traverser = new \PhpParser\NodeTraverser();
+               $codeCleaner = new \Psy\CodeCleaner( null, null, $traverser );
+
+               // add this after initializing the code cleaner so all the default passes get added first
+               $traverser->addVisitor( new CodeCleanerGlobalsPass() );
+
+               $config = new \Psy\Configuration( [ 'codeCleaner' => $codeCleaner ] );
+               $config->setUpdateCheck( \Psy\VersionUpdater\Checker::NEVER );
+               $shell = new \Psy\Shell( $config );
+               if ( $this->hasOption( 'd' ) ) {
+                       $this->setupLegacy();
+               }
+
+               $shell->run();
+       }
+
+       /**
+        * For back compatibility with eval.php
+        */
+       protected function setupLegacy() {
+               global $wgDebugLogFile;
+
+               $d = intval( $this->getOption( 'd' ) );
+               if ( $d > 0 ) {
+                       $wgDebugLogFile = 'php://stdout';
+               }
+               if ( $d > 1 ) {
+                       # Set DBO_DEBUG (equivalent of $wgDebugDumpSql)
+                       # XXX copy pasted from eval.php :(
+                       $lb = wfGetLB();
+                       $serverCount = $lb->getServerCount();
+                       for ( $i = 0; $i < $serverCount; $i++ ) {
+                               $server = $lb->getServerInfo( $i );
+                               $server['flags'] |= DBO_DEBUG;
+                               $lb->setServerInfo( $i, $server );
+                       }
+               }
+       }
+
+}
+
+$maintClass = 'MediaWikiShell';
+require_once RUN_MAINTENANCE_IF_MAIN;
index cc976ed..58472e9 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
  *
@@ -50,7 +52,7 @@ class MwSql extends Maintenance {
                $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
-                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
+                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
                } else {
                        $lb = wfGetLB( $wiki );
                }
@@ -137,7 +139,7 @@ class MwSql extends Maintenance {
                        }
                        if ( $historyFile ) {
                                # Delimiter is eated by streamStatementEnd, we add it
-                               # up in the history (bug 37020)
+                               # up in the history (T39020)
                                readline_add_history( $wholeLine . ';' );
                                readline_write_history( $historyFile );
                        }
@@ -159,7 +161,7 @@ class MwSql extends Maintenance {
 
        /**
         * Print the results, callback for $db->sourceStream()
-        * @param ResultWrapper $res The results object
+        * @param ResultWrapper|bool $res The results object
         * @param IDatabase $db
         */
        public function sqlPrintResult( $res, $db ) {
index f322a03..2d0c9ee 100644 (file)
@@ -3,7 +3,7 @@
 -- Unique indexes need to be handled with INSERT SELECT since just running
 -- the CREATE INDEX statement will fail if there are duplicate values.
 --
--- Ignore duplicates, several tables will have them (e.g. bug 16966) but in
+-- Ignore duplicates, several tables will have them (e.g. T18966) but in
 -- most cases it's harmless to discard them.
 
 --------------------------------------------------------------------------------
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
deleted file mode 100644 (file)
index b444f31..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-<?php
-/**
- * Script to fix bug 20757.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance ExternalStorage
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Maintenance script to fix bug 20757.
- *
- * @ingroup Maintenance ExternalStorage
- */
-class FixBug20757 extends Maintenance {
-       public $batchSize = 10000;
-       public $mapCache = [];
-       public $mapCacheSize = 0;
-       public $maxMapCacheSize = 1000000;
-
-       function __construct() {
-               parent::__construct();
-               $this->addDescription( 'Script to fix bug 20757 assuming that blob_tracking is intact' );
-               $this->addOption( 'dry-run', 'Report only' );
-               $this->addOption( 'start', 'old_id to start at', false, true );
-       }
-
-       function execute() {
-               $dbr = $this->getDB( DB_REPLICA );
-               $dbw = $this->getDB( DB_MASTER );
-
-               $dryRun = $this->getOption( 'dry-run' );
-               if ( $dryRun ) {
-                       print "Dry run only.\n";
-               }
-
-               $startId = $this->getOption( 'start', 0 );
-               $numGood = 0;
-               $numFixed = 0;
-               $numBad = 0;
-
-               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
-
-               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
-               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
-
-               while ( true ) {
-                       print "ID: $startId / $totalRevs\r";
-
-                       $res = $dbr->select(
-                               'text',
-                               [ 'old_id', 'old_flags', 'old_text' ],
-                               [
-                                       'old_id > ' . intval( $startId ),
-                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
-                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
-                               ],
-                               __METHOD__,
-                               [
-                                       'ORDER BY' => 'old_id',
-                                       'LIMIT' => $this->batchSize,
-                               ]
-                       );
-
-                       if ( !$res->numRows() ) {
-                               break;
-                       }
-
-                       $secondaryIds = [];
-                       $stubs = [];
-
-                       foreach ( $res as $row ) {
-                               $startId = $row->old_id;
-
-                               // Basic sanity checks
-                               $obj = unserialize( $row->old_text );
-                               if ( $obj === false ) {
-                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( !is_object( $obj ) ) {
-                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
-                                               gettype( $obj ) . ", possible double-serialization\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
-                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
-                                               get_class( $obj ) . "\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               // Process flags
-                               $flags = explode( ',', $row->old_flags );
-                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
-                                       $legacyEncoding = false;
-                               } else {
-                                       $legacyEncoding = true;
-                               }
-
-                               // Queue the stub for future batch processing
-                               $id = intval( $obj->mOldId );
-                               $secondaryIds[] = $id;
-                               $stubs[$row->old_id] = [
-                                       'legacyEncoding' => $legacyEncoding,
-                                       'secondaryId' => $id,
-                                       'hash' => $obj->mHash,
-                               ];
-                       }
-
-                       $secondaryIds = array_unique( $secondaryIds );
-
-                       if ( !count( $secondaryIds ) ) {
-                               continue;
-                       }
-
-                       // Run the batch query on blob_tracking
-                       $res = $dbr->select(
-                               'blob_tracking',
-                               '*',
-                               [
-                                       'bt_text_id' => $secondaryIds,
-                               ],
-                               __METHOD__
-                       );
-                       $trackedBlobs = [];
-                       foreach ( $res as $row ) {
-                               $trackedBlobs[$row->bt_text_id] = $row;
-                       }
-
-                       // Process the stubs
-                       foreach ( $stubs as $primaryId => $stub ) {
-                               $secondaryId = $stub['secondaryId'];
-                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
-                                       // No tracked blob. Work out what went wrong
-                                       $secondaryRow = $dbr->selectRow(
-                                               'text',
-                                               [ 'old_flags', 'old_text' ],
-                                               [ 'old_id' => $secondaryId ],
-                                               __METHOD__
-                                       );
-                                       if ( !$secondaryRow ) {
-                                               print "$primaryId: unrecoverable: secondary row is missing\n";
-                                               ++$numBad;
-                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
-                                               // Not broken yet, and not in the tracked clusters so it won't get
-                                               // broken by the current RCT run.
-                                               ++$numGood;
-                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
-                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
-                                               ++$numBad;
-                                       } else {
-                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
-                                               ++$numBad;
-                                       }
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               $trackRow = $trackedBlobs[$secondaryId];
-
-                               // Check that the specified text really is available in the tracked source row
-                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
-                               $text = ExternalStore::fetchFromURL( $url );
-                               if ( $text === false ) {
-                                       print "$primaryId: unrecoverable: source text missing\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               if ( md5( $text ) !== $stub['hash'] ) {
-                                       print "$primaryId: unrecoverable: content hashes do not match\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-
-                               // Find the page_id and rev_id
-                               // The page is probably the same as the page of the secondary row
-                               $pageId = intval( $trackRow->bt_page );
-                               if ( !$pageId ) {
-                                       $revId = $pageId = 0;
-                               } else {
-                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
-                                       if ( !$revId ) {
-                                               // Actually an orphan
-                                               $pageId = $revId = 0;
-                                       }
-                               }
-
-                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
-
-                               if ( !$dryRun ) {
-                                       // Reset the text row to point to the original copy
-                                       $this->beginTransaction( $dbw, __METHOD__ );
-                                       $dbw->update(
-                                               'text',
-                                               // SET
-                                               [
-                                                       'old_flags' => $newFlags,
-                                                       'old_text' => $url
-                                               ],
-                                               // WHERE
-                                               [ 'old_id' => $primaryId ],
-                                               __METHOD__
-                                       );
-
-                                       // Add a blob_tracking row so that the new reference can be recompressed
-                                       // without needing to run trackBlobs.php again
-                                       $dbw->insert( 'blob_tracking',
-                                               [
-                                                       'bt_page' => $pageId,
-                                                       'bt_rev_id' => $revId,
-                                                       'bt_text_id' => $primaryId,
-                                                       'bt_cluster' => $trackRow->bt_cluster,
-                                                       'bt_blob_id' => $trackRow->bt_blob_id,
-                                                       'bt_cgz_hash' => $stub['hash'],
-                                                       'bt_new_url' => null,
-                                                       'bt_moved' => 0,
-                                               ],
-                                               __METHOD__
-                                       );
-                                       $this->commitTransaction( $dbw, __METHOD__ );
-                                       $this->waitForSlaves();
-                               }
-
-                               print "$primaryId: resolved to $url\n";
-                               ++$numFixed;
-                       }
-               }
-
-               print "\n";
-               print "Fixed: $numFixed\n";
-               print "Unrecoverable: $numBad\n";
-               print "Good stubs: $numGood\n";
-       }
-
-       function waitForSlaves() {
-               static $iteration = 0;
-               ++$iteration;
-               if ( ++$iteration > 50 == 0 ) {
-                       wfWaitForSlaves();
-                       $iteration = 0;
-               }
-       }
-
-       function findTextIdInPage( $pageId, $textId ) {
-               $ids = $this->getRevTextMap( $pageId );
-               if ( !isset( $ids[$textId] ) ) {
-                       return null;
-               } else {
-                       return $ids[$textId];
-               }
-       }
-
-       function getRevTextMap( $pageId ) {
-               if ( !isset( $this->mapCache[$pageId] ) ) {
-                       // Limit cache size
-                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
-                               $key = key( $this->mapCache );
-                               $this->mapCacheSize -= count( $this->mapCache[$key] );
-                               unset( $this->mapCache[$key] );
-                       }
-
-                       $dbr = $this->getDB( DB_REPLICA );
-                       $map = [];
-                       $res = $dbr->select( 'revision',
-                               [ 'rev_id', 'rev_text_id' ],
-                               [ 'rev_page' => $pageId ],
-                               __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $map[$row->rev_text_id] = $row->rev_id;
-                       }
-                       $this->mapCache[$pageId] = $map;
-                       $this->mapCacheSize += count( $map );
-               }
-
-               return $this->mapCache[$pageId];
-       }
-
-       /**
-        * This is based on part of HistoryBlobStub::getText().
-        * Determine if the text can be retrieved from the row in the normal way.
-        * @param array $stub
-        * @param stdClass $secondaryRow
-        * @return bool
-        */
-       function isUnbrokenStub( $stub, $secondaryRow ) {
-               $flags = explode( ',', $secondaryRow->old_flags );
-               $text = $secondaryRow->old_text;
-               if ( in_array( 'external', $flags ) ) {
-                       $url = $text;
-                       MediaWiki\suppressWarnings();
-                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
-                       MediaWiki\restoreWarnings();
-
-                       if ( $path == "" ) {
-                               return false;
-                       }
-                       $text = ExternalStore::fetchFromURL( $url );
-               }
-               if ( !in_array( 'object', $flags ) ) {
-                       return false;
-               }
-
-               if ( in_array( 'gzip', $flags ) ) {
-                       $obj = unserialize( gzinflate( $text ) );
-               } else {
-                       $obj = unserialize( $text );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       // Correct for old double-serialization bug.
-                       $obj = unserialize( $obj );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       return false;
-               }
-
-               $obj->uncompress();
-               $text = $obj->getItem( $stub['hash'] );
-
-               return $text !== false;
-       }
-}
-
-$maintClass = 'FixBug20757';
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/fixT22757.php b/maintenance/storage/fixT22757.php
new file mode 100644 (file)
index 0000000..e8bd23d
--- /dev/null
@@ -0,0 +1,349 @@
+<?php
+/**
+ * Script to fix T22757.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance ExternalStorage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Maintenance script to fix T22757.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
+class FixT22757 extends Maintenance {
+       public $batchSize = 10000;
+       public $mapCache = [];
+       public $mapCacheSize = 0;
+       public $maxMapCacheSize = 1000000;
+
+       function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Script to fix T22757 assuming that blob_tracking is intact' );
+               $this->addOption( 'dry-run', 'Report only' );
+               $this->addOption( 'start', 'old_id to start at', false, true );
+       }
+
+       function execute() {
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $dryRun = $this->getOption( 'dry-run' );
+               if ( $dryRun ) {
+                       print "Dry run only.\n";
+               }
+
+               $startId = $this->getOption( 'start', 0 );
+               $numGood = 0;
+               $numFixed = 0;
+               $numBad = 0;
+
+               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
+
+               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
+               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
+
+               while ( true ) {
+                       print "ID: $startId / $totalRevs\r";
+
+                       $res = $dbr->select(
+                               'text',
+                               [ 'old_id', 'old_flags', 'old_text' ],
+                               [
+                                       'old_id > ' . intval( $startId ),
+                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
+                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
+                               ],
+                               __METHOD__,
+                               [
+                                       'ORDER BY' => 'old_id',
+                                       'LIMIT' => $this->batchSize,
+                               ]
+                       );
+
+                       if ( !$res->numRows() ) {
+                               break;
+                       }
+
+                       $secondaryIds = [];
+                       $stubs = [];
+
+                       foreach ( $res as $row ) {
+                               $startId = $row->old_id;
+
+                               // Basic sanity checks
+                               $obj = unserialize( $row->old_text );
+                               if ( $obj === false ) {
+                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               if ( !is_object( $obj ) ) {
+                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
+                                               gettype( $obj ) . ", possible double-serialization\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
+                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
+                                               get_class( $obj ) . "\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               // Process flags
+                               $flags = explode( ',', $row->old_flags );
+                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
+                                       $legacyEncoding = false;
+                               } else {
+                                       $legacyEncoding = true;
+                               }
+
+                               // Queue the stub for future batch processing
+                               $id = intval( $obj->mOldId );
+                               $secondaryIds[] = $id;
+                               $stubs[$row->old_id] = [
+                                       'legacyEncoding' => $legacyEncoding,
+                                       'secondaryId' => $id,
+                                       'hash' => $obj->mHash,
+                               ];
+                       }
+
+                       $secondaryIds = array_unique( $secondaryIds );
+
+                       if ( !count( $secondaryIds ) ) {
+                               continue;
+                       }
+
+                       // Run the batch query on blob_tracking
+                       $res = $dbr->select(
+                               'blob_tracking',
+                               '*',
+                               [
+                                       'bt_text_id' => $secondaryIds,
+                               ],
+                               __METHOD__
+                       );
+                       $trackedBlobs = [];
+                       foreach ( $res as $row ) {
+                               $trackedBlobs[$row->bt_text_id] = $row;
+                       }
+
+                       // Process the stubs
+                       foreach ( $stubs as $primaryId => $stub ) {
+                               $secondaryId = $stub['secondaryId'];
+                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
+                                       // No tracked blob. Work out what went wrong
+                                       $secondaryRow = $dbr->selectRow(
+                                               'text',
+                                               [ 'old_flags', 'old_text' ],
+                                               [ 'old_id' => $secondaryId ],
+                                               __METHOD__
+                                       );
+                                       if ( !$secondaryRow ) {
+                                               print "$primaryId: unrecoverable: secondary row is missing\n";
+                                               ++$numBad;
+                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
+                                               // Not broken yet, and not in the tracked clusters so it won't get
+                                               // broken by the current RCT run.
+                                               ++$numGood;
+                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
+                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
+                                               ++$numBad;
+                                       } else {
+                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
+                                               ++$numBad;
+                                       }
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+                               $trackRow = $trackedBlobs[$secondaryId];
+
+                               // Check that the specified text really is available in the tracked source row
+                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
+                               $text = ExternalStore::fetchFromURL( $url );
+                               if ( $text === false ) {
+                                       print "$primaryId: unrecoverable: source text missing\n";
+                                       ++$numBad;
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+                               if ( md5( $text ) !== $stub['hash'] ) {
+                                       print "$primaryId: unrecoverable: content hashes do not match\n";
+                                       ++$numBad;
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+
+                               // Find the page_id and rev_id
+                               // The page is probably the same as the page of the secondary row
+                               $pageId = intval( $trackRow->bt_page );
+                               if ( !$pageId ) {
+                                       $revId = $pageId = 0;
+                               } else {
+                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
+                                       if ( !$revId ) {
+                                               // Actually an orphan
+                                               $pageId = $revId = 0;
+                                       }
+                               }
+
+                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
+
+                               if ( !$dryRun ) {
+                                       // Reset the text row to point to the original copy
+                                       $this->beginTransaction( $dbw, __METHOD__ );
+                                       $dbw->update(
+                                               'text',
+                                               // SET
+                                               [
+                                                       'old_flags' => $newFlags,
+                                                       'old_text' => $url
+                                               ],
+                                               // WHERE
+                                               [ 'old_id' => $primaryId ],
+                                               __METHOD__
+                                       );
+
+                                       // Add a blob_tracking row so that the new reference can be recompressed
+                                       // without needing to run trackBlobs.php again
+                                       $dbw->insert( 'blob_tracking',
+                                               [
+                                                       'bt_page' => $pageId,
+                                                       'bt_rev_id' => $revId,
+                                                       'bt_text_id' => $primaryId,
+                                                       'bt_cluster' => $trackRow->bt_cluster,
+                                                       'bt_blob_id' => $trackRow->bt_blob_id,
+                                                       'bt_cgz_hash' => $stub['hash'],
+                                                       'bt_new_url' => null,
+                                                       'bt_moved' => 0,
+                                               ],
+                                               __METHOD__
+                                       );
+                                       $this->commitTransaction( $dbw, __METHOD__ );
+                                       $this->waitForSlaves();
+                               }
+
+                               print "$primaryId: resolved to $url\n";
+                               ++$numFixed;
+                       }
+               }
+
+               print "\n";
+               print "Fixed: $numFixed\n";
+               print "Unrecoverable: $numBad\n";
+               print "Good stubs: $numGood\n";
+       }
+
+       function waitForSlaves() {
+               static $iteration = 0;
+               ++$iteration;
+               if ( ++$iteration > 50 == 0 ) {
+                       wfWaitForSlaves();
+                       $iteration = 0;
+               }
+       }
+
+       function findTextIdInPage( $pageId, $textId ) {
+               $ids = $this->getRevTextMap( $pageId );
+               if ( !isset( $ids[$textId] ) ) {
+                       return null;
+               } else {
+                       return $ids[$textId];
+               }
+       }
+
+       function getRevTextMap( $pageId ) {
+               if ( !isset( $this->mapCache[$pageId] ) ) {
+                       // Limit cache size
+                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
+                               $key = key( $this->mapCache );
+                               $this->mapCacheSize -= count( $this->mapCache[$key] );
+                               unset( $this->mapCache[$key] );
+                       }
+
+                       $dbr = $this->getDB( DB_REPLICA );
+                       $map = [];
+                       $res = $dbr->select( 'revision',
+                               [ 'rev_id', 'rev_text_id' ],
+                               [ 'rev_page' => $pageId ],
+                               __METHOD__
+                       );
+                       foreach ( $res as $row ) {
+                               $map[$row->rev_text_id] = $row->rev_id;
+                       }
+                       $this->mapCache[$pageId] = $map;
+                       $this->mapCacheSize += count( $map );
+               }
+
+               return $this->mapCache[$pageId];
+       }
+
+       /**
+        * This is based on part of HistoryBlobStub::getText().
+        * Determine if the text can be retrieved from the row in the normal way.
+        * @param array $stub
+        * @param stdClass $secondaryRow
+        * @return bool
+        */
+       function isUnbrokenStub( $stub, $secondaryRow ) {
+               $flags = explode( ',', $secondaryRow->old_flags );
+               $text = $secondaryRow->old_text;
+               if ( in_array( 'external', $flags ) ) {
+                       $url = $text;
+                       MediaWiki\suppressWarnings();
+                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
+                       MediaWiki\restoreWarnings();
+
+                       if ( $path == "" ) {
+                               return false;
+                       }
+                       $text = ExternalStore::fetchFromURL( $url );
+               }
+               if ( !in_array( 'object', $flags ) ) {
+                       return false;
+               }
+
+               if ( in_array( 'gzip', $flags ) ) {
+                       $obj = unserialize( gzinflate( $text ) );
+               } else {
+                       $obj = unserialize( $text );
+               }
+
+               if ( !is_object( $obj ) ) {
+                       // Correct for old double-serialization bug.
+                       $obj = unserialize( $obj );
+               }
+
+               if ( !is_object( $obj ) ) {
+                       return false;
+               }
+
+               $obj->uncompress();
+               $text = $obj->getItem( $stub['hash'] );
+
+               return $text !== false;
+       }
+}
+
+$maintClass = 'FixT22757';
+require_once RUN_MAINTENANCE_IF_MAIN;
index a2dc376..4f22843 100644 (file)
@@ -69,7 +69,7 @@ class TrackBlobs {
                echo "Doing integrity check...\n";
                $dbr = wfGetDB( DB_REPLICA );
 
-               // Scan for HistoryBlobStub objects in the text table (bug 20757)
+               // Scan for HistoryBlobStub objects in the text table (T22757)
 
                $exists = $dbr->selectField( 'text', 1,
                        'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\' ' .
@@ -84,7 +84,7 @@ class TrackBlobs {
                        exit( 1 );
                }
 
-               // Scan the archive table for HistoryBlobStub objects or external flags (bug 22624)
+               // Scan the archive table for HistoryBlobStub objects or external flags (T24624)
                $flags = $dbr->selectField( 'archive', 'ar_flags',
                        'ar_flags LIKE \'%external%\' OR (' .
                        'ar_flags LIKE \'%object%\' ' .
index 892f799..44922a4 100644 (file)
@@ -594,7 +594,7 @@ CREATE TABLE /*_*/categorylinks (
   -- conversion algorithm is run.  We store this so that we can update
   -- collations without reparsing all pages.
   -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See bug 25254.
+  -- code in LinksUpdate.php. See T27254.
   cl_sortkey_prefix varchar(255) binary NOT NULL default '',
 
   -- This isn't really used at present. Provided for an optional
@@ -816,7 +816,7 @@ CREATE TABLE /*_*/ipblocks (
   -- Size chosen to allow IPv6
   -- FIXME: these fields were originally blank for single-IP blocks,
   -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (bug 49504).
+  -- should be fixed to be blank again for such blocks (T51504).
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
 
index a672e29..d96cecd 100755 (executable)
@@ -112,7 +112,7 @@ class UpdateMediaWiki extends Maintenance {
                }
 
                $lang = Language::factory( 'en' );
-               // Set global language to ensure localised errors are in English (bug 20633)
+               // Set global language to ensure localised errors are in English (T22633)
                RequestContext::getMain()->setLanguage( $lang );
                $wgLang = $lang; // BackCompat
 
@@ -203,7 +203,7 @@ class UpdateMediaWiki extends Maintenance {
 
                # Don't try to access the database
                # This needs to be disabled early since extensions will try to use the l10n
-               # cache from $wgExtensionFunctions (bug 20471)
+               # cache from $wgExtensionFunctions (T22471)
                $wgLocalisationCacheConf = [
                        'class' => 'LocalisationCache',
                        'storeClass' => 'LCStoreNull',
index 9893342..69c9265 100644 (file)
@@ -195,7 +195,7 @@ class UserDupes {
                        "SELECT user_name,COUNT(*) AS n
                                FROM $user
                        GROUP BY user_name
-                         HAVING n > 1", __METHOD__ );
+                               HAVING n > 1", __METHOD__ );
 
                $list = [];
                foreach ( $result as $row ) {
index 0a859c0..85fa780 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
+
 /**
  * Maintenance script to wrap all old-style passwords in a layered type
  *
@@ -71,6 +74,7 @@ class WrapOldPasswords extends Maintenance {
                $typeCond = 'user_password' . $dbw->buildLike( ":$firstType:", $dbw->anyString() );
 
                $minUserId = 0;
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                do {
                        $this->beginTransaction( $dbw, __METHOD__ );
 
@@ -113,7 +117,7 @@ class WrapOldPasswords extends Maintenance {
                        }
 
                        $this->commitTransaction( $dbw, __METHOD__ );
-                       LBFactory::waitForReplication();
+                       $lbFactory->waitForReplication();
 
                        // Clear memcached so old passwords are wiped out
                        foreach ( $updateUsers as $user ) {
index f9c6117..3b2798f 100644 (file)
@@ -29,7 +29,11 @@ body {
        margin: 0 0 10px 10px;
 }
 
-td, h3, p, h1, pre {
+h1,
+h3,
+p,
+pre,
+td {
        margin: 0 20px 20px 20px;
        font-size: 11px;
        line-height: 140%;
index 3aeb1ed..ea5835d 100644 (file)
 
 .config-block-label {
        display: block;
-       margin-bottom: .2em;
+       margin-bottom: 0.2em;
 }
 
-.config-block-label label, .config-label {
+.config-block-label label,
+.config-label {
        font-weight: bold;
-       padding-right: .5em;
-       padding-top: .2em;
+       padding-right: 0.5em;
+       padding-top: 0.2em;
 }
 
 .config-block-elements {
 .btn-install {
        font-weight: bold;
        font-size: 110%;
-       padding: .2em .3em;
+       padding: 0.2em 0.3em;
 }
 
 .success-message {
 }
 
 .config-plainlink a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .config-download-link {
        background-position: left center;
        background-repeat: no-repeat;
        cursor: pointer;
-       font-size: .8em;
+       font-size: 0.8em;
        text-decoration: underline;
        color: #0645ad;
 }
index 983da09..b868295 100644 (file)
     "grunt-eslint": "19.0.0",
     "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
-    "grunt-stylelint": "0.6.0",
+    "grunt-stylelint": "0.7.0",
     "karma": "1.1.0",
     "karma-chrome-launcher": "2.0.0",
     "karma-firefox-launcher": "1.0.0",
     "karma-qunit": "1.0.0",
     "qunitjs": "1.22.0",
-    "stylelint-config-wikimedia": "0.3.0"
+    "stylelint-config-wikimedia": "0.4.1"
   }
 }
index f14787f..67a3de5 100644 (file)
@@ -251,7 +251,6 @@ return [
                'scripts' => 'resources/src/jquery/jquery.highlightText.js',
                'dependencies' => [
                        'mediawiki.RegExp',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -345,7 +344,6 @@ return [
                'styles' => 'resources/src/jquery/jquery.tablesorter.less',
                'messages' => [ 'sort-descending', 'sort-ascending' ],
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ],
@@ -736,7 +734,7 @@ return [
 
        // Deprecated since MediaWiki 1.29.0
        'json' => [
-               'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
+               'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -744,10 +742,12 @@ return [
 
        'moment' => [
                'scripts' => [
-                       'resources/lib/moment/moment.js',
+                       // HACK: For some reason if you don't define window.moment first, loading moment fatals
                        'resources/src/moment-global.js',
+                       'resources/lib/moment/moment.js',
                ],
                'languageScripts' => [
+                       'aeb-arab' => 'resources/lib/moment/locale/ar-tn.js',
                        'af' => 'resources/lib/moment/locale/af.js',
                        'ar' => 'resources/lib/moment/locale/ar.js',
                        'ar-ma' => 'resources/lib/moment/locale/ar-ma.js',
@@ -766,6 +766,7 @@ return [
                        'da' => 'resources/lib/moment/locale/da.js',
                        'de' => 'resources/lib/moment/locale/de.js',
                        'de-at' => 'resources/lib/moment/locale/de-at.js',
+                       'dv' => 'resources/lib/moment/locale/dv.js',
                        'el' => 'resources/lib/moment/locale/el.js',
                        'en' => 'resources/src/moment-dmy.js',
                        'en-au' => 'resources/lib/moment/locale/en-au.js',
@@ -780,6 +781,8 @@ return [
                        'fo' => 'resources/lib/moment/locale/fo.js',
                        'fr-ca' => 'resources/lib/moment/locale/fr-ca.js',
                        'fr' => 'resources/lib/moment/locale/fr.js',
+                       'fy' => 'resources/lib/moment/locale/fy.js',
+                       'gd' => 'resources/lib/moment/locale/gd.js',
                        'gl' => 'resources/lib/moment/locale/gl.js',
                        'he' => 'resources/lib/moment/locale/he.js',
                        'hi' => 'resources/lib/moment/locale/hi.js',
@@ -790,31 +793,43 @@ return [
                        'is' => 'resources/lib/moment/locale/is.js',
                        'it' => 'resources/lib/moment/locale/it.js',
                        'ja' => 'resources/lib/moment/locale/ja.js',
+                       'jv' => 'resources/lib/moment/locale/jv.js',
                        'ka' => 'resources/lib/moment/locale/ka.js',
+                       'kk-cyrl' => 'resources/lib/moment/locale/kk.js',
                        'ko' => 'resources/lib/moment/locale/ko.js',
+                       'ky' => 'resources/lib/moment/locale/ky.js',
+                       'lo' => 'resources/lib/moment/locale/lo.js',
                        'lt' => 'resources/lib/moment/locale/lt.js',
                        'lv' => 'resources/lib/moment/locale/lv.js',
+                       'mi' => 'resources/lib/moment/locale/mi.js',
                        'mk' => 'resources/lib/moment/locale/mk.js',
                        'ml' => 'resources/lib/moment/locale/ml.js',
                        'mr' => 'resources/lib/moment/locale/mr.js',
                        'ms-my' => 'resources/lib/moment/locale/ms-my.js',
+                       'ms' => 'resources/lib/moment/locale/ms.js',
                        'my' => 'resources/lib/moment/locale/my.js',
                        'nb' => 'resources/lib/moment/locale/nb.js',
                        'ne' => 'resources/lib/moment/locale/ne.js',
                        'nl' => 'resources/lib/moment/locale/nl.js',
                        'nn' => 'resources/lib/moment/locale/nn.js',
+                       'pa' => 'resources/lib/moment/locale/pa-in.js',
                        'pl' => 'resources/lib/moment/locale/pl.js',
                        'pt-br' => 'resources/lib/moment/locale/pt-br.js',
                        'pt' => 'resources/lib/moment/locale/pt.js',
                        'ro' => 'resources/lib/moment/locale/ro.js',
                        'ru' => 'resources/lib/moment/locale/ru.js',
+                       'se' => 'resources/lib/moment/locale/se.js',
+                       'si' => 'resources/lib/moment/locale/si.js',
                        'sk' => 'resources/lib/moment/locale/sk.js',
                        'sl' => 'resources/lib/moment/locale/sl.js',
                        'sq' => 'resources/lib/moment/locale/sq.js',
                        'sr-ec' => 'resources/lib/moment/locale/sr-cyrl.js',
                        'sr-el' => 'resources/lib/moment/locale/sr.js',
+                       'ss' => 'resources/lib/moment/locale/ss.js',
                        'sv' => 'resources/lib/moment/locale/sv.js',
+                       'sw' => 'resources/lib/moment/locale/sw.js',
                        'ta' => 'resources/lib/moment/locale/ta.js',
+                       'te' => 'resources/lib/moment/locale/te.js',
                        'th' => 'resources/lib/moment/locale/th.js',
                        'tl-ph' => 'resources/lib/moment/locale/tl-ph.js',
                        'tr' => 'resources/lib/moment/locale/tr.js',
@@ -824,6 +839,7 @@ return [
                        'uz' => 'resources/lib/moment/locale/uz.js',
                        'vi' => 'resources/lib/moment/locale/vi.js',
                        'zh-cn' => 'resources/lib/moment/locale/zh-cn.js',
+                       'zh-hk' => 'resources/lib/moment/locale/zh-hk.js',
                        'zh-tw' => 'resources/lib/moment/locale/zh-tw.js',
                        'zh-hans' => 'resources/lib/moment/locale/zh-cn.js',
                        'zh-hant' => 'resources/lib/moment/locale/zh-tw.js',
@@ -919,7 +935,6 @@ return [
        'mediawiki.api.upload' => [
                'scripts' => 'resources/src/mediawiki/api/upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api',
                        'mediawiki.api.edit',
                ],
@@ -1202,7 +1217,6 @@ return [
        'mediawiki.Upload' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.Upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api.upload',
                ],
        ],
@@ -1346,9 +1360,10 @@ return [
        'mediawiki.user' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => [
-                       'mediawiki.cookie',
                        'mediawiki.api',
                        'mediawiki.api.user',
+                       'mediawiki.cookie',
+                       'mediawiki.storage',
                        'user.options',
                        'user.tokens',
                ],
@@ -1419,7 +1434,7 @@ return [
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
                'dependencies' => [
                        'jquery.makeCollapsible',
-                       'mediawiki.cookie',
+                       'mediawiki.storage',
                        'mediawiki.icon',
                ],
        ],
@@ -1594,7 +1609,6 @@ return [
                        'mediawiki.util',
                        'mediawiki.language',
                        'user.options',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1733,25 +1747,56 @@ return [
 
        /* MediaWiki Special pages */
 
-       'mediawiki.rcfilters.filters' => [
+       'mediawiki.rcfilters.filters.base.styles' => [
+               'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
+               ],
+       ],
+       'mediawiki.rcfilters.filters.dm' => [
                'scripts' => [
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js',
+               ],
+               'dependencies' => [
+                       'oojs',
+                       'mediawiki.Uri',
+               ],
+       ],
+       'mediawiki.rcfilters.filters.ui' => [
+               'scripts' => [
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js',
-                       'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js',
+                       'resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js',
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.init.js',
                ],
                'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less',
                ],
                'messages' => [
                        'rcfilters-activefilters',
@@ -1761,6 +1806,7 @@ return [
                        'rcfilters-invalid-filter',
                        'rcfilters-empty-filter',
                        'rcfilters-filterlist-title',
+                       'rcfilters-filterlist-feedbacklink',
                        'rcfilters-filterlist-noresults',
                        'rcfilters-filtergroup-registration',
                        'rcfilters-filter-registered-label',
@@ -1798,11 +1844,16 @@ return [
                        'rcfilters-filter-categorization-description',
                        'rcfilters-filter-logactions-label',
                        'rcfilters-filter-logactions-description',
+                       'rcfilters-highlightbutton-title',
+                       'rcfilters-highlightmenu-title',
+                       'recentchanges-noresult',
                ],
                'dependencies' => [
                        'oojs-ui',
-                       'mediawiki.Uri',
-                       'oojs-ui.styles.icons-moderation'
+                       'mediawiki.rcfilters.filters.dm',
+                       'oojs-ui.styles.icons-moderation',
+                       'oojs-ui.styles.icons-editing-core',
+                       'oojs-ui.styles.icons-interactions',
                ],
        ],
        'mediawiki.special' => [
@@ -1879,7 +1930,10 @@ return [
        'mediawiki.special.block' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.block.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css',
-               'dependencies' => 'mediawiki.util',
+               'dependencies' => [
+                       'mediawiki.util',
+                       'mediawiki.htmlform',
+               ],
        ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
@@ -1983,6 +2037,23 @@ return [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.special.search.interwikiwidget.styles' => [
+               'styles' => 'resources/src/mediawiki.special/'
+                       . 'mediawiki.special.search.interwikiwidget.styles.less',
+               'targets' => [ 'desktop', 'mobile' ]
+       ],
+       'mediawiki.special.search.commonsInterwikiWidget' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js',
+               'dependencies' => [
+                       'mediawiki.Uri',
+                       'mediawiki.jqueryMsg'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+               'messages' => [
+                       'search-interwiki-more',
+                       'searchprofile-images'
+               ],
+       ],
        'mediawiki.special.undelete' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ],
@@ -2367,6 +2438,15 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.widgets.UsersMultiselectWidget' => [
+               'scripts' => [
+                       'resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js',
+               ],
+               'dependencies' => [
+                       'oojs-ui-widgets',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.widgets.SearchInputWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js',
@@ -2409,11 +2489,10 @@ return [
        ],
 
        /* dom-level2-shim */
-       // IE 8
+       // Deprecated since MediaWiki 1.29.0
        'dom-level2-shim' => [
-               'scripts' => 'resources/src/polyfill-nodeTypes.js',
+               'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/dom-level2-skip.js',
        ],
 
        /* OOjs */
index bd17246..9ee5374 100644 (file)
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors
+Copyright (c) 2011-2016 Tim Wood, Iskren Chernev, Moment.js contributors
 
 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
index 55a41bd..d1a0dda 100644 (file)
@@ -1,24 +1,25 @@
-// moment.js locale configuration
-// locale : afrikaans (af)
-// author : Werner Mollentze : https://github.com/wernerm
+//! moment.js locale configuration
+//! locale : Afrikaans [af]
+//! author : Werner Mollentze : https://github.com/wernerm
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('af', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var af = moment.defineLocale('af', {
         months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
-        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+        monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
         weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
         weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
         weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+        meridiemParse: /vm|nm/i,
+        isPM : function (input) {
+            return /^nm$/i.test(input);
+        },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 12) {
                 return isLower ? 'vm' : 'VM';
         },
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Vandag om] LT',
@@ -66,4 +67,7 @@
             doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
         }
     });
-}));
+
+    return af;
+
+}));
\ No newline at end of file
index 871e41c..b12a7b1 100644 (file)
@@ -1,32 +1,30 @@
-// moment.js locale configuration
-// locale : Moroccan Arabic (ar-ma)
-// author : ElFadili Yassine : https://github.com/ElFadiliY
-// author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Arabic (Morocco) [ar-ma]
+//! author : ElFadili Yassine : https://github.com/ElFadiliY
+//! author : Abdel Said : https://github.com/abdelsaid
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ar-ma', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ar_ma = moment.defineLocale('ar-ma', {
         months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
         monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
         weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
         weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[اليوم على الساعة] LT',
@@ -56,4 +54,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ar_ma;
+
+}));
\ No newline at end of file
index 11350cb..430a184 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Arabic Saudi Arabia (ar-sa)
-// author : Suhail Alkowaileet : https://github.com/xsoh
+//! moment.js locale configuration
+//! locale : Arabic (Saudi Arabia) [ar-sa]
+//! author : Suhail Alkowaileet : https://github.com/xsoh
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '١',
         '2': '٢',
         '٠': '0'
     };
 
-    return moment.defineLocale('ar-sa', {
+    var ar_sa = moment.defineLocale('ar-sa', {
         months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
         monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
         weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
         weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
             LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /ص|م/,
+        isPM : function (input) {
+            return 'م' === input;
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
@@ -96,4 +98,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ar_sa;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ar-tn.js b/resources/lib/moment/locale/ar-tn.js
new file mode 100644 (file)
index 0000000..dfabae3
--- /dev/null
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale  :  Arabic (Tunisia) [ar-tn]
+//! author : Nader Toukabri : https://github.com/naderio
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ar_tn = moment.defineLocale('ar-tn', {
+        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+        monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat: {
+            LT: 'HH:mm',
+            LTS: 'HH:mm:ss',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd D MMMM YYYY HH:mm'
+        },
+        calendar: {
+            sameDay: '[اليوم على الساعة] LT',
+            nextDay: '[غدا على الساعة] LT',
+            nextWeek: 'dddd [على الساعة] LT',
+            lastDay: '[أمس على الساعة] LT',
+            lastWeek: 'dddd [على الساعة] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: 'في %s',
+            past: 'منذ %s',
+            s: 'ثوان',
+            m: 'دقيقة',
+            mm: '%d دقائق',
+            h: 'ساعة',
+            hh: '%d ساعات',
+            d: 'يوم',
+            dd: '%d أيام',
+            M: 'شهر',
+            MM: '%d أشهر',
+            y: 'سنة',
+            yy: '%d سنوات'
+        },
+        week: {
+            dow: 1, // Monday is the first day of the week.
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return ar_tn;
+
+}));
\ No newline at end of file
index cbec753..8bd2b1b 100644 (file)
@@ -1,20 +1,17 @@
-// moment.js locale configuration
-// Locale: Arabic (ar)
-// Author: Abdel Said: https://github.com/abdelsaid
-// Changes in months, weekdays: Ahmed Elkhatib
-// Native plural forms: forabi https://github.com/forabi
+//! moment.js locale configuration
+//! locale : Arabic [ar]
+//! author : Abdel Said: https://github.com/abdelsaid
+//! author : Ahmed Elkhatib
+//! author : forabi https://github.com/forabi
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '١',
         '2': '٢',
         'كانون الأول ديسمبر'
     ];
 
-    return moment.defineLocale('ar', {
+    var ar = moment.defineLocale('ar', {
         months : months,
         monthsShort : months,
         weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
         weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
         weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
             LTS : 'HH:mm:ss',
-            L : 'DD/MM/YYYY',
+            L : 'D/\u200FM/\u200FYYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /ص|م/,
+        isPM : function (input) {
+            return 'م' === input;
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
             yy : pluralize('y')
         },
         preparse: function (string) {
-            return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+            return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                 return numberMap[match];
             }).replace(/،/g, ',');
         },
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ar;
+
+}));
\ No newline at end of file
index 649d9f2..5400ed4 100644 (file)
@@ -1,56 +1,50 @@
-// moment.js locale configuration
-// locale : azerbaijani (az)
-// author : topchiyev : https://github.com/topchiyev
+//! moment.js locale configuration
+//! locale : Azerbaijani [az]
+//! author : topchiyev : https://github.com/topchiyev
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var suffixes = {
         1: '-inci',
         5: '-inci',
         8: '-inci',
         70: '-inci',
         80: '-inci',
-
         2: '-nci',
         7: '-nci',
         20: '-nci',
         50: '-nci',
-
         3: '-üncü',
         4: '-üncü',
         100: '-üncü',
-
         6: '-ncı',
-
         9: '-uncu',
         10: '-uncu',
         30: '-uncu',
-
         60: '-ıncı',
         90: '-ıncı'
     };
-    return moment.defineLocale('az', {
+
+    var az = moment.defineLocale('az', {
         months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
         monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
         weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
         weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
         weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[bugün saat] LT',
             y : 'bir il',
             yy : '%d il'
         },
+        meridiemParse: /gecə|səhər|gündüz|axşam/,
+        isPM : function (input) {
+            return /^(gündüz|axşam)$/.test(input);
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'gecə';
@@ -94,7 +92,6 @@
             var a = number % 10,
                 b = number % 100 - a,
                 c = number >= 100 ? 100 : null;
-
             return number + (suffixes[a] || suffixes[b] || suffixes[c]);
         },
         week : {
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return az;
+
+}));
\ No newline at end of file
index 67ae899..a76157c 100644 (file)
@@ -1,25 +1,21 @@
-// moment.js locale configuration
-// locale : belarusian (be)
-// author : Dmitry Demidov : https://github.com/demidov91
-// author: Praleska: http://praleska.pro/
-// Author : Menelion Elensúle : https://github.com/Oire
+//! moment.js locale configuration
+//! locale : Belarusian [be]
+//! author : Dmitry Demidov : https://github.com/demidov91
+//! author: Praleska: http://praleska.pro/
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(word, num) {
         var forms = word.split('_');
         return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
             'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
         }
     }
 
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
-            'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
-            'accusative': 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_')
+    var be = moment.defineLocale('be', {
+        months : {
+            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+            standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_')
         },
-
-        nounCase = (/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('be', {
-        months : monthsCaseReplace,
         monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
-        weekdays : weekdaysCaseReplace,
+        weekdays : {
+            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+            standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
+            isFormat: /\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/
+        },
         weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
         weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY г.',
-            LLL : 'D MMMM YYYY г., LT',
-            LLLL : 'dddd, D MMMM YYYY г., LT'
+            LLL : 'D MMMM YYYY г., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY г., HH:mm'
         },
         calendar : {
             sameDay: '[Сёння ў] LT',
             },
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return '[У мінулую] dddd [ў] LT';
-                case 1:
-                case 2:
-                case 4:
-                    return '[У мінулы] dddd [ў] LT';
+                    case 0:
+                    case 3:
+                    case 5:
+                    case 6:
+                        return '[У мінулую] dddd [ў] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                        return '[У мінулы] dddd [ў] LT';
                 }
             },
             sameElse: 'L'
             y : 'год',
             yy : relativeTimeWithPlural
         },
-
-
+        meridiemParse: /ночы|раніцы|дня|вечара/,
+        isPM : function (input) {
+            return /^(дня|вечара)$/.test(input);
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'ночы';
                 return 'вечара';
             }
         },
-
         ordinalParse: /\d{1,2}-(і|ы|га)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
-            case 'D':
-                return number + '-га';
-            default:
-                return number;
+                case 'M':
+                case 'd':
+                case 'DDD':
+                case 'w':
+                case 'W':
+                    return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
+                case 'D':
+                    return number + '-га';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return be;
+
+}));
\ No newline at end of file
index fe610ec..deedab8 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : bulgarian (bg)
-// author : Krasen Borisov : https://github.com/kraz
+//! moment.js locale configuration
+//! locale : Bulgarian [bg]
+//! author : Krasen Borisov : https://github.com/kraz
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('bg', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var bg = moment.defineLocale('bg', {
         months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
         monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
         weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
         weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'D.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd, D MMMM YYYY H:mm'
         },
         calendar : {
             sameDay : '[Днес в] LT',
             lastDay : '[Вчера в] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[В изминалата] dddd [в] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[В изминалия] dddd [в] LT';
+                    case 0:
+                    case 3:
+                    case 6:
+                        return '[В изминалата] dddd [в] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[В изминалия] dddd [в] LT';
                 }
             },
             sameElse : 'L'
@@ -87,4 +84,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bg;
+
+}));
\ No newline at end of file
index 59d26ba..1d49751 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Bengali (bn)
-// author : Kaushik Gandhi : https://github.com/kaushikgandhi
+//! moment.js locale configuration
+//! locale : Bengali [bn]
+//! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '১',
         '2': '২',
         '০': '0'
     };
 
-    return moment.defineLocale('bn', {
-        months : 'à¦\9cানà§\81à§\9fারà§\80_ফà§\87বà§\81à§\9fারà§\80_মারà§\8dà¦\9a_à¦\8fপà§\8dরিল_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81লাà¦\87_à¦\85à¦\97াস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
-        monthsShort : 'à¦\9cানà§\81_ফà§\87ব_মারà§\8dà¦\9a_à¦\8fপর_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81ল_à¦\85à¦\97_সà§\87পà§\8dà¦\9f_à¦\85à¦\95à§\8dà¦\9fà§\8b_নভ_ডিসà§\87মà§\8d'.split('_'),
-        weekdays : 'রবিবার_সà§\8bমবার_মà¦\99à§\8dà¦\97লবার_বà§\81ধবার_বà§\83হসà§\8dপতà§\8dতিবার_শà§\81à¦\95à§\8dরà§\81বার_শনিবার'.split('_'),
-        weekdaysShort : 'রবি_সà§\8bম_মà¦\99à§\8dà¦\97ল_বà§\81ধ_বà§\83হসà§\8dপতà§\8dতি_শà§\81à¦\95à§\8dরà§\81_শনি'.split('_'),
-        weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split('_'),
+    var bn = moment.defineLocale('bn', {
+        months : 'à¦\9cানà§\81à§\9fারà§\80_ফà§\87বà§\8dরà§\81à§\9fারি_মারà§\8dà¦\9a_à¦\8fপà§\8dরিল_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81লাà¦\87_à¦\86à¦\97স্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+        monthsShort : 'à¦\9cানà§\81_ফà§\87ব_মারà§\8dà¦\9a_à¦\8fপà§\8dর_মà§\87_à¦\9cà§\81ন_à¦\9cà§\81ল_à¦\86à¦\97_সà§\87পà§\8dà¦\9f_à¦\85à¦\95à§\8dà¦\9fà§\8b_নভà§\87_ডিসà§\87'.split('_'),
+        weekdays : 'রবিবার_সà§\8bমবার_মà¦\99à§\8dà¦\97লবার_বà§\81ধবার_বà§\83হসà§\8dপতিবার_শà§\81à¦\95à§\8dরবার_শনিবার'.split('_'),
+        weekdaysShort : 'রবি_সà§\8bম_মà¦\99à§\8dà¦\97ল_বà§\81ধ_বà§\83হসà§\8dপতি_শà§\81à¦\95à§\8dর_শনি'.split('_'),
+        weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
         longDateFormat : {
             LT : 'A h:mm সময়',
             LTS : 'A h:mm:ss সময়',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm সময়',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm সময়'
         },
         calendar : {
             sameDay : '[আজ] LT',
@@ -63,7 +60,7 @@
         relativeTime : {
             future : '%s পরে',
             past : '%s আগে',
-            s : 'à¦\95à¦\8fক সেকেন্ড',
+            s : 'à¦\95à§\9fà§\87ক সেকেন্ড',
             m : 'এক মিনিট',
             mm : '%d মিনিট',
             h : 'এক ঘন্টা',
                 return symbolMap[match];
             });
         },
-        //Bengali is a vast language its spoken
-        //in different forms in various parts of the world.
-        //I have just generalized with most common one used
+        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if ((meridiem === 'রাত' && hour >= 4) ||
+                    (meridiem === 'দুপুর' && hour < 5) ||
+                    meridiem === 'বিকাল') {
+                return hour + 12;
+            } else {
+                return hour;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'রাত';
             } else if (hour < 10) {
-                return 'à¦কাল';
+                return 'সকাল';
             } else if (hour < 17) {
                 return 'দুপুর';
             } else if (hour < 20) {
-                return 'বিà¦\95à§\87ল';
+                return 'বিà¦\95াল';
             } else {
                 return 'রাত';
             }
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bn;
+
+}));
\ No newline at end of file
index 346fbdf..3f6fe19 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : tibetan (bo)
-// author : Thupten N. Chakrishar : https://github.com/vajradog
+//! moment.js locale configuration
+//! locale : Tibetan [bo]
+//! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '༡',
         '2': '༢',
@@ -38,7 +35,7 @@
         '༠': '0'
     };
 
-    return moment.defineLocale('bo', {
+    var bo = moment.defineLocale('bo', {
         months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
         monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
         weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
         weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
         longDateFormat : {
             LT : 'A h:mm',
-            LTS : 'LT:ss',
+            LTS : 'A h:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm'
         },
         calendar : {
             sameDay : '[དི་རིང] LT',
                 return symbolMap[match];
             });
         },
+        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if ((meridiem === 'མཚན་མོ' && hour >= 4) ||
+                    (meridiem === 'ཉིན་གུང' && hour < 5) ||
+                    meridiem === 'དགོང་དག') {
+                return hour + 12;
+            } else {
+                return hour;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'མཚན་མོ';
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bo;
+
+}));
\ No newline at end of file
index 575d644..ca290f3 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : breton (br)
-// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+//! moment.js locale configuration
+//! locale : Breton [br]
+//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function relativeTimeWithMutation(number, withoutSuffix, key) {
         var format = {
             'mm': 'munutenn',
         };
         return number + ' ' + mutation(format[key], number);
     }
-
     function specialMutationForYears(number) {
         switch (lastNumber(number)) {
-        case 1:
-        case 3:
-        case 4:
-        case 5:
-        case 9:
-            return number + ' bloaz';
-        default:
-            return number + ' vloaz';
+            case 1:
+            case 3:
+            case 4:
+            case 5:
+            case 9:
+                return number + ' bloaz';
+            default:
+                return number + ' vloaz';
         }
     }
-
     function lastNumber(number) {
         if (number > 9) {
             return lastNumber(number % 10);
         }
         return number;
     }
-
     function mutation(text, number) {
         if (number === 2) {
             return softMutation(text);
         }
         return text;
     }
-
     function softMutation(text) {
         var mutationTable = {
             'm': 'v',
         return mutationTable[text.charAt(0)] + text.substring(1);
     }
 
-    return moment.defineLocale('br', {
+    var br = moment.defineLocale('br', {
         months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
         monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
         weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
         weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
         weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'h[e]mm A',
             LTS : 'h[e]mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D [a viz] MMMM YYYY',
-            LLL : 'D [a viz] MMMM YYYY LT',
-            LLLL : 'dddd, D [a viz] MMMM YYYY LT'
+            LLL : 'D [a viz] MMMM YYYY h[e]mm A',
+            LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A'
         },
         calendar : {
             sameDay : '[Hiziv da] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return br;
+
+}));
\ No newline at end of file
index 415b596..ddd346c 100644 (file)
-// moment.js locale configuration
-// locale : bosnian (bs)
-// author : Nedim Cholich : https://github.com/frontyard
-// based on (hr) translation by Bojan Marković
+//! moment.js locale configuration
+//! locale : Bosnian [bs]
+//! author : Nedim Cholich : https://github.com/frontyard
+//! based on (hr) translation by Bojan Marković
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function translate(number, withoutSuffix, key) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
+            case 'm':
+                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+            case 'mm':
+                if (number === 1) {
+                    result += 'minuta';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'minute';
+                } else {
+                    result += 'minuta';
+                }
+                return result;
+            case 'h':
+                return withoutSuffix ? 'jedan sat' : 'jednog sata';
+            case 'hh':
+                if (number === 1) {
+                    result += 'sat';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'sata';
+                } else {
+                    result += 'sati';
+                }
+                return result;
+            case 'dd':
+                if (number === 1) {
+                    result += 'dan';
+                } else {
+                    result += 'dana';
+                }
+                return result;
+            case 'MM':
+                if (number === 1) {
+                    result += 'mjesec';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'mjeseca';
+                } else {
+                    result += 'mjeseci';
+                }
+                return result;
+            case 'yy':
+                if (number === 1) {
+                    result += 'godina';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'godine';
+                } else {
+                    result += 'godina';
+                }
+                return result;
         }
     }
 
-    return moment.defineLocale('bs', {
+    var bs = moment.defineLocale('bs', {
         months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
         monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
         weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
         weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[danas u] LT',
             nextDay  : '[sutra u] LT',
-
             nextWeek : function () {
                 switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
+                    case 0:
+                        return '[u] [nedjelju] [u] LT';
+                    case 3:
+                        return '[u] [srijedu] [u] LT';
+                    case 6:
+                        return '[u] [subotu] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[u] dddd [u] LT';
                 }
             },
             lastDay  : '[jučer u] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
+                    case 0:
+                    case 3:
+                        return '[prošlu] dddd [u] LT';
+                    case 6:
+                        return '[prošle] [subote] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[prošli] dddd [u] LT';
                 }
             },
             sameElse : 'L'
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return bs;
+
+}));
\ No newline at end of file
index 6c82db0..7882800 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : catalan (ca)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
+//! moment.js locale configuration
+//! locale : Catalan [ca]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ca', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ca = moment.defineLocale('ca', {
         months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
         monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
         weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
         weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd D MMMM YYYY H:mm'
         },
         calendar : {
             sameDay : function () {
@@ -76,4 +75,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return ca;
+
+}));
\ No newline at end of file
index bf3e60a..129e936 100644 (file)
@@ -1,79 +1,74 @@
-// moment.js locale configuration
-// locale : czech (cs)
-// author : petrbela : https://github.com/petrbela
+//! moment.js locale configuration
+//! locale : Czech [cs]
+//! author : petrbela : https://github.com/petrbela
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
         monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
-
     function plural(n) {
         return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minuty' : 'minut');
-            } else {
-                return result + 'minutami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodin');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dny' : 'dní');
-            } else {
-                return result + 'dny';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'měsíce' : 'měsíců');
-            } else {
-                return result + 'měsíci';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'let');
-            } else {
-                return result + 'lety';
-            }
-            break;
+            case 's':  // a few seconds / in a few seconds / a few seconds ago
+                return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
+            case 'm':  // a minute / in a minute / a minute ago
+                return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'minuty' : 'minut');
+                } else {
+                    return result + 'minutami';
+                }
+                break;
+            case 'h':  // an hour / in an hour / an hour ago
+                return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+            case 'hh': // 9 hours / in 9 hours / 9 hours ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'hodiny' : 'hodin');
+                } else {
+                    return result + 'hodinami';
+                }
+                break;
+            case 'd':  // a day / in a day / a day ago
+                return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+            case 'dd': // 9 days / in 9 days / 9 days ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'dny' : 'dní');
+                } else {
+                    return result + 'dny';
+                }
+                break;
+            case 'M':  // a month / in a month / a month ago
+                return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+            case 'MM': // 9 months / in 9 months / 9 months ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'měsíce' : 'měsíců');
+                } else {
+                    return result + 'měsíci';
+                }
+                break;
+            case 'y':  // a year / in a year / a year ago
+                return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+            case 'yy': // 9 years / in 9 years / 9 years ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'roky' : 'let');
+                } else {
+                    return result + 'lety';
+                }
+                break;
         }
     }
 
-    return moment.defineLocale('cs', {
+    var cs = moment.defineLocale('cs', {
         months : months,
         monthsShort : monthsShort,
         monthsParse : (function (months, monthsShort) {
             }
             return _monthsParse;
         }(months, monthsShort)),
+        shortMonthsParse : (function (monthsShort) {
+            var i, _shortMonthsParse = [];
+            for (i = 0; i < 12; i++) {
+                _shortMonthsParse[i] = new RegExp('^' + monthsShort[i] + '$', 'i');
+            }
+            return _shortMonthsParse;
+        }(monthsShort)),
+        longMonthsParse : (function (months) {
+            var i, _longMonthsParse = [];
+            for (i = 0; i < 12; i++) {
+                _longMonthsParse[i] = new RegExp('^' + months[i] + '$', 'i');
+            }
+            return _longMonthsParse;
+        }(months)),
         weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
         weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
         weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
         longDateFormat : {
             LT: 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd D. MMMM YYYY H:mm',
+            l : 'D. M. YYYY'
         },
         calendar : {
             sameDay: '[dnes v] LT',
             nextDay: '[zítra v] LT',
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[v neděli v] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [v] LT';
-                case 3:
-                    return '[ve středu v] LT';
-                case 4:
-                    return '[ve čtvrtek v] LT';
-                case 5:
-                    return '[v pátek v] LT';
-                case 6:
-                    return '[v sobotu v] LT';
+                    case 0:
+                        return '[v neděli v] LT';
+                    case 1:
+                    case 2:
+                        return '[v] dddd [v] LT';
+                    case 3:
+                        return '[ve středu v] LT';
+                    case 4:
+                        return '[ve čtvrtek v] LT';
+                    case 5:
+                        return '[v pátek v] LT';
+                    case 6:
+                        return '[v sobotu v] LT';
                 }
             },
             lastDay: '[včera v] LT',
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[minulou neděli v] LT';
-                case 1:
-                case 2:
-                    return '[minulé] dddd [v] LT';
-                case 3:
-                    return '[minulou středu v] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [v] LT';
-                case 6:
-                    return '[minulou sobotu v] LT';
+                    case 0:
+                        return '[minulou neděli v] LT';
+                    case 1:
+                    case 2:
+                        return '[minulé] dddd [v] LT';
+                    case 3:
+                        return '[minulou středu v] LT';
+                    case 4:
+                    case 5:
+                        return '[minulý] dddd [v] LT';
+                    case 6:
+                        return '[minulou sobotu v] LT';
                 }
             },
             sameElse: 'L'
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return cs;
+
+}));
\ No newline at end of file
index 10d33a6..60bf213 100644 (file)
@@ -1,63 +1,63 @@
-// moment.js locale configuration
-// locale : chuvash (cv)
-// author : Anatoly Mironov : https://github.com/mirontoli
+//! moment.js locale configuration
+//! locale : Chuvash [cv]
+//! author : Anatoly Mironov : https://github.com/mirontoli
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('cv', {
-        months : 'кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'),
-        monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'),
-        weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун'.split('_'),
-        weekdaysShort : 'выр_тун_ытл_юн_кĕç_эрн_шăм'.split('_'),
-        weekdaysMin : 'вр_тн_ыт_юн_кç_эр_шм'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var cv = moment.defineLocale('cv', {
+        months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+        monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+        weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+        weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+        weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD-MM-YYYY',
-            LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]',
-            LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT',
-            LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT'
+            LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+            LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+            LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
         },
         calendar : {
             sameDay: '[Паян] LT [сехетре]',
             nextDay: '[Ыран] LT [сехетре]',
-            lastDay: '[Ĕнер] LT [сехетре]',
-            nextWeek: '[Çитес] dddd LT [сехетре]',
-            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
+            lastDay: '[Ӗнер] LT [сехетре]',
+            nextWeek: '[Ҫитес] dddd LT [сехетре]',
+            lastWeek: '[Иртнӗ] dddd LT [сехетре]',
             sameElse: 'L'
         },
         relativeTime : {
             future : function (output) {
-                var affix = /сехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран';
+                var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
                 return output + affix;
             },
             past : '%s каялла',
-            s : 'пĕр-ик çеккунт',
-            m : 'пĕр минут',
+            s : 'пӗр-ик ҫеккунт',
+            m : 'пӗр минут',
             mm : '%d минут',
-            h : 'пĕр сехет',
+            h : 'пӗр сехет',
             hh : '%d сехет',
-            d : 'пĕр кун',
+            d : 'пӗр кун',
             dd : '%d кун',
-            M : 'пĕр уйăх',
-            MM : '%d уйăх',
-            y : 'пĕр çул',
-            yy : '%d çул'
+            M : 'пӗр уйӑх',
+            MM : '%d уйӑх',
+            y : 'пӗр ҫул',
+            yy : '%d ҫул'
         },
-        ordinalParse: /\d{1,2}-мĕш/,
-        ordinal : '%d-мĕш',
+        ordinalParse: /\d{1,2}-мӗш/,
+        ordinal : '%d-мӗш',
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return cv;
+
+}));
\ No newline at end of file
index a14ed7d..9352567 100644 (file)
@@ -1,32 +1,31 @@
-// moment.js locale configuration
-// locale : Welsh (cy)
-// author : Robert Allen
+//! moment.js locale configuration
+//! locale : Welsh [cy]
+//! author : Robert Allen : https://github.com/robgallen
+//! author : https://github.com/ryangreaves
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('cy', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var cy = moment.defineLocale('cy', {
         months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
         monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
         weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
         weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
         weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+        weekdaysParseExact : true,
         // time formats are the same as en-gb
         longDateFormat: {
             LT: 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
-            LLL: 'D MMMM YYYY LT',
-            LLLL: 'dddd, D MMMM YYYY LT'
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd, D MMMM YYYY HH:mm'
         },
         calendar: {
             sameDay: '[Heddiw am] LT',
@@ -60,7 +59,6 @@
                     '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
                     'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
                 ];
-
             if (b > 20) {
                 if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                     output = 'fed'; // not 30ain, 70ain or 90ain
@@ -70,7 +68,6 @@
             } else if (b > 0) {
                 output = lookup[b];
             }
-
             return number + output;
         },
         week : {
@@ -78,4 +75,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return cy;
+
+}));
\ No newline at end of file
index 228ca02..d5cbbdb 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : danish (da)
-// author : Ulrik Nielsen : https://github.com/mrbase
+//! moment.js locale configuration
+//! locale : Danish [da]
+//! author : Ulrik Nielsen : https://github.com/mrbase
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('da', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var da = moment.defineLocale('da', {
         months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
         weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
         weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd [d.] D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY HH:mm',
+            LLLL : 'dddd [d.] D. MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[I dag kl.] LT',
@@ -57,4 +54,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return da;
+
+}));
\ No newline at end of file
index af6e61c..d1fd398 100644 (file)
@@ -1,20 +1,18 @@
-// moment.js locale configuration
-// locale : austrian german (de-at)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-// author : Martin Groller : https://github.com/MadMG
+//! moment.js locale configuration
+//! locale : German (Austria) [de-at]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Martin Groller : https://github.com/MadMG
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             'm': ['eine Minute', 'einer Minute'],
         return withoutSuffix ? format[key][0] : format[key][1];
     }
 
-    return moment.defineLocale('de-at', {
+    var de_at = moment.defineLocale('de-at', {
         months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
         monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
         weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
         weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT: 'HH:mm',
             LTS: 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY HH:mm',
+            LLLL : 'dddd, D. MMMM YYYY HH:mm'
         },
         calendar : {
-            sameDay: '[Heute um] LT [Uhr]',
+            sameDay: '[heute um] LT [Uhr]',
             sameElse: 'L',
-            nextDay: '[Morgen um] LT [Uhr]',
+            nextDay: '[morgen um] LT [Uhr]',
             nextWeek: 'dddd [um] LT [Uhr]',
-            lastDay: '[Gestern um] LT [Uhr]',
+            lastDay: '[gestern um] LT [Uhr]',
             lastWeek: '[letzten] dddd [um] LT [Uhr]'
         },
         relativeTime : {
@@ -73,4 +73,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return de_at;
+
+}));
\ No newline at end of file
index 1b50f0f..203dac9 100644 (file)
@@ -1,19 +1,17 @@
-// moment.js locale configuration
-// locale : german (de)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
+//! moment.js locale configuration
+//! locale : German [de]
+//! author : lluchs : https://github.com/lluchs
+//! author: Menelion Elensúle: https://github.com/Oire
+//! author : Mikolaj Dadela : https://github.com/mik01aj
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             'm': ['eine Minute', 'einer Minute'],
         return withoutSuffix ? format[key][0] : format[key][1];
     }
 
-    return moment.defineLocale('de', {
+    var de = moment.defineLocale('de', {
         months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
         monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
         weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
         weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT: 'HH:mm',
             LTS: 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY HH:mm',
+            LLLL : 'dddd, D. MMMM YYYY HH:mm'
         },
         calendar : {
-            sameDay: '[Heute um] LT [Uhr]',
+            sameDay: '[heute um] LT [Uhr]',
             sameElse: 'L',
-            nextDay: '[Morgen um] LT [Uhr]',
+            nextDay: '[morgen um] LT [Uhr]',
             nextWeek: 'dddd [um] LT [Uhr]',
-            lastDay: '[Gestern um] LT [Uhr]',
+            lastDay: '[gestern um] LT [Uhr]',
             lastWeek: '[letzten] dddd [um] LT [Uhr]'
         },
         relativeTime : {
@@ -72,4 +72,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return de;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/dv.js b/resources/lib/moment/locale/dv.js
new file mode 100644 (file)
index 0000000..911b89d
--- /dev/null
@@ -0,0 +1,99 @@
+//! moment.js locale configuration
+//! locale : Maldivian [dv]
+//! author : Jawish Hameed : https://github.com/jawish
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var months = [
+        'ޖެނުއަރީ',
+        'ފެބްރުއަރީ',
+        'މާރިޗު',
+        'އޭޕްރީލު',
+        'މޭ',
+        'ޖޫން',
+        'ޖުލައި',
+        'އޯގަސްޓު',
+        'ސެޕްޓެމްބަރު',
+        'އޮކްޓޯބަރު',
+        'ނޮވެމްބަރު',
+        'ޑިސެމްބަރު'
+    ], weekdays = [
+        'އާދިއްތަ',
+        'ހޯމަ',
+        'އަންގާރަ',
+        'ބުދަ',
+        'ބުރާސްފަތި',
+        'ހުކުރު',
+        'ހޮނިހިރު'
+    ];
+
+    var dv = moment.defineLocale('dv', {
+        months : months,
+        monthsShort : months,
+        weekdays : weekdays,
+        weekdaysShort : weekdays,
+        weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
+        longDateFormat : {
+
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'D/M/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /މކ|މފ/,
+        isPM : function (input) {
+            return 'މފ' === input;
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'މކ';
+            } else {
+                return 'މފ';
+            }
+        },
+        calendar : {
+            sameDay : '[މިއަދު] LT',
+            nextDay : '[މާދަމާ] LT',
+            nextWeek : 'dddd LT',
+            lastDay : '[އިއްޔެ] LT',
+            lastWeek : '[ފާއިތުވި] dddd LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'ތެރޭގައި %s',
+            past : 'ކުރިން %s',
+            s : 'ސިކުންތުކޮޅެއް',
+            m : 'މިނިޓެއް',
+            mm : 'މިނިޓު %d',
+            h : 'ގަޑިއިރެއް',
+            hh : 'ގަޑިއިރު %d',
+            d : 'ދުވަހެއް',
+            dd : 'ދުވަސް %d',
+            M : 'މަހެއް',
+            MM : 'މަސް %d',
+            y : 'އަހަރެއް',
+            yy : 'އަހަރު %d'
+        },
+        preparse: function (string) {
+            return string.replace(/،/g, ',');
+        },
+        postformat: function (string) {
+            return string.replace(/,/g, '،');
+        },
+        week : {
+            dow : 7,  // Sunday is the first day of the week.
+            doy : 12  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return dv;
+
+}));
\ No newline at end of file
index a0e1695..588cb23 100644 (file)
@@ -1,19 +1,20 @@
-// moment.js locale configuration
-// locale : modern greek (el)
-// author : Aggelos Karalias : https://github.com/mehiel
+//! moment.js locale configuration
+//! locale : Greek [el]
+//! author : Aggelos Karalias : https://github.com/mehiel
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('el', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+    function isFunction(input) {
+        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+    }
+
+
+    var el = moment.defineLocale('el', {
         monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
         monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
         months : function (momentToFormat, format) {
@@ -43,8 +44,8 @@
             LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
         },
         calendarEl : {
             sameDay : '[Σήμερα {}] LT',
         calendar : function (key, mom) {
             var output = this._calendarEl[key],
                 hours = mom && mom.hours();
-
-            if (typeof output === 'function') {
+            if (isFunction(output)) {
                 output = output.apply(mom);
             }
-
             return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
         },
         relativeTime : {
@@ -93,4 +92,7 @@
             doy : 4  // The week that contains Jan 4st is the first week of the year.
         }
     });
-}));
+
+    return el;
+
+}));
\ No newline at end of file
index 9d7b537..4a3d95c 100644 (file)
@@ -1,18 +1,16 @@
-// moment.js locale configuration
-// locale : australian english (en-au)
+//! moment.js locale configuration
+//! locale : English (Australia) [en-au]
+//! author : Jared Morse : https://github.com/jarcoal
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('en-au', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var en_au = moment.defineLocale('en-au', {
         months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
         weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -23,8 +21,8 @@
             LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
         },
         calendar : {
             sameDay : '[Today at] LT',
@@ -63,4 +61,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return en_au;
+
+}));
\ No newline at end of file
index 45d3569..9ac521f 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : canadian english (en-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
+//! moment.js locale configuration
+//! locale : English (Canada) [en-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('en-ca', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var en_ca = moment.defineLocale('en-ca', {
         months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
         weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -23,9 +20,9 @@
             LT : 'h:mm A',
             LTS : 'h:mm:ss A',
             L : 'YYYY-MM-DD',
-            LL : 'D MMMM, YYYY',
-            LLL : 'D MMMM, YYYY LT',
-            LLLL : 'dddd, D MMMM, YYYY LT'
+            LL : 'MMMM D, YYYY',
+            LLL : 'MMMM D, YYYY h:mm A',
+            LLLL : 'dddd, MMMM D, YYYY h:mm A'
         },
         calendar : {
             sameDay : '[Today at] LT',
@@ -60,4 +57,7 @@
             return number + output;
         }
     });
-}));
+
+    return en_ca;
+
+}));
\ No newline at end of file
index 669ce5e..843d2e5 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : great britain english (en-gb)
-// author : Chris Gedrim : https://github.com/chrisgedrim
+//! moment.js locale configuration
+//! locale : English (United Kingdom) [en-gb]
+//! author : Chris Gedrim : https://github.com/chrisgedrim
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('en-gb', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var en_gb = moment.defineLocale('en-gb', {
         months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
         weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -24,8 +21,8 @@
             LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Today at] LT',
@@ -64,4 +61,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return en_gb;
+
+}));
\ No newline at end of file
index 7f8c504..5b21f82 100644 (file)
@@ -1,21 +1,18 @@
-// moment.js locale configuration
-// locale : esperanto (eo)
-// author : Colin Dean : https://github.com/colindean
-// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
-//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+//! moment.js locale configuration
+//! locale : Esperanto [eo]
+//! author : Colin Dean : https://github.com/colindean
+//! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+//!          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('eo', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var eo = moment.defineLocale('eo', {
         months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
         weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
         weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'D[-an de] MMMM, YYYY',
-            LLL : 'D[-an de] MMMM, YYYY LT',
-            LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT'
+            LLL : 'D[-an de] MMMM, YYYY HH:mm',
+            LLLL : 'dddd, [la] D[-an de] MMMM, YYYY HH:mm'
+        },
+        meridiemParse: /[ap]\.t\.m/i,
+        isPM: function (input) {
+            return input.charAt(0).toLowerCase() === 'p';
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours > 11) {
@@ -66,4 +67,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return eo;
+
+}));
\ No newline at end of file
index 5d352a4..cd81905 100644 (file)
@@ -1,22 +1,19 @@
-// moment.js locale configuration
-// locale : spanish (es)
-// author : Julio Napurí : https://github.com/julionc
+//! moment.js locale configuration
+//! locale : Spanish [es]
+//! author : Julio Napurí : https://github.com/julionc
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
         monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
 
-    return moment.defineLocale('es', {
+    var es = moment.defineLocale('es', {
         months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
         monthsShort : function (m, format) {
             if (/-MMM-/.test(format)) {
                 return monthsShortDot[m.month()];
             }
         },
+        monthsParseExact : true,
         weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
         weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
-        weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'),
+        weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
-            LLL : 'D [de] MMMM [de] YYYY LT',
-            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
+            LLL : 'D [de] MMMM [de] YYYY H:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
         },
         calendar : {
             sameDay : function () {
@@ -76,4 +75,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return es;
+
+}));
\ No newline at end of file
index fec168c..97fd945 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : estonian (et)
-// author : Henry Kehlmann : https://github.com/madhenry
-// improvements : Illimar Tambek : https://github.com/ragulka
+//! moment.js locale configuration
+//! locale : Estonian [et]
+//! author : Henry Kehlmann : https://github.com/madhenry
+//! improvements : Illimar Tambek : https://github.com/ragulka
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
@@ -33,7 +30,7 @@
         return isFuture ? format[key][0] : format[key][1];
     }
 
-    return moment.defineLocale('et', {
+    var et = moment.defineLocale('et', {
         months        : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
         monthsShort   : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
         weekdays      : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
         weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),
         longDateFormat : {
             LT   : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L    : 'DD.MM.YYYY',
             LL   : 'D. MMMM YYYY',
-            LLL  : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL  : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[Täna,] LT',
@@ -77,4 +74,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return et;
+
+}));
\ No newline at end of file
index 1401346..15d7dd3 100644 (file)
@@ -1,35 +1,34 @@
-// moment.js locale configuration
-// locale : euskara (eu)
-// author : Eneko Illarramendi : https://github.com/eillarra
+//! moment.js locale configuration
+//! locale : Basque [eu]
+//! author : Eneko Illarramendi : https://github.com/eillarra
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('eu', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var eu = moment.defineLocale('eu', {
         months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
         monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
         weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
         weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'YYYY[ko] MMMM[ren] D[a]',
-            LLL : 'YYYY[ko] MMMM[ren] D[a] LT',
-            LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT',
+            LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm',
+            LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
             l : 'YYYY-M-D',
             ll : 'YYYY[ko] MMM D[a]',
-            lll : 'YYYY[ko] MMM D[a] LT',
-            llll : 'ddd, YYYY[ko] MMM D[a] LT'
+            lll : 'YYYY[ko] MMM D[a] HH:mm',
+            llll : 'ddd, YYYY[ko] MMM D[a] HH:mm'
         },
         calendar : {
             sameDay : '[gaur] LT[etan]',
@@ -61,4 +60,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return eu;
+
+}));
\ No newline at end of file
index 0205adf..535174b 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Persian (fa)
-// author : Ebrahim Byagowi : https://github.com/ebraminio
+//! moment.js locale configuration
+//! locale : Persian [fa]
+//! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '۱',
         '2': '۲',
         '۰': '0'
     };
 
-    return moment.defineLocale('fa', {
+    var fa = moment.defineLocale('fa', {
         months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
         monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
         weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
         weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
         weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /قبل از ظهر|بعد از ظهر/,
+        isPM: function (input) {
+            return /بعد از ظهر/.test(input);
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
             doy : 12 // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return fa;
+
+}));
\ No newline at end of file
index 66cd1c0..ee93848 100644 (file)
@@ -1,64 +1,59 @@
-// moment.js locale configuration
-// locale : finnish (fi)
-// author : Tarmo Aidantausta : https://github.com/bleadof
+//! moment.js locale configuration
+//! locale : Finnish [fi]
+//! author : Tarmo Aidantausta : https://github.com/bleadof
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
         numbersFuture = [
             'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
             numbersPast[7], numbersPast[8], numbersPast[9]
         ];
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = '';
         switch (key) {
-        case 's':
-            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
-        case 'm':
-            return isFuture ? 'minuutin' : 'minuutti';
-        case 'mm':
-            result = isFuture ? 'minuutin' : 'minuuttia';
-            break;
-        case 'h':
-            return isFuture ? 'tunnin' : 'tunti';
-        case 'hh':
-            result = isFuture ? 'tunnin' : 'tuntia';
-            break;
-        case 'd':
-            return isFuture ? 'päivän' : 'päivä';
-        case 'dd':
-            result = isFuture ? 'päivän' : 'päivää';
-            break;
-        case 'M':
-            return isFuture ? 'kuukauden' : 'kuukausi';
-        case 'MM':
-            result = isFuture ? 'kuukauden' : 'kuukautta';
-            break;
-        case 'y':
-            return isFuture ? 'vuoden' : 'vuosi';
-        case 'yy':
-            result = isFuture ? 'vuoden' : 'vuotta';
-            break;
+            case 's':
+                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+            case 'm':
+                return isFuture ? 'minuutin' : 'minuutti';
+            case 'mm':
+                result = isFuture ? 'minuutin' : 'minuuttia';
+                break;
+            case 'h':
+                return isFuture ? 'tunnin' : 'tunti';
+            case 'hh':
+                result = isFuture ? 'tunnin' : 'tuntia';
+                break;
+            case 'd':
+                return isFuture ? 'päivän' : 'päivä';
+            case 'dd':
+                result = isFuture ? 'päivän' : 'päivää';
+                break;
+            case 'M':
+                return isFuture ? 'kuukauden' : 'kuukausi';
+            case 'MM':
+                result = isFuture ? 'kuukauden' : 'kuukautta';
+                break;
+            case 'y':
+                return isFuture ? 'vuoden' : 'vuosi';
+            case 'yy':
+                result = isFuture ? 'vuoden' : 'vuotta';
+                break;
         }
         result = verbalNumber(number, isFuture) + ' ' + result;
         return result;
     }
-
     function verbalNumber(number, isFuture) {
         return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
     }
 
-    return moment.defineLocale('fi', {
+    var fi = moment.defineLocale('fi', {
         months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
         monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
         weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
             LTS : 'HH.mm.ss',
             L : 'DD.MM.YYYY',
             LL : 'Do MMMM[ta] YYYY',
-            LLL : 'Do MMMM[ta] YYYY, [klo] LT',
-            LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT',
+            LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm',
+            LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
             l : 'D.M.YYYY',
             ll : 'Do MMM YYYY',
-            lll : 'Do MMM YYYY, [klo] LT',
-            llll : 'ddd, Do MMM YYYY, [klo] LT'
+            lll : 'Do MMM YYYY, [klo] HH.mm',
+            llll : 'ddd, Do MMM YYYY, [klo] HH.mm'
         },
         calendar : {
             sameDay : '[tänään] [klo] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return fi;
+
+}));
\ No newline at end of file
index 710abf7..93567e4 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : faroese (fo)
-// author : Ragnar Johannesen : https://github.com/ragnar123
+//! moment.js locale configuration
+//! locale : Faroese [fo]
+//! author : Ragnar Johannesen : https://github.com/ragnar123
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('fo', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var fo = moment.defineLocale('fo', {
         months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
         monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
         weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
         weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D. MMMM, YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D. MMMM, YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Í dag kl.] LT',
@@ -57,4 +54,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return fo;
+
+}));
\ No newline at end of file
index 2bbeb80..6ec487b 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : canadian french (fr-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
+//! moment.js locale configuration
+//! locale : French (Canada) [fr-ca]
+//! author : Jonathan Abourbih : https://github.com/jonbca
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('fr-ca', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var fr_ca = moment.defineLocale('fr-ca', {
         months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
         monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
         weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
         weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Aujourd\'hui à] LT',
             y : 'un an',
             yy : '%d ans'
         },
-        ordinalParse: /\d{1,2}(er|)/,
+        ordinalParse: /\d{1,2}(er|e)/,
         ordinal : function (number) {
-            return number + (number === 1 ? 'er' : '');
+            return number + (number === 1 ? 'er' : 'e');
         }
     });
-}));
+
+    return fr_ca;
+
+}));
\ No newline at end of file
index 29a3239..90662e2 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : french (fr)
-// author : John Fischer : https://github.com/jfroffice
+//! moment.js locale configuration
+//! locale : French [fr]
+//! author : John Fischer : https://github.com/jfroffice
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('fr', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var fr = moment.defineLocale('fr', {
         months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
         monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
         weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
         weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Aujourd\'hui à] LT',
@@ -59,4 +58,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return fr;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/fy.js b/resources/lib/moment/locale/fy.js
new file mode 100644 (file)
index 0000000..dc04ade
--- /dev/null
@@ -0,0 +1,73 @@
+//! moment.js locale configuration
+//! locale : Frisian [fy]
+//! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
+        monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+    var fy = moment.defineLocale('fy', {
+        months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+        monthsShort : function (m, format) {
+            if (/-MMM-/.test(format)) {
+                return monthsShortWithoutDots[m.month()];
+            } else {
+                return monthsShortWithDots[m.month()];
+            }
+        },
+        monthsParseExact : true,
+        weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+        weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+        weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD-MM-YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay: '[hjoed om] LT',
+            nextDay: '[moarn om] LT',
+            nextWeek: 'dddd [om] LT',
+            lastDay: '[juster om] LT',
+            lastWeek: '[ôfrûne] dddd [om] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : 'oer %s',
+            past : '%s lyn',
+            s : 'in pear sekonden',
+            m : 'ien minút',
+            mm : '%d minuten',
+            h : 'ien oere',
+            hh : '%d oeren',
+            d : 'ien dei',
+            dd : '%d dagen',
+            M : 'ien moanne',
+            MM : '%d moannen',
+            y : 'ien jier',
+            yy : '%d jierren'
+        },
+        ordinalParse: /\d{1,2}(ste|de)/,
+        ordinal : function (number) {
+            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return fy;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/gd.js b/resources/lib/moment/locale/gd.js
new file mode 100644 (file)
index 0000000..901cd59
--- /dev/null
@@ -0,0 +1,76 @@
+//! moment.js locale configuration
+//! locale : Scottish Gaelic [gd]
+//! author : Jon Ashdown : https://github.com/jonashdown
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var months = [
+        'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'
+    ];
+
+    var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'];
+
+    var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'];
+
+    var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'];
+
+    var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];
+
+    var gd = moment.defineLocale('gd', {
+        months : months,
+        monthsShort : monthsShort,
+        monthsParseExact : true,
+        weekdays : weekdays,
+        weekdaysShort : weekdaysShort,
+        weekdaysMin : weekdaysMin,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[An-diugh aig] LT',
+            nextDay : '[A-màireach aig] LT',
+            nextWeek : 'dddd [aig] LT',
+            lastDay : '[An-dè aig] LT',
+            lastWeek : 'dddd [seo chaidh] [aig] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'ann an %s',
+            past : 'bho chionn %s',
+            s : 'beagan diogan',
+            m : 'mionaid',
+            mm : '%d mionaidean',
+            h : 'uair',
+            hh : '%d uairean',
+            d : 'latha',
+            dd : '%d latha',
+            M : 'mìos',
+            MM : '%d mìosan',
+            y : 'bliadhna',
+            yy : '%d bliadhna'
+        },
+        ordinalParse : /\d{1,2}(d|na|mh)/,
+        ordinal : function (number) {
+            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return gd;
+
+}));
\ No newline at end of file
index b939f8a..83291b6 100644 (file)
@@ -1,31 +1,30 @@
-// moment.js locale configuration
-// locale : galician (gl)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
+//! moment.js locale configuration
+//! locale : Galician [gl]
+//! author : Juan G. Hurtado : https://github.com/juanghurtado
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('gl', {
-        months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'),
-        monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'),
-        weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'),
-        weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'),
-        weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var gl = moment.defineLocale('gl', {
+        months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'),
+        monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'),
+        monthsParseExact: true,
+        weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
+        weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
+        weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD/MM/YYYY',
-            LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LL : 'D [de] MMMM [de] YYYY',
+            LLL : 'D [de] MMMM [de] YYYY H:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'
         },
         calendar : {
             sameDay : function () {
@@ -47,8 +46,8 @@
         },
         relativeTime : {
             future : function (str) {
-                if (str === 'uns segundos') {
-                    return 'nuns segundos';
+                if (str.indexOf('un') === 0) {
+                    return 'n' + str;
                 }
                 return 'en ' + str;
             },
         ordinal : '%dº',
         week : {
             dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return gl;
+
+}));
\ No newline at end of file
index 05b0209..6e55a7a 100644 (file)
@@ -1,21 +1,18 @@
-// moment.js locale configuration
-// locale : Hebrew (he)
-// author : Tomer Cohen : https://github.com/tomer
-// author : Moshe Simantov : https://github.com/DevelopmentIL
-// author : Tal Ater : https://github.com/TalAter
+//! moment.js locale configuration
+//! locale : Hebrew [he]
+//! author : Tomer Cohen : https://github.com/tomer
+//! author : Moshe Simantov : https://github.com/DevelopmentIL
+//! author : Tal Ater : https://github.com/TalAter
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('he', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var he = moment.defineLocale('he', {
         months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
         monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
         weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
         weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [ב]MMMM YYYY',
-            LLL : 'D [ב]MMMM YYYY LT',
-            LLLL : 'dddd, D [ב]MMMM YYYY LT',
+            LLL : 'D [ב]MMMM YYYY HH:mm',
+            LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
             l : 'D/M/YYYY',
             ll : 'D MMM YYYY',
-            lll : 'D MMM YYYY LT',
-            llll : 'ddd, D MMM YYYY LT'
+            lll : 'D MMM YYYY HH:mm',
+            llll : 'ddd, D MMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[היום ב־]LT',
             yy : function (number) {
                 if (number === 2) {
                     return 'שנתיים';
+                } else if (number % 10 === 0 && number !== 10) {
+                    return number + ' שנה';
                 }
                 return number + ' שנים';
             }
+        },
+        meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
+        isPM : function (input) {
+            return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 5) {
+                return 'לפנות בוקר';
+            } else if (hour < 10) {
+                return 'בבוקר';
+            } else if (hour < 12) {
+                return isLower ? 'לפנה"צ' : 'לפני הצהריים';
+            } else if (hour < 18) {
+                return isLower ? 'אחה"צ' : 'אחרי הצהריים';
+            } else {
+                return 'בערב';
+            }
         }
     });
-}));
+
+    return he;
+
+}));
\ No newline at end of file
index 36ee3ff..fc59771 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : hindi (hi)
-// author : Mayank Singhal : https://github.com/mayanksinghal
+//! moment.js locale configuration
+//! locale : Hindi [hi]
+//! author : Mayank Singhal : https://github.com/mayanksinghal
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '१',
         '2': '२',
         '०': '0'
     };
 
-    return moment.defineLocale('hi', {
+    var hi = moment.defineLocale('hi', {
         months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
         monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
         weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
         weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
@@ -49,8 +47,8 @@
             LTS : 'A h:mm:ss बजे',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm बजे',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm बजे'
         },
         calendar : {
             sameDay : '[आज] LT',
         },
         // Hindi notation for meridiems are quite fuzzy in practice. While there exists
         // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+        meridiemParse: /रात|सुबह|दोपहर|शाम/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'रात') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'सुबह') {
+                return hour;
+            } else if (meridiem === 'दोपहर') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'शाम') {
+                return hour + 12;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'रात';
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hi;
+
+}));
\ No newline at end of file
index be9d785..a3a9be0 100644 (file)
-// moment.js locale configuration
-// locale : hrvatski (hr)
-// author : Bojan Marković : https://github.com/bmarkovic
+//! moment.js locale configuration
+//! locale : Croatian [hr]
+//! author : Bojan Marković : https://github.com/bmarkovic
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-// based on (sl) translation by Robert Sedovšek
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function translate(number, withoutSuffix, key) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minuta';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'jedan sat' : 'jednog sata';
-        case 'hh':
-            if (number === 1) {
-                result += 'sat';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'sata';
-            } else {
-                result += 'sati';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dana';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mjesec';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'mjeseca';
-            } else {
-                result += 'mjeseci';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'godina';
-            } else if (number === 2 || number === 3 || number === 4) {
-                result += 'godine';
-            } else {
-                result += 'godina';
-            }
-            return result;
+            case 'm':
+                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+            case 'mm':
+                if (number === 1) {
+                    result += 'minuta';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'minute';
+                } else {
+                    result += 'minuta';
+                }
+                return result;
+            case 'h':
+                return withoutSuffix ? 'jedan sat' : 'jednog sata';
+            case 'hh':
+                if (number === 1) {
+                    result += 'sat';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'sata';
+                } else {
+                    result += 'sati';
+                }
+                return result;
+            case 'dd':
+                if (number === 1) {
+                    result += 'dan';
+                } else {
+                    result += 'dana';
+                }
+                return result;
+            case 'MM':
+                if (number === 1) {
+                    result += 'mjesec';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'mjeseca';
+                } else {
+                    result += 'mjeseci';
+                }
+                return result;
+            case 'yy':
+                if (number === 1) {
+                    result += 'godina';
+                } else if (number === 2 || number === 3 || number === 4) {
+                    result += 'godine';
+                } else {
+                    result += 'godina';
+                }
+                return result;
         }
     }
 
-    return moment.defineLocale('hr', {
-        months : 'sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'),
-        monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+    var hr = moment.defineLocale('hr', {
+        months : {
+            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'),
+            standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_')
+        },
+        monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
         weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
         weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[danas u] LT',
             nextDay  : '[sutra u] LT',
-
             nextWeek : function () {
                 switch (this.day()) {
-                case 0:
-                    return '[u] [nedjelju] [u] LT';
-                case 3:
-                    return '[u] [srijedu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
+                    case 0:
+                        return '[u] [nedjelju] [u] LT';
+                    case 3:
+                        return '[u] [srijedu] [u] LT';
+                    case 6:
+                        return '[u] [subotu] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[u] dddd [u] LT';
                 }
             },
             lastDay  : '[jučer u] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                    return '[prošlu] dddd [u] LT';
-                case 6:
-                    return '[prošle] [subote] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prošli] dddd [u] LT';
+                    case 0:
+                    case 3:
+                        return '[prošlu] dddd [u] LT';
+                    case 6:
+                        return '[prošle] [subote] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[prošli] dddd [u] LT';
                 }
             },
             sameElse : 'L'
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hr;
+
+}));
\ No newline at end of file
index 3ed864e..af5c731 100644 (file)
@@ -1,57 +1,50 @@
-// moment.js locale configuration
-// locale : hungarian (hu)
-// author : Adam Brunner : https://github.com/adambrunner
+//! moment.js locale configuration
+//! locale : Hungarian [hu]
+//! author : Adam Brunner : https://github.com/adambrunner
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
 
+    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
     function translate(number, withoutSuffix, key, isFuture) {
         var num = number,
             suffix;
-
         switch (key) {
-        case 's':
-            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
-        case 'm':
-            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'mm':
-            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
-        case 'h':
-            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'hh':
-            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
-        case 'd':
-            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'dd':
-            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
-        case 'M':
-            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'MM':
-            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
-        case 'y':
-            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
-        case 'yy':
-            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+            case 's':
+                return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+            case 'm':
+                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+            case 'mm':
+                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+            case 'h':
+                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+            case 'hh':
+                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+            case 'd':
+                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+            case 'dd':
+                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+            case 'M':
+                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+            case 'MM':
+                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+            case 'y':
+                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+            case 'yy':
+                return num + (isFuture || withoutSuffix ? ' év' : ' éve');
         }
-
         return '';
     }
-
     function week(isFuture) {
         return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
     }
 
-    return moment.defineLocale('hu', {
+    var hu = moment.defineLocale('hu', {
         months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
         monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
         weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
         weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'YYYY.MM.DD.',
             LL : 'YYYY. MMMM D.',
-            LLL : 'YYYY. MMMM D., LT',
-            LLLL : 'YYYY. MMMM D., dddd LT'
+            LLL : 'YYYY. MMMM D. H:mm',
+            LLLL : 'YYYY. MMMM D., dddd H:mm'
+        },
+        meridiemParse: /de|du/i,
+        isPM: function (input) {
+            return input.charAt(1).toLowerCase() === 'u';
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 12) {
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hu;
+
+}));
\ No newline at end of file
index 1e6540b..8b26200 100644 (file)
@@ -1,56 +1,31 @@
-// moment.js locale configuration
-// locale : Armenian (hy-am)
-// author : Armendarabyan : https://github.com/armendarabyan
+//! moment.js locale configuration
+//! locale : Armenian [hy-am]
+//! author : Armendarabyan : https://github.com/armendarabyan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
-            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
-        },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-        return monthsShort[m.month()];
-    }
 
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
-
-        return weekdays[m.day()];
-    }
-
-    return moment.defineLocale('hy-am', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
+    var hy_am = moment.defineLocale('hy-am', {
+        months : {
+            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'),
+            standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_')
+        },
+        monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
+        weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'),
         weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
         weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY թ.',
-            LLL : 'D MMMM YYYY թ., LT',
-            LLLL : 'dddd, D MMMM YYYY թ., LT'
+            LLL : 'D MMMM YYYY թ., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY թ., HH:mm'
         },
         calendar : {
             sameDay: '[այսօր] LT',
             y : 'տարի',
             yy : '%d տարի'
         },
-
+        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+        isPM: function (input) {
+            return /^(ցերեկվա|երեկոյան)$/.test(input);
+        },
         meridiem : function (hour) {
             if (hour < 4) {
                 return 'գիշերվա';
                 return 'երեկոյան';
             }
         },
-
         ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'DDD':
-            case 'w':
-            case 'W':
-            case 'DDDo':
-                if (number === 1) {
-                    return number + '-ին';
-                }
-                return number + '-րդ';
-            default:
-                return number;
+                case 'DDD':
+                case 'w':
+                case 'W':
+                case 'DDDo':
+                    if (number === 1) {
+                        return number + '-ին';
+                    }
+                    return number + '-րդ';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return hy_am;
+
+}));
\ No newline at end of file
index b8fc9ad..16dff2f 100644 (file)
@@ -1,20 +1,17 @@
-// moment.js locale configuration
-// locale : Bahasa Indonesia (id)
-// author : Mohammad Satrio Utomo : https://github.com/tyok
-// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+//! moment.js locale configuration
+//! locale : Indonesian [id]
+//! author : Mohammad Satrio Utomo : https://github.com/tyok
+//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('id', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var id = moment.defineLocale('id', {
         months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
         monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
         weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
         weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
-            LTS : 'LT.ss',
+            LTS : 'HH.mm.ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY [pukul] LT',
-            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /pagi|siang|sore|malam/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'pagi') {
+                return hour;
+            } else if (meridiem === 'siang') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'sore' || meridiem === 'malam') {
+                return hour + 12;
+            }
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 11) {
@@ -67,4 +77,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return id;
+
+}));
\ No newline at end of file
index 6422b47..810fee6 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : icelandic (is)
-// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+//! moment.js locale configuration
+//! locale : Icelandic [is]
+//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(n) {
         if (n % 100 === 11) {
             return true;
         }
         return true;
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 's':
-            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
-        case 'm':
-            return withoutSuffix ? 'mínúta' : 'mínútu';
-        case 'mm':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
-            } else if (withoutSuffix) {
-                return result + 'mínúta';
-            }
-            return result + 'mínútu';
-        case 'hh':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
-            }
-            return result + 'klukkustund';
-        case 'd':
-            if (withoutSuffix) {
-                return 'dagur';
-            }
-            return isFuture ? 'dag' : 'degi';
-        case 'dd':
-            if (plural(number)) {
+            case 's':
+                return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+            case 'm':
+                return withoutSuffix ? 'mínúta' : 'mínútu';
+            case 'mm':
+                if (plural(number)) {
+                    return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+                } else if (withoutSuffix) {
+                    return result + 'mínúta';
+                }
+                return result + 'mínútu';
+            case 'hh':
+                if (plural(number)) {
+                    return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+                }
+                return result + 'klukkustund';
+            case 'd':
                 if (withoutSuffix) {
-                    return result + 'dagar';
+                    return 'dagur';
                 }
-                return result + (isFuture ? 'daga' : 'dögum');
-            } else if (withoutSuffix) {
-                return result + 'dagur';
-            }
-            return result + (isFuture ? 'dag' : 'degi');
-        case 'M':
-            if (withoutSuffix) {
-                return 'mánuður';
-            }
-            return isFuture ? 'mánuð' : 'mánuði';
-        case 'MM':
-            if (plural(number)) {
+                return isFuture ? 'dag' : 'degi';
+            case 'dd':
+                if (plural(number)) {
+                    if (withoutSuffix) {
+                        return result + 'dagar';
+                    }
+                    return result + (isFuture ? 'daga' : 'dögum');
+                } else if (withoutSuffix) {
+                    return result + 'dagur';
+                }
+                return result + (isFuture ? 'dag' : 'degi');
+            case 'M':
                 if (withoutSuffix) {
-                    return result + 'mánuðir';
+                    return 'mánuður';
+                }
+                return isFuture ? 'mánuð' : 'mánuði';
+            case 'MM':
+                if (plural(number)) {
+                    if (withoutSuffix) {
+                        return result + 'mánuðir';
+                    }
+                    return result + (isFuture ? 'mánuði' : 'mánuðum');
+                } else if (withoutSuffix) {
+                    return result + 'mánuður';
+                }
+                return result + (isFuture ? 'mánuð' : 'mánuði');
+            case 'y':
+                return withoutSuffix || isFuture ? 'ár' : 'ári';
+            case 'yy':
+                if (plural(number)) {
+                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
                 }
-                return result + (isFuture ? 'mánuði' : 'mánuðum');
-            } else if (withoutSuffix) {
-                return result + 'mánuður';
-            }
-            return result + (isFuture ? 'mánuð' : 'mánuði');
-        case 'y':
-            return withoutSuffix || isFuture ? 'ár' : 'ári';
-        case 'yy':
-            if (plural(number)) {
-                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
-            }
-            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
         }
     }
 
-    return moment.defineLocale('is', {
+    var is = moment.defineLocale('is', {
         months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
         weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
         weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD/MM/YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY [kl.] LT',
-            LLLL : 'dddd, D. MMMM YYYY [kl.] LT'
+            LLL : 'D. MMMM YYYY [kl.] H:mm',
+            LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm'
         },
         calendar : {
             sameDay : '[í dag kl.] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return is;
+
+}));
\ No newline at end of file
index 1330988..35d44cc 100644 (file)
@@ -1,32 +1,29 @@
-// moment.js locale configuration
-// locale : italian (it)
-// author : Lorenzo : https://github.com/aliem
-// author: Mattia Larentis: https://github.com/nostalgiaz
+//! moment.js locale configuration
+//! locale : Italian [it]
+//! author : Lorenzo : https://github.com/aliem
+//! author: Mattia Larentis: https://github.com/nostalgiaz
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('it', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var it = moment.defineLocale('it', {
         months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
         monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
         weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
         weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
-        weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'),
+        weekdaysMin : 'Do_Lu_Ma_Me_Gi_Ve_Sa'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Oggi alle] LT',
@@ -67,4 +64,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return it;
+
+}));
\ No newline at end of file
index c3e3ebf..adea359 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : japanese (ja)
-// author : LI Long : https://github.com/baryon
+//! moment.js locale configuration
+//! locale : Japanese [ja]
+//! author : LI Long : https://github.com/baryon
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ja', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ja = moment.defineLocale('ja', {
         months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
         weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
         longDateFormat : {
             LT : 'Ah時m分',
-            LTS : 'LTs秒',
+            LTS : 'Ah時m分s秒',
             L : 'YYYY/MM/DD',
             LL : 'YYYY年M月D日',
-            LLL : 'YYYY年M月D日LT',
-            LLLL : 'YYYY年M月D日LT dddd'
+            LLL : 'YYYY年M月D日Ah時m分',
+            LLLL : 'YYYY年M月D日Ah時m分 dddd'
+        },
+        meridiemParse: /午前|午後/i,
+        isPM : function (input) {
+            return input === '午後';
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
             lastWeek : '[前週]dddd LT',
             sameElse : 'L'
         },
+        ordinalParse : /\d{1,2}日/,
+        ordinal : function (number, period) {
+            switch (period) {
+                case 'd':
+                case 'D':
+                case 'DDD':
+                    return number + '日';
+                default:
+                    return number;
+            }
+        },
         relativeTime : {
             future : '%s後',
             past : '%s前',
@@ -58,4 +70,7 @@
             yy : '%d年'
         }
     });
-}));
+
+    return ja;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/jv.js b/resources/lib/moment/locale/jv.js
new file mode 100644 (file)
index 0000000..c58e076
--- /dev/null
@@ -0,0 +1,83 @@
+//! moment.js locale configuration
+//! locale : Japanese [jv]
+//! author : Rony Lantip : https://github.com/lantip
+//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var jv = moment.defineLocale('jv', {
+        months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+        weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+        weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+        weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            LTS : 'HH.mm.ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /enjing|siyang|sonten|ndalu/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'enjing') {
+                return hour;
+            } else if (meridiem === 'siyang') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'enjing';
+            } else if (hours < 15) {
+                return 'siyang';
+            } else if (hours < 19) {
+                return 'sonten';
+            } else {
+                return 'ndalu';
+            }
+        },
+        calendar : {
+            sameDay : '[Dinten puniko pukul] LT',
+            nextDay : '[Mbenjang pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kala wingi pukul] LT',
+            lastWeek : 'dddd [kepengker pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'wonten ing %s',
+            past : '%s ingkang kepengker',
+            s : 'sawetawis detik',
+            m : 'setunggal menit',
+            mm : '%d menit',
+            h : 'setunggal jam',
+            hh : '%d jam',
+            d : 'sedinten',
+            dd : '%d dinten',
+            M : 'sewulan',
+            MM : '%d wulan',
+            y : 'setaun',
+            yy : '%d taun'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return jv;
+
+}));
\ No newline at end of file
index 1437c71..b9faf68 100644 (file)
@@ -1,48 +1,26 @@
-// moment.js locale configuration
-// locale : Georgian (ka)
-// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+//! moment.js locale configuration
+//! locale : Georgian [ka]
+//! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
-            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
-        },
-
-        nounCase = (/D[oD] *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-        return months[nounCase][m.month()];
-    }
 
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
-            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
+    var ka = moment.defineLocale('ka', {
+        months : {
+            standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
+            format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
         },
-
-        nounCase = (/(წინა|შემდეგ)/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return weekdays[nounCase][m.day()];
-    }
-
-    return moment.defineLocale('ka', {
-        months : monthsCaseReplace,
         monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
-        weekdays : weekdaysCaseReplace,
+        weekdays : {
+            standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
+            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'),
+            isFormat: /(წინა|შემდეგ)/
+        },
         weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
         weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
         longDateFormat : {
@@ -50,8 +28,8 @@
             LTS : 'h:mm:ss A',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
         },
         calendar : {
             sameDay : '[დღეს] LT[-ზე]',
             if (number === 0) {
                 return number;
             }
-
             if (number === 1) {
                 return number + '-ლი';
             }
-
             if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
                 return 'მე-' + number;
             }
-
             return number + '-ე';
         },
         week : {
             doy : 7
         }
     });
-}));
+
+    return ka;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/kk.js b/resources/lib/moment/locale/kk.js
new file mode 100644 (file)
index 0000000..270106f
--- /dev/null
@@ -0,0 +1,87 @@
+//! moment.js locale configuration
+//! locale : Kazakh [kk]
+//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var suffixes = {
+        0: '-ші',
+        1: '-ші',
+        2: '-ші',
+        3: '-ші',
+        4: '-ші',
+        5: '-ші',
+        6: '-шы',
+        7: '-ші',
+        8: '-ші',
+        9: '-шы',
+        10: '-шы',
+        20: '-шы',
+        30: '-шы',
+        40: '-шы',
+        50: '-ші',
+        60: '-шы',
+        70: '-ші',
+        80: '-ші',
+        90: '-шы',
+        100: '-ші'
+    };
+
+    var kk = moment.defineLocale('kk', {
+        months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'),
+        monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
+        weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'),
+        weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
+        weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[Бүгін сағат] LT',
+            nextDay : '[Ертең сағат] LT',
+            nextWeek : 'dddd [сағат] LT',
+            lastDay : '[Кеше сағат] LT',
+            lastWeek : '[Өткен аптаның] dddd [сағат] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ішінде',
+            past : '%s бұрын',
+            s : 'бірнеше секунд',
+            m : 'бір минут',
+            mm : '%d минут',
+            h : 'бір сағат',
+            hh : '%d сағат',
+            d : 'бір күн',
+            dd : '%d күн',
+            M : 'бір ай',
+            MM : '%d ай',
+            y : 'бір жыл',
+            yy : '%d жыл'
+        },
+        ordinalParse: /\d{1,2}-(ші|шы)/,
+        ordinal : function (number) {
+            var a = number % 10,
+                b = number >= 100 ? 100 : null;
+            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return kk;
+
+}));
\ No newline at end of file
index 6229791..cbfe31d 100644 (file)
@@ -1,34 +1,31 @@
-// moment.js locale configuration
-// locale : khmer (km)
-// author : Kruy Vanna : https://github.com/kruyvanna
+//! moment.js locale configuration
+//! locale : Cambodian [km]
+//! author : Kruy Vanna : https://github.com/kruyvanna
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('km', {
-        months: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
-        monthsShort: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var km = moment.defineLocale('km', {
+        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
+        monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
         weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
         longDateFormat: {
             LT: 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
-            LLL: 'D MMMM YYYY LT',
-            LLLL: 'dddd, D MMMM YYYY LT'
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd, D MMMM YYYY HH:mm'
         },
         calendar: {
-            sameDay: '[á\9e\90á\9f\92á\9e\84á\9f\83á\9e\93á\9f\88 ម៉ោង] LT',
+            sameDay: '[á\9e\90á\9f\92á\9e\84á\9f\83á\9e\93á\9f\81á\9f\87 ម៉ោង] LT',
             nextDay: '[ស្អែក ម៉ោង] LT',
             nextWeek: 'dddd [ម៉ោង] LT',
             lastDay: '[ម្សិលមិញ ម៉ោង] LT',
@@ -55,4 +52,7 @@
             doy: 4 // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return km;
+
+}));
\ No newline at end of file
index 2638959..4f067e8 100644 (file)
@@ -1,22 +1,17 @@
-// moment.js locale configuration
-// locale : korean (ko)
-//
-// authors
-//
-// - Kyungwook, Park : https://github.com/kyungw00k
-// - Jeeeyul Lee <jeeeyul@gmail.com>
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ko', {
+//! moment.js locale configuration
+//! locale : Korean [ko]
+//! author : Kyungwook, Park : https://github.com/kyungw00k
+//! author : Jeeeyul Lee <jeeeyul@gmail.com>
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ko = moment.defineLocale('ko', {
         months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
         monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
         weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
             LTS : 'A h시 m분 s초',
             L : 'YYYY.MM.DD',
             LL : 'YYYY년 MMMM D일',
-            LLL : 'YYYY년 MMMM D일 LT',
-            LLLL : 'YYYY년 MMMM D일 dddd LT'
-        },
-        meridiem : function (hour, minute, isUpper) {
-            return hour < 12 ? '오전' : '오후';
+            LLL : 'YYYY년 MMMM D일 A h시 m분',
+            LLLL : 'YYYY년 MMMM D일 dddd A h시 m분'
         },
         calendar : {
             sameDay : '오늘 LT',
         relativeTime : {
             future : '%s 후',
             past : '%s 전',
-            s : '몇초',
+            s : '몇 초',
             ss : '%d초',
             m : '일분',
             mm : '%d분',
-            h : '한시간',
+            h : '한 시간',
             hh : '%d시간',
             d : '하루',
             dd : '%d일',
-            M : '한달',
+            M : '한 달',
             MM : '%d달',
-            y : '일년',
+            y : '일 년',
             yy : '%d년'
         },
         ordinalParse : /\d{1,2}일/,
         ordinal : '%d일',
-        meridiemParse : /(오전|오후)/,
+        meridiemParse : /오전|오후/,
         isPM : function (token) {
             return token === '오후';
+        },
+        meridiem : function (hour, minute, isUpper) {
+            return hour < 12 ? '오전' : '오후';
         }
     });
-}));
+
+    return ko;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ky.js b/resources/lib/moment/locale/ky.js
new file mode 100644 (file)
index 0000000..eaffed1
--- /dev/null
@@ -0,0 +1,88 @@
+//! moment.js locale configuration
+//! locale : Kyrgyz [ky]
+//! author : Chyngyz Arystan uulu : https://github.com/chyngyz
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+
+    var suffixes = {
+        0: '-чү',
+        1: '-чи',
+        2: '-чи',
+        3: '-чү',
+        4: '-чү',
+        5: '-чи',
+        6: '-чы',
+        7: '-чи',
+        8: '-чи',
+        9: '-чу',
+        10: '-чу',
+        20: '-чы',
+        30: '-чу',
+        40: '-чы',
+        50: '-чү',
+        60: '-чы',
+        70: '-чи',
+        80: '-чи',
+        90: '-чу',
+        100: '-чү'
+    };
+
+    var ky = moment.defineLocale('ky', {
+        months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+        monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+        weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'),
+        weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
+        weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[Бүгүн саат] LT',
+            nextDay : '[Эртең саат] LT',
+            nextWeek : 'dddd [саат] LT',
+            lastDay : '[Кече саат] LT',
+            lastWeek : '[Өткен аптанын] dddd [күнү] [саат] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ичинде',
+            past : '%s мурун',
+            s : 'бирнече секунд',
+            m : 'бир мүнөт',
+            mm : '%d мүнөт',
+            h : 'бир саат',
+            hh : '%d саат',
+            d : 'бир күн',
+            dd : '%d күн',
+            M : 'бир ай',
+            MM : '%d ай',
+            y : 'бир жыл',
+            yy : '%d жыл'
+        },
+        ordinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
+        ordinal : function (number) {
+            var a = number % 10,
+                b = number >= 100 ? 100 : null;
+            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return ky;
+
+}));
\ No newline at end of file
index fe6b34b..83bde2b 100644 (file)
@@ -1,22 +1,16 @@
-// moment.js locale configuration
-// locale : Luxembourgish (lb)
-// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
+//! moment.js locale configuration
+//! locale : Luxembourgish [lb]
+//! author : mweimerskirch : https://github.com/mweimerskirch
+//! author : David Raison : https://github.com/kwisatz
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
 
-// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the
-// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday'
-// and 'eifelerRegelAppliesToNumber' methods are meant for
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var format = {
             'm': ['eng Minutt', 'enger Minutt'],
@@ -27,7 +21,6 @@
         };
         return withoutSuffix ? format[key][0] : format[key][1];
     }
-
     function processFutureTime(string) {
         var number = string.substr(0, string.indexOf(' '));
         if (eifelerRegelAppliesToNumber(number)) {
@@ -35,7 +28,6 @@
         }
         return 'an ' + string;
     }
-
     function processPastTime(string) {
         var number = string.substr(0, string.indexOf(' '));
         if (eifelerRegelAppliesToNumber(number)) {
@@ -43,7 +35,6 @@
         }
         return 'virun ' + string;
     }
-
     /**
      * Returns true if the word before the given number loses the '-n' ending.
      * e.g. 'an 10 Deeg' but 'a 5 Deeg'
         }
     }
 
-    return moment.defineLocale('lb', {
+    var lb = moment.defineLocale('lb', {
         months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
         monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
+        monthsParseExact : true,
         weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
         weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
         weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat: {
             LT: 'H:mm [Auer]',
             LTS: 'H:mm:ss [Auer]',
             L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
-            LLL: 'D. MMMM YYYY LT',
-            LLLL: 'dddd, D. MMMM YYYY LT'
+            LLL: 'D. MMMM YYYY H:mm [Auer]',
+            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]'
         },
         calendar: {
             sameDay: '[Haut um] LT',
             doy: 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return lb;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/lo.js b/resources/lib/moment/locale/lo.js
new file mode 100644 (file)
index 0000000..689a183
--- /dev/null
@@ -0,0 +1,70 @@
+//! moment.js locale configuration
+//! locale : Lao [lo]
+//! author : Ryan Hart : https://github.com/ryanhart2
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var lo = moment.defineLocale('lo', {
+        months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+        monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'),
+        weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+        weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
+        weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'ວັນdddd D MMMM YYYY HH:mm'
+        },
+        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
+        isPM: function (input) {
+            return input === 'ຕອນແລງ';
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 12) {
+                return 'ຕອນເຊົ້າ';
+            } else {
+                return 'ຕອນແລງ';
+            }
+        },
+        calendar : {
+            sameDay : '[ມື້ນີ້ເວລາ] LT',
+            nextDay : '[ມື້ອື່ນເວລາ] LT',
+            nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT',
+            lastDay : '[ມື້ວານນີ້ເວລາ] LT',
+            lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'ອີກ %s',
+            past : '%sຜ່ານມາ',
+            s : 'ບໍ່ເທົ່າໃດວິນາທີ',
+            m : '1 ນາທີ',
+            mm : '%d ນາທີ',
+            h : '1 ຊົ່ວໂມງ',
+            hh : '%d ຊົ່ວໂມງ',
+            d : '1 ມື້',
+            dd : '%d ມື້',
+            M : '1 ເດືອນ',
+            MM : '%d ເດືອນ',
+            y : '1 ປີ',
+            yy : '%d ປີ'
+        },
+        ordinalParse: /(ທີ່)\d{1,2}/,
+        ordinal : function (number) {
+            return 'ທີ່' + number;
+        }
+    });
+
+    return lo;
+
+}));
\ No newline at end of file
index d9c8ae5..2bb9a36 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Lithuanian (lt)
-// author : Mindaugas Mozūras : https://github.com/mmozuras
+//! moment.js locale configuration
+//! locale : Lithuanian [lt]
+//! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var units = {
         'm' : 'minutė_minutės_minutę',
         'mm': 'minutės_minučių_minutes',
@@ -24,9 +21,7 @@
         'MM': 'mėnesiai_mėnesių_mėnesius',
         'y' : 'metai_metų_metus',
         'yy': 'metai_metų_metus'
-    },
-    weekDays = 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_');
-
+    };
     function translateSeconds(number, withoutSuffix, key, isFuture) {
         if (withoutSuffix) {
             return 'kelios sekundės';
             return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
         }
     }
-
     function translateSingular(number, withoutSuffix, key, isFuture) {
         return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
     }
-
     function special(number) {
         return number % 10 === 0 || (number > 10 && number < 20);
     }
-
     function forms(key) {
         return units[key].split('_');
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         if (number === 1) {
             }
         }
     }
-
-    function relativeWeekDay(moment, format) {
-        var nominative = format.indexOf('dddd HH:mm') === -1,
-            weekDay = weekDays[moment.day()];
-
-        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į';
-    }
-
-    return moment.defineLocale('lt', {
-        months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+    var lt = moment.defineLocale('lt', {
+        months : {
+            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
+            standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
+            isFormat: /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?|MMMM?(\[[^\[\]]*\]|\s+)+D[oD]?/
+        },
         monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
-        weekdays : relativeWeekDay,
+        weekdays : {
+            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'),
+            standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'),
+            isFormat: /dddd HH:mm/
+        },
         weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
         weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'YYYY [m.] MMMM D [d.]',
-            LLL : 'YYYY [m.] MMMM D [d.], LT [val.]',
-            LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]',
+            LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+            LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
             l : 'YYYY-MM-DD',
             ll : 'YYYY [m.] MMMM D [d.]',
-            lll : 'YYYY [m.] MMMM D [d.], LT [val.]',
-            llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]'
+            lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
+            llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]'
         },
         calendar : {
             sameDay : '[Šiandien] LT',
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return lt;
+
+}));
\ No newline at end of file
index 315f27f..780be13 100644 (file)
@@ -1,52 +1,65 @@
-// moment.js locale configuration
-// locale : latvian (lv)
-// author : Kristaps Karlsons : https://github.com/skakri
+//! moment.js locale configuration
+//! locale : Latvian [lv]
+//! author : Kristaps Karlsons : https://github.com/skakri
+//! author : Jānis Elmeris : https://github.com/JanisE
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var units = {
-        'mm': 'minūti_minūtes_minūte_minūtes',
-        'hh': 'stundu_stundas_stunda_stundas',
-        'dd': 'dienu_dienas_diena_dienas',
-        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
-        'yy': 'gadu_gadus_gads_gadi'
+        'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+        'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+        'h': 'stundas_stundām_stunda_stundas'.split('_'),
+        'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+        'd': 'dienas_dienām_diena_dienas'.split('_'),
+        'dd': 'dienas_dienām_diena_dienas'.split('_'),
+        'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+        'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+        'y': 'gada_gadiem_gads_gadi'.split('_'),
+        'yy': 'gada_gadiem_gads_gadi'.split('_')
     };
-
-    function format(word, number, withoutSuffix) {
-        var forms = word.split('_');
+    /**
+     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+     */
+    function format(forms, number, withoutSuffix) {
         if (withoutSuffix) {
-            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+            // E.g. "21 minūte", "3 minūtes".
+            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
         } else {
-            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+            // E.g. "21 minūtes" as in "pēc 21 minūtes".
+            // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
+            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
         }
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         return number + ' ' + format(units[key], number, withoutSuffix);
     }
+    function relativeTimeWithSingular(number, withoutSuffix, key) {
+        return format(units[key], number, withoutSuffix);
+    }
+    function relativeSeconds(number, withoutSuffix) {
+        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
+    }
 
-    return moment.defineLocale('lv', {
+    var lv = moment.defineLocale('lv', {
         months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
         monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
         weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
         weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
         weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
-            L : 'DD.MM.YYYY',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY.',
             LL : 'YYYY. [gada] D. MMMM',
-            LLL : 'YYYY. [gada] D. MMMM, LT',
-            LLLL : 'YYYY. [gada] D. MMMM, dddd, LT'
+            LLL : 'YYYY. [gada] D. MMMM, HH:mm',
+            LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm'
         },
         calendar : {
             sameDay : '[Šodien pulksten] LT',
             sameElse : 'L'
         },
         relativeTime : {
-            future : '%s vēlāk',
-            past : '%s agrāk',
-            s : 'dažas sekundes',
-            m : 'minūti',
+            future : 'pēc %s',
+            past : 'pirms %s',
+            s : relativeSeconds,
+            m : relativeTimeWithSingular,
             mm : relativeTimeWithPlural,
-            h : 'stundu',
+            h : relativeTimeWithSingular,
             hh : relativeTimeWithPlural,
-            d : 'dienu',
+            d : relativeTimeWithSingular,
             dd : relativeTimeWithPlural,
-            M : 'mēnesi',
+            M : relativeTimeWithSingular,
             MM : relativeTimeWithPlural,
-            y : 'gadu',
+            y : relativeTimeWithSingular,
             yy : relativeTimeWithPlural
         },
         ordinalParse: /\d{1,2}\./,
@@ -78,4 +91,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return lv;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/mi.js b/resources/lib/moment/locale/mi.js
new file mode 100644 (file)
index 0000000..850e4cd
--- /dev/null
@@ -0,0 +1,64 @@
+//! moment.js locale configuration
+//! locale : Maori [mi]
+//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var mi = moment.defineLocale('mi', {
+        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'),
+        monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'),
+        monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+        monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+        monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
+        monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
+        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
+        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
+        longDateFormat: {
+            LT: 'HH:mm',
+            LTS: 'HH:mm:ss',
+            L: 'DD/MM/YYYY',
+            LL: 'D MMMM YYYY',
+            LLL: 'D MMMM YYYY [i] HH:mm',
+            LLLL: 'dddd, D MMMM YYYY [i] HH:mm'
+        },
+        calendar: {
+            sameDay: '[i teie mahana, i] LT',
+            nextDay: '[apopo i] LT',
+            nextWeek: 'dddd [i] LT',
+            lastDay: '[inanahi i] LT',
+            lastWeek: 'dddd [whakamutunga i] LT',
+            sameElse: 'L'
+        },
+        relativeTime: {
+            future: 'i roto i %s',
+            past: '%s i mua',
+            s: 'te hēkona ruarua',
+            m: 'he meneti',
+            mm: '%d meneti',
+            h: 'te haora',
+            hh: '%d haora',
+            d: 'he ra',
+            dd: '%d ra',
+            M: 'he marama',
+            MM: '%d marama',
+            y: 'he tau',
+            yy: '%d tau'
+        },
+        ordinalParse: /\d{1,2}º/,
+        ordinal: '%dº',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return mi;
+
+}));
\ No newline at end of file
index 74fd5a1..88413ac 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : macedonian (mk)
-// author : Borislav Mickov : https://github.com/B0k0
+//! moment.js locale configuration
+//! locale : Macedonian [mk]
+//! author : Borislav Mickov : https://github.com/B0k0
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('mk', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var mk = moment.defineLocale('mk', {
         months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
         monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
         weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
         weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'D.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY H:mm',
+            LLLL : 'dddd, D MMMM YYYY H:mm'
         },
         calendar : {
             sameDay : '[Денес во] LT',
             nextDay : '[Утре во] LT',
-            nextWeek : 'dddd [во] LT',
+            nextWeek : '[Во] dddd [во] LT',
             lastDay : '[Вчера во] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[Во изминатата] dddd [во] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[Во изминатиот] dddd [во] LT';
+                    case 0:
+                    case 3:
+                    case 6:
+                        return '[Изминатата] dddd [во] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[Изминатиот] dddd [во] LT';
                 }
             },
             sameElse : 'L'
@@ -87,4 +84,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return mk;
+
+}));
\ No newline at end of file
index f72b2c4..487b37a 100644 (file)
@@ -1,21 +1,19 @@
-// moment.js locale configuration
-// locale : malayalam (ml)
-// author : Floyd Pink : https://github.com/floydpink
+//! moment.js locale configuration
+//! locale : Malayalam [ml]
+//! author : Floyd Pink : https://github.com/floydpink
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ml', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ml = moment.defineLocale('ml', {
         months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
         monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
         weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
         weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
@@ -24,8 +22,8 @@
             LTS : 'A h:mm:ss -നു',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm -നു',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm -നു'
         },
         calendar : {
             sameDay : '[ഇന്ന്] LT',
             y : 'ഒരു വർഷം',
             yy : '%d വർഷം'
         },
+        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if ((meridiem === 'രാത്രി' && hour >= 4) ||
+                    meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
+                    meridiem === 'വൈകുന്നേരം') {
+                return hour + 12;
+            } else {
+                return hour;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'രാത്രി';
@@ -64,4 +75,7 @@
             }
         }
     });
-}));
+
+    return ml;
+
+}));
\ No newline at end of file
index 7c04715..fc388b0 100644 (file)
@@ -1,18 +1,16 @@
-// moment.js locale configuration
-// locale : Marathi (mr)
-// author : Harshad Kale : https://github.com/kalehv
+//! moment.js locale configuration
+//! locale : Marathi [mr]
+//! author : Harshad Kale : https://github.com/kalehv
+//! author : Vivek Athalye : https://github.com/vnathalye
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '१',
         '2': '२',
         '०': '0'
     };
 
-    return moment.defineLocale('mr', {
+    function relativeTimeMr(number, withoutSuffix, string, isFuture)
+    {
+        var output = '';
+        if (withoutSuffix) {
+            switch (string) {
+                case 's': output = 'काही सेकंद'; break;
+                case 'm': output = 'एक मिनिट'; break;
+                case 'mm': output = '%d मिनिटे'; break;
+                case 'h': output = 'एक तास'; break;
+                case 'hh': output = '%d तास'; break;
+                case 'd': output = 'एक दिवस'; break;
+                case 'dd': output = '%d दिवस'; break;
+                case 'M': output = 'एक महिना'; break;
+                case 'MM': output = '%d महिने'; break;
+                case 'y': output = 'एक वर्ष'; break;
+                case 'yy': output = '%d वर्षे'; break;
+            }
+        }
+        else {
+            switch (string) {
+                case 's': output = 'काही सेकंदां'; break;
+                case 'm': output = 'एका मिनिटा'; break;
+                case 'mm': output = '%d मिनिटां'; break;
+                case 'h': output = 'एका तासा'; break;
+                case 'hh': output = '%d तासां'; break;
+                case 'd': output = 'एका दिवसा'; break;
+                case 'dd': output = '%d दिवसां'; break;
+                case 'M': output = 'एका महिन्या'; break;
+                case 'MM': output = '%d महिन्यां'; break;
+                case 'y': output = 'एका वर्षा'; break;
+                case 'yy': output = '%d वर्षां'; break;
+            }
+        }
+        return output.replace(/%d/i, number);
+    }
+
+    var mr = moment.defineLocale('mr', {
         months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
         monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
         weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
         weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
@@ -49,8 +84,8 @@
             LTS : 'A h:mm:ss वाजता',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, A h:mm वाजता',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता'
         },
         calendar : {
             sameDay : '[आज] LT',
             sameElse : 'L'
         },
         relativeTime : {
-            future : '%s नंतर',
-            past : '%s पूर्वी',
-            s : 'सेकंद',
-            m: 'एक मिनिट',
-            mm: '%d मिनिटे',
-            h : 'एक तास',
-            hh : '%d तास',
-            d : 'एक दिवस',
-            dd : '%d दिवस',
-            M : 'एक महिना',
-            MM : '%d महिने',
-            y : 'एक वर्ष',
-            yy : '%d वर्षे'
+            future: '%sमध्ये',
+            past: '%sपूर्वी',
+            s: relativeTimeMr,
+            m: relativeTimeMr,
+            mm: relativeTimeMr,
+            h: relativeTimeMr,
+            hh: relativeTimeMr,
+            d: relativeTimeMr,
+            dd: relativeTimeMr,
+            M: relativeTimeMr,
+            MM: relativeTimeMr,
+            y: relativeTimeMr,
+            yy: relativeTimeMr
         },
         preparse: function (string) {
             return string.replace(/[१२३४५६७८९०]/g, function (match) {
                 return symbolMap[match];
             });
         },
-        meridiem: function (hour, minute, isLower)
-        {
+        meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'रात्री') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'सकाळी') {
+                return hour;
+            } else if (meridiem === 'दुपारी') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'सायंकाळी') {
+                return hour + 12;
+            }
+        },
+        meridiem: function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'रात्री';
             } else if (hour < 10) {
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return mr;
+
+}));
\ No newline at end of file
index 7072c2f..e353173 100644 (file)
@@ -1,19 +1,17 @@
-// moment.js locale configuration
-// locale : Bahasa Malaysia (ms-MY)
-// author : Weldan Jamili : https://github.com/weldan
+//! moment.js locale configuration
+//! locale : Malay [ms-my]
+//! note : DEPRECATED, the correct one is [ms]
+//! author : Weldan Jamili : https://github.com/weldan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('ms-my', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ms_my = moment.defineLocale('ms-my', {
         months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
         monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
         weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
         weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
         longDateFormat : {
             LT : 'HH.mm',
-            LTS : 'LT.ss',
+            LTS : 'HH.mm.ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY [pukul] LT',
-            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /pagi|tengahari|petang|malam/,
+        meridiemHour: function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'pagi') {
+                return hour;
+            } else if (meridiem === 'tengahari') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'petang' || meridiem === 'malam') {
+                return hour + 12;
+            }
         },
         meridiem : function (hours, minutes, isLower) {
             if (hours < 11) {
@@ -66,4 +77,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ms_my;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ms.js b/resources/lib/moment/locale/ms.js
new file mode 100644 (file)
index 0000000..280194c
--- /dev/null
@@ -0,0 +1,82 @@
+//! moment.js locale configuration
+//! locale : Malay [ms]
+//! author : Weldan Jamili : https://github.com/weldan
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var ms = moment.defineLocale('ms', {
+        months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
+        monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
+        weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
+        weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
+        weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
+        longDateFormat : {
+            LT : 'HH.mm',
+            LTS : 'HH.mm.ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY [pukul] HH.mm',
+            LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
+        },
+        meridiemParse: /pagi|tengahari|petang|malam/,
+        meridiemHour: function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'pagi') {
+                return hour;
+            } else if (meridiem === 'tengahari') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'petang' || meridiem === 'malam') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'pagi';
+            } else if (hours < 15) {
+                return 'tengahari';
+            } else if (hours < 19) {
+                return 'petang';
+            } else {
+                return 'malam';
+            }
+        },
+        calendar : {
+            sameDay : '[Hari ini pukul] LT',
+            nextDay : '[Esok pukul] LT',
+            nextWeek : 'dddd [pukul] LT',
+            lastDay : '[Kelmarin pukul] LT',
+            lastWeek : 'dddd [lepas pukul] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'dalam %s',
+            past : '%s yang lepas',
+            s : 'beberapa saat',
+            m : 'seminit',
+            mm : '%d minit',
+            h : 'sejam',
+            hh : '%d jam',
+            d : 'sehari',
+            dd : '%d hari',
+            M : 'sebulan',
+            MM : '%d bulan',
+            y : 'setahun',
+            yy : '%d tahun'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return ms;
+
+}));
\ No newline at end of file
index daba17d..0e7b86d 100644 (file)
@@ -1,18 +1,17 @@
-// moment.js locale configuration
-// locale : Burmese (my)
-// author : Squar team, mysquar.com
+//! moment.js locale configuration
+//! locale : Burmese [my]
+//! author : Squar team, mysquar.com
+//! author : David Rossellat : https://github.com/gholadr
+//! author : Tin Aung Lin : https://github.com/thanyawzinmin
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '၁',
         '2': '၂',
         '၉': '9',
         '၀': '0'
     };
-    return moment.defineLocale('my', {
+
+    var my = moment.defineLocale('my', {
         months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
         monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
         weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
-        weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
-        weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
         longDateFormat: {
             LT: 'HH:mm',
             LTS: 'HH:mm:ss',
             L: 'DD/MM/YYYY',
             LL: 'D MMMM YYYY',
-            LLL: 'D MMMM YYYY LT',
-            LLLL: 'dddd D MMMM YYYY LT'
+            LLL: 'D MMMM YYYY HH:mm',
+            LLLL: 'dddd D MMMM YYYY HH:mm'
         },
         calendar: {
             sameDay: '[ယနေ.] LT [မှာ]',
@@ -88,4 +89,7 @@
             doy: 4 // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return my;
+
+}));
\ No newline at end of file
index 4fab78b..592734d 100644 (file)
@@ -1,32 +1,31 @@
-// moment.js locale configuration
-// locale : norwegian bokmål (nb)
-// authors : Espen Hovlandsdal : https://github.com/rexxars
-//           Sigurd Gartmann : https://github.com/sigurdga
+//! moment.js locale configuration
+//! locale : Norwegian Bokmål [nb]
+//! authors : Espen Hovlandsdal : https://github.com/rexxars
+//!           Sigurd Gartmann : https://github.com/sigurdga
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('nb', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var nb = moment.defineLocale('nb', {
         months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
-        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
+        monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
-        weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'),
+        weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'),
         weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
-            LT : 'H.mm',
-            LTS : 'LT.ss',
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY [kl.] LT',
-            LLLL : 'dddd D. MMMM YYYY [kl.] LT'
+            LLL : 'D. MMMM YYYY [kl.] HH:mm',
+            LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
         },
         calendar : {
             sameDay: '[i dag kl.] LT',
@@ -38,7 +37,7 @@
         },
         relativeTime : {
             future : 'om %s',
-            past : 'for %s siden',
+            past : '%s siden',
             s : 'noen sekunder',
             m : 'ett minutt',
             mm : '%d minutter',
@@ -58,4 +57,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return nb;
+
+}));
\ No newline at end of file
index ad10165..85de195 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : nepali/nepalese
-// author : suvash : https://github.com/suvash
+//! moment.js locale configuration
+//! locale : Nepalese [ne]
+//! author : suvash : https://github.com/suvash
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var symbolMap = {
         '1': '१',
         '2': '२',
         '०': '0'
     };
 
-    return moment.defineLocale('ne', {
+    var ne = moment.defineLocale('ne', {
         months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
         monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
+        monthsParseExact : true,
         weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
         weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
-        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split('_'),
+        weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'Aको h:mm बजे',
             LTS : 'Aको h:mm:ss बजे',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, Aको h:mm बजे',
+            LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे'
         },
         preparse: function (string) {
             return string.replace(/[१२३४५६७८९०]/g, function (match) {
                 return symbolMap[match];
             });
         },
+        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'राति') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'बिहान') {
+                return hour;
+            } else if (meridiem === 'दिउँसो') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'साँझ') {
+                return hour + 12;
+            }
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 3) {
-                return 'रातà¥\80';
-            } else if (hour < 10) {
+                return 'राति';
+            } else if (hour < 12) {
                 return 'बिहान';
-            } else if (hour < 15) {
+            } else if (hour < 16) {
                 return 'दिउँसो';
-            } else if (hour < 18) {
-                return 'बेलुका';
             } else if (hour < 20) {
                 return 'साँझ';
             } else {
-                return 'रातà¥\80';
+                return 'राति';
             }
         },
         calendar : {
             sameDay : '[आज] LT',
-            nextDay : '[भà¥\8bलà¥\80] LT',
+            nextDay : '[भà¥\8bलि] LT',
             nextWeek : '[आउँदो] dddd[,] LT',
             lastDay : '[हिजो] LT',
             lastWeek : '[गएको] dddd[,] LT',
@@ -87,8 +99,8 @@
         },
         relativeTime : {
             future : '%sमा',
-            past : '%s à¤\85à¤\97ाडà¥\80',
-            s : 'à¤\95à¥\87हà¥\80 à¤¸à¤®à¤¯',
+            past : '%s à¤\85à¤\97ाडि',
+            s : 'à¤\95à¥\87हà¥\80 à¤\95à¥\8dषण',
             m : 'एक मिनेट',
             mm : '%d मिनेट',
             h : 'एक घण्टा',
             yy : '%d बर्ष'
         },
         week : {
-            dow : 1, // Monday is the first day of the week.
-            doy : 7  // The week that contains Jan 1st is the first week of the year.
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ne;
+
+}));
\ No newline at end of file
index 871760d..9374101 100644 (file)
@@ -1,22 +1,23 @@
-// moment.js locale configuration
-// locale : dutch (nl)
-// author : Joris Röling : https://github.com/jjupiter
+//! moment.js locale configuration
+//! locale : Dutch [nl]
+//! author : Joris Röling : https://github.com/jorisroling
+//! author : Jacob Middag : https://github.com/middagj
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
         monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
 
-    return moment.defineLocale('nl', {
+    var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i];
+    var monthsRegex = /^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;
+
+    var nl = moment.defineLocale('nl', {
         months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
         monthsShort : function (m, format) {
             if (/-MMM-/.test(format)) {
                 return monthsShortWithDots[m.month()];
             }
         },
+
+        monthsRegex: monthsRegex,
+        monthsShortRegex: monthsRegex,
+        monthsStrictRegex: /^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,
+        monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,
+
+        monthsParse : monthsParse,
+        longMonthsParse : monthsParse,
+        shortMonthsParse : monthsParse,
+
         weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
         weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
         weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD-MM-YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[vandaag om] LT',
@@ -68,4 +80,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return nl;
+
+}));
\ No newline at end of file
index de8deff..cb3307d 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : norwegian nynorsk (nn)
-// author : https://github.com/mechuwind
+//! moment.js locale configuration
+//! locale : Nynorsk [nn]
+//! author : https://github.com/mechuwind
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('nn', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var nn = moment.defineLocale('nn', {
         months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
         monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
         weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
         weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
-            LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LL : 'D. MMMM YYYY',
+            LLL : 'D. MMMM YYYY [kl.] H:mm',
+            LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm'
         },
         calendar : {
             sameDay: '[I dag klokka] LT',
@@ -37,7 +34,7 @@
         },
         relativeTime : {
             future : 'om %s',
-            past : 'for %s sidan',
+            past : '%s sidan',
             s : 'nokre sekund',
             m : 'eit minutt',
             mm : '%d minutt',
@@ -57,4 +54,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return nn;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/pa-in.js b/resources/lib/moment/locale/pa-in.js
new file mode 100644 (file)
index 0000000..595174f
--- /dev/null
@@ -0,0 +1,124 @@
+//! moment.js locale configuration
+//! locale : Punjabi (India) [pa-in]
+//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var symbolMap = {
+        '1': '੧',
+        '2': '੨',
+        '3': '੩',
+        '4': '੪',
+        '5': '੫',
+        '6': '੬',
+        '7': '੭',
+        '8': '੮',
+        '9': '੯',
+        '0': '੦'
+    },
+    numberMap = {
+        '੧': '1',
+        '੨': '2',
+        '੩': '3',
+        '੪': '4',
+        '੫': '5',
+        '੬': '6',
+        '੭': '7',
+        '੮': '8',
+        '੯': '9',
+        '੦': '0'
+    };
+
+    var pa_in = moment.defineLocale('pa-in', {
+        // There are months name as per Nanakshahi Calender but they are not used as rigidly in modern Punjabi.
+        months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+        monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'),
+        weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'),
+        weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+        weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm ਵਜੇ',
+            LTS : 'A h:mm:ss ਵਜੇ',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, A h:mm ਵਜੇ',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ'
+        },
+        calendar : {
+            sameDay : '[ਅਜ] LT',
+            nextDay : '[ਕਲ] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[ਕਲ] LT',
+            lastWeek : '[ਪਿਛਲੇ] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s ਵਿੱਚ',
+            past : '%s ਪਿਛਲੇ',
+            s : 'ਕੁਝ ਸਕਿੰਟ',
+            m : 'ਇਕ ਮਿੰਟ',
+            mm : '%d ਮਿੰਟ',
+            h : 'ਇੱਕ ਘੰਟਾ',
+            hh : '%d ਘੰਟੇ',
+            d : 'ਇੱਕ ਦਿਨ',
+            dd : '%d ਦਿਨ',
+            M : 'ਇੱਕ ਮਹੀਨਾ',
+            MM : '%d ਮਹੀਨੇ',
+            y : 'ਇੱਕ ਸਾਲ',
+            yy : '%d ਸਾਲ'
+        },
+        preparse: function (string) {
+            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
+                return numberMap[match];
+            });
+        },
+        postformat: function (string) {
+            return string.replace(/\d/g, function (match) {
+                return symbolMap[match];
+            });
+        },
+        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
+        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
+        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'ਰਾਤ') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'ਸਵੇਰ') {
+                return hour;
+            } else if (meridiem === 'ਦੁਪਹਿਰ') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'ਸ਼ਾਮ') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'ਰਾਤ';
+            } else if (hour < 10) {
+                return 'ਸਵੇਰ';
+            } else if (hour < 17) {
+                return 'ਦੁਪਹਿਰ';
+            } else if (hour < 20) {
+                return 'ਸ਼ਾਮ';
+            } else {
+                return 'ਰਾਤ';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return pa_in;
+
+}));
\ No newline at end of file
index 167b4b4..0a861d1 100644 (file)
@@ -1,46 +1,46 @@
-// moment.js locale configuration
-// locale : polish (pl)
-// author : Rafal Hirsz : https://github.com/evoL
+//! moment.js locale configuration
+//! locale : Polish [pl]
+//! author : Rafal Hirsz : https://github.com/evoL
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
         monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
-
     function plural(n) {
         return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
     }
-
     function translate(number, withoutSuffix, key) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'minuta' : 'minutę';
-        case 'mm':
-            return result + (plural(number) ? 'minuty' : 'minut');
-        case 'h':
-            return withoutSuffix  ? 'godzina'  : 'godzinę';
-        case 'hh':
-            return result + (plural(number) ? 'godziny' : 'godzin');
-        case 'MM':
-            return result + (plural(number) ? 'miesiące' : 'miesięcy');
-        case 'yy':
-            return result + (plural(number) ? 'lata' : 'lat');
+            case 'm':
+                return withoutSuffix ? 'minuta' : 'minutę';
+            case 'mm':
+                return result + (plural(number) ? 'minuty' : 'minut');
+            case 'h':
+                return withoutSuffix  ? 'godzina'  : 'godzinę';
+            case 'hh':
+                return result + (plural(number) ? 'godziny' : 'godzin');
+            case 'MM':
+                return result + (plural(number) ? 'miesiące' : 'miesięcy');
+            case 'yy':
+                return result + (plural(number) ? 'lata' : 'lat');
         }
     }
 
-    return moment.defineLocale('pl', {
+    var pl = moment.defineLocale('pl', {
         months : function (momentToFormat, format) {
-            if (/D MMMM/.test(format)) {
+            if (format === '') {
+                // Hack: if format empty we know this is used to generate
+                // RegExp by moment. Give then back both valid forms of months
+                // in RegExp ready format.
+                return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+            } else if (/D MMMM/.test(format)) {
                 return monthsSubjective[momentToFormat.month()];
             } else {
                 return monthsNominative[momentToFormat.month()];
         monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
         weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
         weekdaysShort : 'nie_pon_wt_śr_czw_pt_sb'.split('_'),
-        weekdaysMin : 'N_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
+        weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Dziś o] LT',
             lastDay: '[Wczoraj o] LT',
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[W zeszłą niedzielę o] LT';
-                case 3:
-                    return '[W zeszłą środę o] LT';
-                case 6:
-                    return '[W zeszłą sobotę o] LT';
-                default:
-                    return '[W zeszły] dddd [o] LT';
+                    case 0:
+                        return '[W zeszłą niedzielę o] LT';
+                    case 3:
+                        return '[W zeszłą środę o] LT';
+                    case 6:
+                        return '[W zeszłą sobotę o] LT';
+                    default:
+                        return '[W zeszły] dddd [o] LT';
                 }
             },
             sameElse: 'L'
@@ -99,4 +99,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return pl;
+
+}));
\ No newline at end of file
index 0c5d2c2..3227205 100644 (file)
@@ -1,31 +1,29 @@
-// moment.js locale configuration
-// locale : brazilian portuguese (pt-br)
-// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+//! moment.js locale configuration
+//! locale : Portuguese (Brazil) [pt-br]
+//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('pt-br', {
-        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
-        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
-        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
-        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
-        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var pt_br = moment.defineLocale('pt-br', {
+        months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+        monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+        weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
+        weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+        weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
-            LLL : 'D [de] MMMM [de] YYYY [às] LT',
-            LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT'
+            LLL : 'D [de] MMMM [de] YYYY [às] HH:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm'
         },
         calendar : {
             sameDay: '[Hoje às] LT',
@@ -42,7 +40,7 @@
         relativeTime : {
             future : 'em %s',
             past : '%s atrás',
-            s : 'segundos',
+            s : 'poucos segundos',
             m : 'um minuto',
             mm : '%d minutos',
             h : 'uma hora',
@@ -57,4 +55,7 @@
         ordinalParse: /\d{1,2}º/,
         ordinal : '%dº'
     });
-}));
+
+    return pt_br;
+
+}));
\ No newline at end of file
index ef9cb80..72c2a1b 100644 (file)
@@ -1,31 +1,29 @@
-// moment.js locale configuration
-// locale : portuguese (pt)
-// author : Jefferson : https://github.com/jalex79
+//! moment.js locale configuration
+//! locale : Portuguese [pt]
+//! author : Jefferson : https://github.com/jalex79
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('pt', {
-        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
-        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
-        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
-        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
-        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var pt = moment.defineLocale('pt', {
+        months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+        monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+        weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+        weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+        weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D [de] MMMM [de] YYYY',
-            LLL : 'D [de] MMMM [de] YYYY LT',
-            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
+            LLL : 'D [de] MMMM [de] YYYY HH:mm',
+            LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Hoje às] LT',
@@ -61,4 +59,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return pt;
+
+}));
\ No newline at end of file
index 7b2c93d..78b325a 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : romanian (ro)
-// author : Vlad Gurdiga : https://github.com/gurdiga
-// author : Valentin Agachi : https://github.com/avaly
+//! moment.js locale configuration
+//! locale : Romanian [ro]
+//! author : Vlad Gurdiga : https://github.com/gurdiga
+//! author : Valentin Agachi : https://github.com/avaly
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
                 'mm': 'minute',
         if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
             separator = ' de ';
         }
-
         return number + separator + format[key];
     }
 
-    return moment.defineLocale('ro', {
+    var ro = moment.defineLocale('ro', {
         months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
         monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
         weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
         weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
             LLL : 'D MMMM YYYY H:mm',
@@ -72,4 +69,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ro;
+
+}));
\ No newline at end of file
index 65265da..faa3cc2 100644 (file)
@@ -1,24 +1,21 @@
-// moment.js locale configuration
-// locale : russian (ru)
-// author : Viktorminator : https://github.com/Viktorminator
-// Author : Menelion Elensúle : https://github.com/Oire
+//! moment.js locale configuration
+//! locale : Russian [ru]
+//! author : Viktorminator : https://github.com/Viktorminator
+//! Author : Menelion Elensúle : https://github.com/Oire
+//! author : Коренберг Марк : https://github.com/socketpair
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(word, num) {
         var forms = word.split('_');
         return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
             'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
             return number + ' ' + plural(format[key], +number);
         }
     }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
-            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
+    var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i];
+
+    // http://new.gramota.ru/spravka/rules/139-prop : § 103
+    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
+    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
+    var ru = moment.defineLocale('ru', {
+        months : {
+            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'),
+            standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_')
         },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
-    function monthsShortCaseReplace(m, format) {
-        var monthsShort = {
-            'nominative': 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
-            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
+        monthsShort : {
+            // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ?
+            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'),
+            standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_')
         },
-
-        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return monthsShort[nounCase][m.month()];
-    }
-
-    function weekdaysCaseReplace(m, format) {
-        var weekdays = {
-            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
-            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
+        weekdays : {
+            standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
+            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'),
+            isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
         },
+        weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+        weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
+        monthsParse : monthsParse,
+        longMonthsParse : monthsParse,
+        shortMonthsParse : monthsParse,
 
-        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/).test(format) ?
-            'accusative' :
-            'nominative';
+        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
+        monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
 
-        return weekdays[nounCase][m.day()];
-    }
+        // копия предыдущего
+        monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,
 
-    return moment.defineLocale('ru', {
-        months : monthsCaseReplace,
-        monthsShort : monthsShortCaseReplace,
-        weekdays : weekdaysCaseReplace,
-        weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
-        weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
-        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
+        // полные названия с падежами
+        monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,
+
+        // Выражение, которое соотвествует только сокращённым формам
+        monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY г.',
-            LLL : 'D MMMM YYYY г., LT',
-            LLLL : 'dddd, D MMMM YYYY г., LT'
+            LLL : 'D MMMM YYYY г., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY г., HH:mm'
         },
         calendar : {
             sameDay: '[Сегодня в] LT',
             nextDay: '[Завтра в] LT',
             lastDay: '[Вчера в] LT',
-            nextWeek: function () {
-                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+            nextWeek: function (now) {
+                if (now.week() !== this.week()) {
+                    switch (this.day()) {
+                        case 0:
+                            return '[В следующее] dddd [в] LT';
+                        case 1:
+                        case 2:
+                        case 4:
+                            return '[В следующий] dddd [в] LT';
+                        case 3:
+                        case 5:
+                        case 6:
+                            return '[В следующую] dddd [в] LT';
+                    }
+                } else {
+                    if (this.day() === 2) {
+                        return '[Во] dddd [в] LT';
+                    } else {
+                        return '[В] dddd [в] LT';
+                    }
+                }
             },
             lastWeek: function (now) {
                 if (now.week() !== this.week()) {
                     switch (this.day()) {
-                    case 0:
-                        return '[В прошлое] dddd [в] LT';
-                    case 1:
-                    case 2:
-                    case 4:
-                        return '[В прошлый] dddd [в] LT';
-                    case 3:
-                    case 5:
-                    case 6:
-                        return '[В прошлую] dddd [в] LT';
+                        case 0:
+                            return '[В прошлое] dddd [в] LT';
+                        case 1:
+                        case 2:
+                        case 4:
+                            return '[В прошлый] dddd [в] LT';
+                        case 3:
+                        case 5:
+                        case 6:
+                            return '[В прошлую] dddd [в] LT';
                     }
                 } else {
                     if (this.day() === 2) {
             y : 'год',
             yy : relativeTimeWithPlural
         },
-
         meridiemParse: /ночи|утра|дня|вечера/i,
         isPM : function (input) {
             return /^(дня|вечера)$/.test(input);
         },
-
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'ночи';
                 return 'вечера';
             }
         },
-
         ordinalParse: /\d{1,2}-(й|го|я)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            case 'w':
-            case 'W':
-                return number + '-я';
-            default:
-                return number;
+                case 'M':
+                case 'd':
+                case 'DDD':
+                    return number + '-й';
+                case 'D':
+                    return number + '-го';
+                case 'w':
+                case 'W':
+                    return number + '-я';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ru;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/se.js b/resources/lib/moment/locale/se.js
new file mode 100644 (file)
index 0000000..4ed6afb
--- /dev/null
@@ -0,0 +1,61 @@
+//! moment.js locale configuration
+//! locale : Northern Sami [se]
+//! authors : Bård Rolstad Henriksen : https://github.com/karamell
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+
+    var se = moment.defineLocale('se', {
+        months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'),
+        monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
+        weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'),
+        weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
+        weekdaysMin : 's_v_m_g_d_b_L'.split('_'),
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'MMMM D. [b.] YYYY',
+            LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm',
+            LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm'
+        },
+        calendar : {
+            sameDay: '[otne ti] LT',
+            nextDay: '[ihttin ti] LT',
+            nextWeek: 'dddd [ti] LT',
+            lastDay: '[ikte ti] LT',
+            lastWeek: '[ovddit] dddd [ti] LT',
+            sameElse: 'L'
+        },
+        relativeTime : {
+            future : '%s geažes',
+            past : 'maŋit %s',
+            s : 'moadde sekunddat',
+            m : 'okta minuhta',
+            mm : '%d minuhtat',
+            h : 'okta diimmu',
+            hh : '%d diimmut',
+            d : 'okta beaivi',
+            dd : '%d beaivvit',
+            M : 'okta mánnu',
+            MM : '%d mánut',
+            y : 'okta jahki',
+            yy : '%d jagit'
+        },
+        ordinalParse: /\d{1,2}\./,
+        ordinal : '%d.',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return se;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/si.js b/resources/lib/moment/locale/si.js
new file mode 100644 (file)
index 0000000..be2387a
--- /dev/null
@@ -0,0 +1,71 @@
+//! moment.js locale configuration
+//! locale : Sinhalese [si]
+//! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    /*jshint -W100*/
+    var si = moment.defineLocale('si', {
+        months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+        monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+        weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+        weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+        weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'a h:mm',
+            LTS : 'a h:mm:ss',
+            L : 'YYYY/MM/DD',
+            LL : 'YYYY MMMM D',
+            LLL : 'YYYY MMMM D, a h:mm',
+            LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss'
+        },
+        calendar : {
+            sameDay : '[අද] LT[ට]',
+            nextDay : '[හෙට] LT[ට]',
+            nextWeek : 'dddd LT[ට]',
+            lastDay : '[ඊයේ] LT[ට]',
+            lastWeek : '[පසුගිය] dddd LT[ට]',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%sකින්',
+            past : '%sකට පෙර',
+            s : 'තත්පර කිහිපය',
+            m : 'මිනිත්තුව',
+            mm : 'මිනිත්තු %d',
+            h : 'පැය',
+            hh : 'පැය %d',
+            d : 'දිනය',
+            dd : 'දින %d',
+            M : 'මාසය',
+            MM : 'මාස %d',
+            y : 'වසර',
+            yy : 'වසර %d'
+        },
+        ordinalParse: /\d{1,2} වැනි/,
+        ordinal : function (number) {
+            return number + ' වැනි';
+        },
+        meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
+        isPM : function (input) {
+            return input === 'ප.ව.' || input === 'පස් වරු';
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours > 11) {
+                return isLower ? 'ප.ව.' : 'පස් වරු';
+            } else {
+                return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+            }
+        }
+    });
+
+    return si;
+
+}));
\ No newline at end of file
index 7eae2f4..582ae7e 100644 (file)
-// moment.js locale configuration
-// locale : slovak (sk)
-// author : Martin Minka : https://github.com/k2s
-// based on work of petrbela : https://github.com/petrbela
+//! moment.js locale configuration
+//! locale : Slovak [sk]
+//! author : Martin Minka : https://github.com/k2s
+//! based on work of petrbela : https://github.com/petrbela
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
         monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
-
     function plural(n) {
         return (n > 1) && (n < 5);
     }
-
     function translate(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 's':  // a few seconds / in a few seconds / a few seconds ago
-            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
-        case 'm':  // a minute / in a minute / a minute ago
-            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
-        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'minúty' : 'minút');
-            } else {
-                return result + 'minútami';
-            }
-            break;
-        case 'h':  // an hour / in an hour / an hour ago
-            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
-        case 'hh': // 9 hours / in 9 hours / 9 hours ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'hodiny' : 'hodín');
-            } else {
-                return result + 'hodinami';
-            }
-            break;
-        case 'd':  // a day / in a day / a day ago
-            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
-        case 'dd': // 9 days / in 9 days / 9 days ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'dni' : 'dní');
-            } else {
-                return result + 'dňami';
-            }
-            break;
-        case 'M':  // a month / in a month / a month ago
-            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
-        case 'MM': // 9 months / in 9 months / 9 months ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'mesiace' : 'mesiacov');
-            } else {
-                return result + 'mesiacmi';
-            }
-            break;
-        case 'y':  // a year / in a year / a year ago
-            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
-        case 'yy': // 9 years / in 9 years / 9 years ago
-            if (withoutSuffix || isFuture) {
-                return result + (plural(number) ? 'roky' : 'rokov');
-            } else {
-                return result + 'rokmi';
-            }
-            break;
+            case 's':  // a few seconds / in a few seconds / a few seconds ago
+                return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+            case 'm':  // a minute / in a minute / a minute ago
+                return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'minúty' : 'minút');
+                } else {
+                    return result + 'minútami';
+                }
+                break;
+            case 'h':  // an hour / in an hour / an hour ago
+                return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+            case 'hh': // 9 hours / in 9 hours / 9 hours ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'hodiny' : 'hodín');
+                } else {
+                    return result + 'hodinami';
+                }
+                break;
+            case 'd':  // a day / in a day / a day ago
+                return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+            case 'dd': // 9 days / in 9 days / 9 days ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'dni' : 'dní');
+                } else {
+                    return result + 'dňami';
+                }
+                break;
+            case 'M':  // a month / in a month / a month ago
+                return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+            case 'MM': // 9 months / in 9 months / 9 months ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'mesiace' : 'mesiacov');
+                } else {
+                    return result + 'mesiacmi';
+                }
+                break;
+            case 'y':  // a year / in a year / a year ago
+                return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+            case 'yy': // 9 years / in 9 years / 9 years ago
+                if (withoutSuffix || isFuture) {
+                    return result + (plural(number) ? 'roky' : 'rokov');
+                } else {
+                    return result + 'rokmi';
+                }
+                break;
         }
     }
 
-    return moment.defineLocale('sk', {
+    var sk = moment.defineLocale('sk', {
         months : months,
         monthsShort : monthsShort,
-        monthsParse : (function (months, monthsShort) {
-            var i, _monthsParse = [];
-            for (i = 0; i < 12; i++) {
-                // use custom parser to solve problem with July (červenec)
-                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
-            }
-            return _monthsParse;
-        }(months, monthsShort)),
         weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
         weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
         weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
         longDateFormat : {
             LT: 'H:mm',
-            LTS : 'LT:ss',
+            LTS : 'H:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay: '[dnes o] LT',
             nextDay: '[zajtra o] LT',
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[v nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[v] dddd [o] LT';
-                case 3:
-                    return '[v stredu o] LT';
-                case 4:
-                    return '[vo štvrtok o] LT';
-                case 5:
-                    return '[v piatok o] LT';
-                case 6:
-                    return '[v sobotu o] LT';
+                    case 0:
+                        return '[v nedeľu o] LT';
+                    case 1:
+                    case 2:
+                        return '[v] dddd [o] LT';
+                    case 3:
+                        return '[v stredu o] LT';
+                    case 4:
+                        return '[vo štvrtok o] LT';
+                    case 5:
+                        return '[v piatok o] LT';
+                    case 6:
+                        return '[v sobotu o] LT';
                 }
             },
             lastDay: '[včera o] LT',
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[minulú nedeľu o] LT';
-                case 1:
-                case 2:
-                    return '[minulý] dddd [o] LT';
-                case 3:
-                    return '[minulú stredu o] LT';
-                case 4:
-                case 5:
-                    return '[minulý] dddd [o] LT';
-                case 6:
-                    return '[minulú sobotu o] LT';
+                    case 0:
+                        return '[minulú nedeľu o] LT';
+                    case 1:
+                    case 2:
+                        return '[minulý] dddd [o] LT';
+                    case 3:
+                        return '[minulú stredu o] LT';
+                    case 4:
+                    case 5:
+                        return '[minulý] dddd [o] LT';
+                    case 6:
+                        return '[minulú sobotu o] LT';
                 }
             },
             sameElse: 'L'
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return sk;
+
+}));
\ No newline at end of file
index 54fe37d..3371f6b 100644 (file)
-// moment.js locale configuration
-// locale : slovenian (sl)
-// author : Robert Sedovšek : https://github.com/sedovsek
+//! moment.js locale configuration
+//! locale : Slovenian [sl]
+//! author : Robert Sedovšek : https://github.com/sedovsek
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    function translate(number, withoutSuffix, key) {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    function processRelativeTime(number, withoutSuffix, key, isFuture) {
         var result = number + ' ';
         switch (key) {
-        case 'm':
-            return withoutSuffix ? 'ena minuta' : 'eno minuto';
-        case 'mm':
-            if (number === 1) {
-                result += 'minuta';
-            } else if (number === 2) {
-                result += 'minuti';
-            } else if (number === 3 || number === 4) {
-                result += 'minute';
-            } else {
-                result += 'minut';
-            }
-            return result;
-        case 'h':
-            return withoutSuffix ? 'ena ura' : 'eno uro';
-        case 'hh':
-            if (number === 1) {
-                result += 'ura';
-            } else if (number === 2) {
-                result += 'uri';
-            } else if (number === 3 || number === 4) {
-                result += 'ure';
-            } else {
-                result += 'ur';
-            }
-            return result;
-        case 'dd':
-            if (number === 1) {
-                result += 'dan';
-            } else {
-                result += 'dni';
-            }
-            return result;
-        case 'MM':
-            if (number === 1) {
-                result += 'mesec';
-            } else if (number === 2) {
-                result += 'meseca';
-            } else if (number === 3 || number === 4) {
-                result += 'mesece';
-            } else {
-                result += 'mesecev';
-            }
-            return result;
-        case 'yy':
-            if (number === 1) {
-                result += 'leto';
-            } else if (number === 2) {
-                result += 'leti';
-            } else if (number === 3 || number === 4) {
-                result += 'leta';
-            } else {
-                result += 'let';
-            }
-            return result;
+            case 's':
+                return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
+            case 'm':
+                return withoutSuffix ? 'ena minuta' : 'eno minuto';
+            case 'mm':
+                if (number === 1) {
+                    result += withoutSuffix ? 'minuta' : 'minuto';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';
+                } else {
+                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';
+                }
+                return result;
+            case 'h':
+                return withoutSuffix ? 'ena ura' : 'eno uro';
+            case 'hh':
+                if (number === 1) {
+                    result += withoutSuffix ? 'ura' : 'uro';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'uri' : 'urama';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'ure' : 'urami';
+                } else {
+                    result += withoutSuffix || isFuture ? 'ur' : 'urami';
+                }
+                return result;
+            case 'd':
+                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
+            case 'dd':
+                if (number === 1) {
+                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
+                } else {
+                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
+                }
+                return result;
+            case 'M':
+                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
+            case 'MM':
+                if (number === 1) {
+                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
+                } else {
+                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
+                }
+                return result;
+            case 'y':
+                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
+            case 'yy':
+                if (number === 1) {
+                    result += withoutSuffix || isFuture ? 'leto' : 'letom';
+                } else if (number === 2) {
+                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+                } else if (number < 5) {
+                    result += withoutSuffix || isFuture ? 'leta' : 'leti';
+                } else {
+                    result += withoutSuffix || isFuture ? 'let' : 'leti';
+                }
+                return result;
         }
     }
 
-    return moment.defineLocale('sl', {
+    var sl = moment.defineLocale('sl', {
         months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
         monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
         weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
         weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
             LT : 'H:mm',
-            LTS : 'LT:ss',
-            L : 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L : 'DD.MM.YYYY',
             LL : 'D. MMMM YYYY',
-            LLL : 'D. MMMM YYYY LT',
-            LLLL : 'dddd, D. MMMM YYYY LT'
+            LLL : 'D. MMMM YYYY H:mm',
+            LLLL : 'dddd, D. MMMM YYYY H:mm'
         },
         calendar : {
             sameDay  : '[danes ob] LT',
 
             nextWeek : function () {
                 switch (this.day()) {
-                case 0:
-                    return '[v] [nedeljo] [ob] LT';
-                case 3:
-                    return '[v] [sredo] [ob] LT';
-                case 6:
-                    return '[v] [soboto] [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[v] dddd [ob] LT';
+                    case 0:
+                        return '[v] [nedeljo] [ob] LT';
+                    case 3:
+                        return '[v] [sredo] [ob] LT';
+                    case 6:
+                        return '[v] [soboto] [ob] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[v] dddd [ob] LT';
                 }
             },
             lastDay  : '[včeraj ob] LT',
             lastWeek : function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 6:
-                    return '[prejšnja] dddd [ob] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[prejšnji] dddd [ob] LT';
+                    case 0:
+                        return '[prejšnjo] [nedeljo] [ob] LT';
+                    case 3:
+                        return '[prejšnjo] [sredo] [ob] LT';
+                    case 6:
+                        return '[prejšnjo] [soboto] [ob] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[prejšnji] dddd [ob] LT';
                 }
             },
             sameElse : 'L'
         },
         relativeTime : {
             future : 'čez %s',
-            past   : '%s nazaj',
-            s      : 'nekaj sekund',
-            m      : translate,
-            mm     : translate,
-            h      : translate,
-            hh     : translate,
-            d      : 'en dan',
-            dd     : translate,
-            M      : 'en mesec',
-            MM     : translate,
-            y      : 'eno leto',
-            yy     : translate
+            past   : 'pred %s',
+            s      : processRelativeTime,
+            m      : processRelativeTime,
+            mm     : processRelativeTime,
+            h      : processRelativeTime,
+            hh     : processRelativeTime,
+            d      : processRelativeTime,
+            dd     : processRelativeTime,
+            M      : processRelativeTime,
+            MM     : processRelativeTime,
+            y      : processRelativeTime,
+            yy     : processRelativeTime
         },
         ordinalParse: /\d{1,2}\./,
         ordinal : '%d.',
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return sl;
+
+}));
\ No newline at end of file
index 89cd7ba..c224cac 100644 (file)
@@ -1,36 +1,38 @@
-// moment.js locale configuration
-// locale : Albanian (sq)
-// author : Flakërim Ismani : https://github.com/flakerimi
-// author: Menelion Elensúle: https://github.com/Oire (tests)
-// author : Oerd Cukalla : https://github.com/oerd (fixes)
+//! moment.js locale configuration
+//! locale : Albanian [sq]
+//! author : Flakërim Ismani : https://github.com/flakerimi
+//! author : Menelion Elensúle : https://github.com/Oire
+//! author : Oerd Cukalla : https://github.com/oerd
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('sq', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var sq = moment.defineLocale('sq', {
         months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
         monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
         weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
         weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
         weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+        weekdaysParseExact : true,
+        meridiemParse: /PD|MD/,
+        isPM: function (input) {
+            return input.charAt(0) === 'M';
+        },
         meridiem : function (hours, minutes, isLower) {
             return hours < 12 ? 'PD' : 'MD';
         },
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[Sot në] LT',
@@ -62,4 +64,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return sq;
+
+}));
\ No newline at end of file
index db1dea4..bf0df12 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Serbian-cyrillic (sr-cyrl)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+//! moment.js locale configuration
+//! locale : Serbian Cyrillic [sr-cyrl]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var translator = {
         words: { //Different grammatical cases
             m: ['један минут', 'једне минуте'],
         }
     };
 
-    return moment.defineLocale('sr-cyrl', {
-        months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],
-        monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'],
-        weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
-        weekdaysShort: ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'],
-        weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
+    var sr_cyrl = moment.defineLocale('sr-cyrl', {
+        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'),
+        monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
+        monthsParseExact: true,
+        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
+        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
+        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat: {
             LT: 'H:mm',
-            LTS : 'LT:ss',
-            L: 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
-            LLL: 'D. MMMM YYYY LT',
-            LLLL: 'dddd, D. MMMM YYYY LT'
+            LLL: 'D. MMMM YYYY H:mm',
+            LLLL: 'dddd, D. MMMM YYYY H:mm'
         },
         calendar: {
             sameDay: '[данас у] LT',
             nextDay: '[сутра у] LT',
-
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[у] [недељу] [у] LT';
-                case 3:
-                    return '[у] [среду] [у] LT';
-                case 6:
-                    return '[у] [суботу] [у] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[у] dddd [у] LT';
+                    case 0:
+                        return '[у] [недељу] [у] LT';
+                    case 3:
+                        return '[у] [среду] [у] LT';
+                    case 6:
+                        return '[у] [суботу] [у] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[у] dddd [у] LT';
                 }
             },
             lastDay  : '[јуче у] LT',
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return sr_cyrl;
+
+}));
\ No newline at end of file
index f732316..16f5dd0 100644 (file)
@@ -1,18 +1,15 @@
-// moment.js locale configuration
-// locale : Serbian-latin (sr)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+//! moment.js locale configuration
+//! locale : Serbian [sr]
+//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var translator = {
         words: { //Different grammatical cases
             m: ['jedan minut', 'jedne minute'],
         }
     };
 
-    return moment.defineLocale('sr', {
-        months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
-        monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
-        weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],
-        weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'],
-        weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
+    var sr = moment.defineLocale('sr', {
+        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'),
+        monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
+        monthsParseExact: true,
+        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'),
+        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
+        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat: {
             LT: 'H:mm',
-            LTS : 'LT:ss',
-            L: 'DD. MM. YYYY',
+            LTS : 'H:mm:ss',
+            L: 'DD.MM.YYYY',
             LL: 'D. MMMM YYYY',
-            LLL: 'D. MMMM YYYY LT',
-            LLLL: 'dddd, D. MMMM YYYY LT'
+            LLL: 'D. MMMM YYYY H:mm',
+            LLLL: 'dddd, D. MMMM YYYY H:mm'
         },
         calendar: {
             sameDay: '[danas u] LT',
             nextDay: '[sutra u] LT',
-
             nextWeek: function () {
                 switch (this.day()) {
-                case 0:
-                    return '[u] [nedelju] [u] LT';
-                case 3:
-                    return '[u] [sredu] [u] LT';
-                case 6:
-                    return '[u] [subotu] [u] LT';
-                case 1:
-                case 2:
-                case 4:
-                case 5:
-                    return '[u] dddd [u] LT';
+                    case 0:
+                        return '[u] [nedelju] [u] LT';
+                    case 3:
+                        return '[u] [sredu] [u] LT';
+                    case 6:
+                        return '[u] [subotu] [u] LT';
+                    case 1:
+                    case 2:
+                    case 4:
+                    case 5:
+                        return '[u] dddd [u] LT';
                 }
             },
             lastDay  : '[juče u] LT',
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return sr;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/ss.js b/resources/lib/moment/locale/ss.js
new file mode 100644 (file)
index 0000000..e1d942e
--- /dev/null
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : siSwati [ss]
+//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+
+    var ss = moment.defineLocale('ss', {
+        months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'),
+        monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
+        weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'),
+        weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
+        weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'h:mm A',
+            LTS : 'h:mm:ss A',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY h:mm A',
+            LLLL : 'dddd, D MMMM YYYY h:mm A'
+        },
+        calendar : {
+            sameDay : '[Namuhla nga] LT',
+            nextDay : '[Kusasa nga] LT',
+            nextWeek : 'dddd [nga] LT',
+            lastDay : '[Itolo nga] LT',
+            lastWeek : 'dddd [leliphelile] [nga] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'nga %s',
+            past : 'wenteka nga %s',
+            s : 'emizuzwana lomcane',
+            m : 'umzuzu',
+            mm : '%d emizuzu',
+            h : 'lihora',
+            hh : '%d emahora',
+            d : 'lilanga',
+            dd : '%d emalanga',
+            M : 'inyanga',
+            MM : '%d tinyanga',
+            y : 'umnyaka',
+            yy : '%d iminyaka'
+        },
+        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 11) {
+                return 'ekuseni';
+            } else if (hours < 15) {
+                return 'emini';
+            } else if (hours < 19) {
+                return 'entsambama';
+            } else {
+                return 'ebusuku';
+            }
+        },
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'ekuseni') {
+                return hour;
+            } else if (meridiem === 'emini') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
+                if (hour === 0) {
+                    return 0;
+                }
+                return hour + 12;
+            }
+        },
+        ordinalParse: /\d{1,2}/,
+        ordinal : '%d',
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return ss;
+
+}));
\ No newline at end of file
index 48c3dee..a77c3e1 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : swedish (sv)
-// author : Jens Alm : https://github.com/ulmus
+//! moment.js locale configuration
+//! locale : Swedish [sv]
+//! author : Jens Alm : https://github.com/ulmus
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('sv', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var sv = moment.defineLocale('sv', {
         months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
         monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
         weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
         weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'YYYY-MM-DD',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY [kl.] HH:mm',
+            LLLL : 'dddd D MMMM YYYY [kl.] HH:mm',
+            lll : 'D MMM YYYY HH:mm',
+            llll : 'ddd D MMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Idag] LT',
             nextDay: '[Imorgon] LT',
             lastDay: '[Igår] LT',
-            nextWeek: 'dddd LT',
-            lastWeek: '[Förra] dddd[en] LT',
+            nextWeek: '[På] dddd LT',
+            lastWeek: '[I] dddd[s] LT',
             sameElse: 'L'
         },
         relativeTime : {
@@ -64,4 +63,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return sv;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/sw.js b/resources/lib/moment/locale/sw.js
new file mode 100644 (file)
index 0000000..1458d89
--- /dev/null
@@ -0,0 +1,59 @@
+//! moment.js locale configuration
+//! locale : Swahili [sw]
+//! author : Fahad Kassim : https://github.com/fadsel
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var sw = moment.defineLocale('sw', {
+        months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'),
+        monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
+        weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'),
+        weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
+        weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            LTS : 'HH:mm:ss',
+            L : 'DD.MM.YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[leo saa] LT',
+            nextDay : '[kesho saa] LT',
+            nextWeek : '[wiki ijayo] dddd [saat] LT',
+            lastDay : '[jana] LT',
+            lastWeek : '[wiki iliyopita] dddd [saat] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s baadaye',
+            past : 'tokea %s',
+            s : 'hivi punde',
+            m : 'dakika moja',
+            mm : 'dakika %d',
+            h : 'saa limoja',
+            hh : 'masaa %d',
+            d : 'siku moja',
+            dd : 'masiku %d',
+            M : 'mwezi mmoja',
+            MM : 'miezi %d',
+            y : 'mwaka mmoja',
+            yy : 'miaka %d'
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 7  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return sw;
+
+}));
\ No newline at end of file
index 7e73599..c04fa58 100644 (file)
@@ -1,44 +1,40 @@
-// moment.js locale configuration
-// locale : tamil (ta)
-// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+//! moment.js locale configuration
+//! locale : Tamil [ta]
+//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    /*var symbolMap = {
-            '1': '௧',
-            '2': '௨',
-            '3': '௩',
-            '4': '௪',
-            '5': '௫',
-            '6': '௬',
-            '7': '௭',
-            '8': '௮',
-            '9': '௯',
-            '0': '௦'
-        },
-        numberMap = {
-            '௧': '1',
-            '௨': '2',
-            '௩': '3',
-            '௪': '4',
-            '௫': '5',
-            '௬': '6',
-            '௭': '7',
-            '௮': '8',
-            '௯': '9',
-            '௦': '0'
-        }; */
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var symbolMap = {
+        '1': '௧',
+        '2': '௨',
+        '3': '௩',
+        '4': '௪',
+        '5': '௫',
+        '6': '௬',
+        '7': '௭',
+        '8': '௮',
+        '9': '௯',
+        '0': '௦'
+    }, numberMap = {
+        '௧': '1',
+        '௨': '2',
+        '௩': '3',
+        '௪': '4',
+        '௫': '5',
+        '௬': '6',
+        '௭': '7',
+        '௮': '8',
+        '௯': '9',
+        '௦': '0'
+    };
 
-    return moment.defineLocale('ta', {
+    var ta = moment.defineLocale('ta', {
         months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
         monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
         weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
         weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY, LT',
-            LLLL : 'dddd, D MMMM YYYY, LT'
+            LLL : 'D MMMM YYYY, HH:mm',
+            LLLL : 'dddd, D MMMM YYYY, HH:mm'
         },
         calendar : {
             sameDay : '[இன்று] LT',
             y : 'ஒரு வருடம்',
             yy : '%d ஆண்டுகள்'
         },
-/*        preparse: function (string) {
+        ordinalParse: /\d{1,2}வது/,
+        ordinal : function (number) {
+            return number + 'வது';
+        },
+        preparse: function (string) {
             return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
                 return numberMap[match];
             });
             return string.replace(/\d/g, function (match) {
                 return symbolMap[match];
             });
-        },*/
-        ordinalParse: /\d{1,2}வது/,
-        ordinal : function (number) {
-            return number + 'வது';
         },
-
-
         // refer http://ta.wikipedia.org/s/1er1
-
+        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
         meridiem : function (hour, minute, isLower) {
-            if (hour >= 6 && hour <= 10) {
-                return ' காலை';
-            } else if (hour >= 10 && hour <= 14) {
-                return ' நண்பகல்';
-            } else if (hour >= 14 && hour <= 18) {
-                return ' எற்பாடு';
-            } else if (hour >= 18 && hour <= 20) {
-                return ' மாலை';
-            } else if (hour >= 20 && hour <= 24) {
-                return ' இரவு';
-            } else if (hour >= 0 && hour <= 6) {
-                return ' வைகறை';
+            if (hour < 2) {
+                return ' யாமம்';
+            } else if (hour < 6) {
+                return ' வைகறை';  // வைகறை
+            } else if (hour < 10) {
+                return ' காலை'; // காலை
+            } else if (hour < 14) {
+                return ' நண்பகல்'; // நண்பகல்
+            } else if (hour < 18) {
+                return ' எற்பாடு'; // எற்பாடு
+            } else if (hour < 22) {
+                return ' மாலை'; // மாலை
+            } else {
+                return ' யாமம்';
+            }
+        },
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'யாமம்') {
+                return hour < 2 ? hour : hour + 12;
+            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+                return hour;
+            } else if (meridiem === 'நண்பகல்') {
+                return hour >= 10 ? hour : hour + 12;
+            } else {
+                return hour + 12;
             }
         },
         week : {
             doy : 6  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return ta;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/te.js b/resources/lib/moment/locale/te.js
new file mode 100644 (file)
index 0000000..1061ad2
--- /dev/null
@@ -0,0 +1,89 @@
+//! moment.js locale configuration
+//! locale : Telugu [te]
+//! author : Krishna Chaitanya Thota : https://github.com/kcthota
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var te = moment.defineLocale('te', {
+        months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జూలై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'),
+        monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జూలై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'),
+        monthsParseExact : true,
+        weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'),
+        weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
+        weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
+        longDateFormat : {
+            LT : 'A h:mm',
+            LTS : 'A h:mm:ss',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY, A h:mm',
+            LLLL : 'dddd, D MMMM YYYY, A h:mm'
+        },
+        calendar : {
+            sameDay : '[నేడు] LT',
+            nextDay : '[రేపు] LT',
+            nextWeek : 'dddd, LT',
+            lastDay : '[నిన్న] LT',
+            lastWeek : '[గత] dddd, LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : '%s లో',
+            past : '%s క్రితం',
+            s : 'కొన్ని క్షణాలు',
+            m : 'ఒక నిమిషం',
+            mm : '%d నిమిషాలు',
+            h : 'ఒక గంట',
+            hh : '%d గంటలు',
+            d : 'ఒక రోజు',
+            dd : '%d రోజులు',
+            M : 'ఒక నెల',
+            MM : '%d నెలలు',
+            y : 'ఒక సంవత్సరం',
+            yy : '%d సంవత్సరాలు'
+        },
+        ordinalParse : /\d{1,2}వ/,
+        ordinal : '%dవ',
+        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === 'రాత్రి') {
+                return hour < 4 ? hour : hour + 12;
+            } else if (meridiem === 'ఉదయం') {
+                return hour;
+            } else if (meridiem === 'మధ్యాహ్నం') {
+                return hour >= 10 ? hour : hour + 12;
+            } else if (meridiem === 'సాయంత్రం') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hour, minute, isLower) {
+            if (hour < 4) {
+                return 'రాత్రి';
+            } else if (hour < 10) {
+                return 'ఉదయం';
+            } else if (hour < 17) {
+                return 'మధ్యాహ్నం';
+            } else if (hour < 20) {
+                return 'సాయంత్రం';
+            } else {
+                return 'రాత్రి';
+            }
+        },
+        week : {
+            dow : 0, // Sunday is the first day of the week.
+            doy : 6  // The week that contains Jan 1st is the first week of the year.
+        }
+    });
+
+    return te;
+
+}));
\ No newline at end of file
index fc949cb..779968e 100644 (file)
@@ -1,31 +1,34 @@
-// moment.js locale configuration
-// locale : thai (th)
-// author : Kridsada Thanabulpong : https://github.com/sirn
+//! moment.js locale configuration
+//! locale : Thai [th]
+//! author : Kridsada Thanabulpong : https://github.com/sirn
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('th', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var th = moment.defineLocale('th', {
         months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
-        monthsShort : 'มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา'.split('_'),
+        monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'),
+        monthsParseExact: true,
         weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
         weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
         weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
+        weekdaysParseExact : true,
         longDateFormat : {
-            LT : 'H นาฬิกา m นาที',
-            LTS : 'LT s วินาที',
+            LT : 'H:mm',
+            LTS : 'H:mm:ss',
             L : 'YYYY/MM/DD',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY เวลา LT',
-            LLLL : 'วันddddที่ D MMMM YYYY เวลา LT'
+            LLL : 'D MMMM YYYY เวลา H:mm',
+            LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm'
+        },
+        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+        isPM: function (input) {
+            return input === 'หลังเที่ยง';
         },
         meridiem : function (hour, minute, isLower) {
             if (hour < 12) {
@@ -58,4 +61,7 @@
             yy : '%d ปี'
         }
     });
-}));
+
+    return th;
+
+}));
\ No newline at end of file
index 910c681..8c3448c 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : Tagalog/Filipino (tl-ph)
-// author : Dan Hagman
+//! moment.js locale configuration
+//! locale : Tagalog (Philippines) [tl-ph]
+//! author : Dan Hagman : https://github.com/hagmandan
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('tl-ph', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var tl_ph = moment.defineLocale('tl-ph', {
         months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
         monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
         weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
         weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'MM/D/YYYY',
             LL : 'MMMM D, YYYY',
-            LLL : 'MMMM D, YYYY LT',
-            LLLL : 'dddd, MMMM DD, YYYY LT'
+            LLL : 'MMMM D, YYYY HH:mm',
+            LLLL : 'dddd, MMMM DD, YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Ngayon sa] LT',
@@ -59,4 +56,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return tl_ph;
+
+}));
\ No newline at end of file
index a2707bc..c88ed7e 100644 (file)
@@ -1,46 +1,38 @@
-// moment.js locale configuration
-// locale : turkish (tr)
-// authors : Erhan Gundogan : https://github.com/erhangundogan,
-//           Burak Yiğit Kaya: https://github.com/BYK
+//! moment.js locale configuration
+//! locale : Turkish [tr]
+//! authors : Erhan Gundogan : https://github.com/erhangundogan,
+//!           Burak Yiğit Kaya: https://github.com/BYK
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     var suffixes = {
         1: '\'inci',
         5: '\'inci',
         8: '\'inci',
         70: '\'inci',
         80: '\'inci',
-
         2: '\'nci',
         7: '\'nci',
         20: '\'nci',
         50: '\'nci',
-
         3: '\'üncü',
         4: '\'üncü',
         100: '\'üncü',
-
         6: '\'ncı',
-
         9: '\'uncu',
         10: '\'uncu',
         30: '\'uncu',
-
         60: '\'ıncı',
         90: '\'ıncı'
     };
 
-    return moment.defineLocale('tr', {
+    var tr = moment.defineLocale('tr', {
         months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
         monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
         weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
         weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd, D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay : '[bugün saat] LT',
@@ -85,7 +77,6 @@
             var a = number % 10,
                 b = number % 100 - a,
                 c = number >= 100 ? 100 : null;
-
             return number + (suffixes[a] || suffixes[b] || suffixes[c]);
         },
         week : {
@@ -93,4 +84,7 @@
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return tr;
+
+}));
\ No newline at end of file
index 9eefde5..ccf96b9 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
-// author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight Latin [tzm-latn]
+//! author : Abdel Said : https://github.com/abdelsaid
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('tzm-latn', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var tzm_latn = moment.defineLocale('tzm-latn', {
         months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
         monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
         weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
         weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[asdkh g] LT',
@@ -55,4 +52,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return tzm_latn;
+
+}));
\ No newline at end of file
index 0895298..71fb076 100644 (file)
@@ -1,19 +1,16 @@
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt (tzm)
-// author : Abdel Said : https://github.com/abdelsaid
+//! moment.js locale configuration
+//! locale : Central Atlas Tamazight [tzm]
+//! author : Abdel Said : https://github.com/abdelsaid
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('tzm', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var tzm = moment.defineLocale('tzm', {
         months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
         monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
         weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
         weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS: 'LT:ss',
+            LTS: 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'dddd D MMMM YYYY LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd D MMMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
@@ -55,4 +52,7 @@
             doy : 12  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return tzm;
+
+}));
\ No newline at end of file
index 32c51de..91ec18b 100644 (file)
@@ -1,28 +1,24 @@
-// moment.js locale configuration
-// locale : ukrainian (uk)
-// author : zemlanin : https://github.com/zemlanin
-// Author : Menelion Elensúle : https://github.com/Oire
+//! moment.js locale configuration
+//! locale : Ukrainian [uk]
+//! author : zemlanin : https://github.com/zemlanin
+//! Author : Menelion Elensúle : https://github.com/Oire
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
     function plural(word, num) {
         var forms = word.split('_');
         return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
     }
-
     function relativeTimeWithPlural(number, withoutSuffix, key) {
         var format = {
-            'mm': 'хвилина_хвилини_хвилин',
-            'hh': 'година_години_годин',
+            'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
+            'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
             'dd': 'день_дні_днів',
             'MM': 'місяць_місяці_місяців',
             'yy': 'рік_роки_років'
             return number + ' ' + plural(format[key], +number);
         }
     }
-
-    function monthsCaseReplace(m, format) {
-        var months = {
-            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
-            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
-        },
-
-        nounCase = (/D[oD]? *MMMM?/).test(format) ?
-            'accusative' :
-            'nominative';
-
-        return months[nounCase][m.month()];
-    }
-
     function weekdaysCaseReplace(m, format) {
         var weekdays = {
             'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
             'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
             'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
         },
-
         nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
             'accusative' :
             ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
                 'genitive' :
                 'nominative');
-
         return weekdays[nounCase][m.day()];
     }
-
     function processHoursFunction(str) {
         return function () {
             return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
         };
     }
 
-    return moment.defineLocale('uk', {
-        months : monthsCaseReplace,
+    var uk = moment.defineLocale('uk', {
+        months : {
+            'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'),
+            'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_')
+        },
         monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
         weekdays : weekdaysCaseReplace,
         weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD.MM.YYYY',
             LL : 'D MMMM YYYY р.',
-            LLL : 'D MMMM YYYY р., LT',
-            LLLL : 'dddd, D MMMM YYYY р., LT'
+            LLL : 'D MMMM YYYY р., HH:mm',
+            LLLL : 'dddd, D MMMM YYYY р., HH:mm'
         },
         calendar : {
             sameDay: processHoursFunction('[Сьогодні '),
             nextWeek: processHoursFunction('[У] dddd ['),
             lastWeek: function () {
                 switch (this.day()) {
-                case 0:
-                case 3:
-                case 5:
-                case 6:
-                    return processHoursFunction('[Минулої] dddd [').call(this);
-                case 1:
-                case 2:
-                case 4:
-                    return processHoursFunction('[Минулого] dddd [').call(this);
+                    case 0:
+                    case 3:
+                    case 5:
+                    case 6:
+                        return processHoursFunction('[Минулої] dddd [').call(this);
+                    case 1:
+                    case 2:
+                    case 4:
+                        return processHoursFunction('[Минулого] dddd [').call(this);
                 }
             },
             sameElse: 'L'
             y : 'рік',
             yy : relativeTimeWithPlural
         },
-
         // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
+        meridiemParse: /ночі|ранку|дня|вечора/,
+        isPM: function (input) {
+            return /^(дня|вечора)$/.test(input);
+        },
         meridiem : function (hour, minute, isLower) {
             if (hour < 4) {
                 return 'ночі';
                 return 'вечора';
             }
         },
-
         ordinalParse: /\d{1,2}-(й|го)/,
         ordinal: function (number, period) {
             switch (period) {
-            case 'M':
-            case 'd':
-            case 'DDD':
-            case 'w':
-            case 'W':
-                return number + '-й';
-            case 'D':
-                return number + '-го';
-            default:
-                return number;
+                case 'M':
+                case 'd':
+                case 'DDD':
+                case 'w':
+                case 'W':
+                    return number + '-й';
+                case 'D':
+                    return number + '-го';
+                default:
+                    return number;
             }
         },
-
         week : {
             dow : 1, // Monday is the first day of the week.
             doy : 7  // The week that contains Jan 1st is the first week of the year.
         }
     });
-}));
+
+    return uk;
+
+}));
\ No newline at end of file
index db4fc24..3fccde1 100644 (file)
@@ -1,31 +1,28 @@
-// moment.js locale configuration
-// locale : uzbek (uz)
-// author : Sardor Muminov : https://github.com/muminoff
+//! moment.js locale configuration
+//! locale : Uzbek [uz]
+//! author : Sardor Muminov : https://github.com/muminoff
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('uz', {
-        months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var uz = moment.defineLocale('uz', {
+        months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'),
         monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
         weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
         weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
         weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM YYYY',
-            LLL : 'D MMMM YYYY LT',
-            LLLL : 'D MMMM YYYY, dddd LT'
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'D MMMM YYYY, dddd HH:mm'
         },
         calendar : {
             sameDay : '[Бугун соат] LT [да]',
@@ -55,4 +52,7 @@
             doy : 7  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return uz;
+
+}));
\ No newline at end of file
index 127d064..ba207e9 100644 (file)
@@ -1,35 +1,45 @@
-// moment.js locale configuration
-// locale : vietnamese (vi)
-// author : Bang Nguyen : https://github.com/bangnk
+//! moment.js locale configuration
+//! locale : Vietnamese [vi]
+//! author : Bang Nguyen : https://github.com/bangnk
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('vi', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var vi = moment.defineLocale('vi', {
         months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
         monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
+        monthsParseExact : true,
         weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
         weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
         weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
+        weekdaysParseExact : true,
+        meridiemParse: /sa|ch/i,
+        isPM : function (input) {
+            return /^ch$/i.test(input);
+        },
+        meridiem : function (hours, minutes, isLower) {
+            if (hours < 12) {
+                return isLower ? 'sa' : 'SA';
+            } else {
+                return isLower ? 'ch' : 'CH';
+            }
+        },
         longDateFormat : {
             LT : 'HH:mm',
-            LTS : 'LT:ss',
+            LTS : 'HH:mm:ss',
             L : 'DD/MM/YYYY',
             LL : 'D MMMM [năm] YYYY',
-            LLL : 'D MMMM [năm] YYYY LT',
-            LLLL : 'dddd, D MMMM [năm] YYYY LT',
+            LLL : 'D MMMM [năm] YYYY HH:mm',
+            LLLL : 'dddd, D MMMM [năm] YYYY HH:mm',
             l : 'DD/M/YYYY',
             ll : 'D MMM YYYY',
-            lll : 'D MMM YYYY LT',
-            llll : 'ddd, D MMM YYYY LT'
+            lll : 'D MMM YYYY HH:mm',
+            llll : 'ddd, D MMM YYYY HH:mm'
         },
         calendar : {
             sameDay: '[Hôm nay lúc] LT',
@@ -63,4 +73,7 @@
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return vi;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/x-pseudo.js b/resources/lib/moment/locale/x-pseudo.js
new file mode 100644 (file)
index 0000000..f573d4c
--- /dev/null
@@ -0,0 +1,68 @@
+//! moment.js locale configuration
+//! locale : Pseudo [x-pseudo]
+//! author : Andrew Hood : https://github.com/andrewhood125
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var x_pseudo = moment.defineLocale('x-pseudo', {
+        months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'),
+        monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'),
+        monthsParseExact : true,
+        weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'),
+        weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
+        weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
+        weekdaysParseExact : true,
+        longDateFormat : {
+            LT : 'HH:mm',
+            L : 'DD/MM/YYYY',
+            LL : 'D MMMM YYYY',
+            LLL : 'D MMMM YYYY HH:mm',
+            LLLL : 'dddd, D MMMM YYYY HH:mm'
+        },
+        calendar : {
+            sameDay : '[T~ódá~ý át] LT',
+            nextDay : '[T~ómó~rró~w át] LT',
+            nextWeek : 'dddd [át] LT',
+            lastDay : '[Ý~ést~érdá~ý át] LT',
+            lastWeek : '[L~ást] dddd [át] LT',
+            sameElse : 'L'
+        },
+        relativeTime : {
+            future : 'í~ñ %s',
+            past : '%s á~gó',
+            s : 'á ~féw ~sécó~ñds',
+            m : 'á ~míñ~úté',
+            mm : '%d m~íñú~tés',
+            h : 'á~ñ hó~úr',
+            hh : '%d h~óúrs',
+            d : 'á ~dáý',
+            dd : '%d d~áýs',
+            M : 'á ~móñ~th',
+            MM : '%d m~óñt~hs',
+            y : 'á ~ýéár',
+            yy : '%d ý~éárs'
+        },
+        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (~~(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        },
+        week : {
+            dow : 1, // Monday is the first day of the week.
+            doy : 4  // The week that contains Jan 4th is the first week of the year.
+        }
+    });
+
+    return x_pseudo;
+
+}));
\ No newline at end of file
index 5b71928..cee6160 100644 (file)
@@ -1,36 +1,48 @@
-// moment.js locale configuration
-// locale : chinese (zh-cn)
-// author : suupic : https://github.com/suupic
-// author : Zeno Zeng : https://github.com/zenozeng
+//! moment.js locale configuration
+//! locale : Chinese (China) [zh-cn]
+//! author : suupic : https://github.com/suupic
+//! author : Zeno Zeng : https://github.com/zenozeng
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('zh-cn', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var zh_cn = moment.defineLocale('zh-cn', {
         months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
         monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
         weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
         weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
         longDateFormat : {
-            LT : 'Ah点mm',
+            LT : 'Ah点mm',
             LTS : 'Ah点m分s秒',
             L : 'YYYY-MM-DD',
             LL : 'YYYY年MMMD日',
-            LLL : 'YYYY年MMMD日LT',
-            LLLL : 'YYYY年MMMD日ddddLT',
+            LLL : 'YYYY年MMMD日Ah点mm分',
+            LLLL : 'YYYY年MMMD日ddddAh点mm分',
             l : 'YYYY-MM-DD',
             ll : 'YYYY年MMMD日',
-            lll : 'YYYY年MMMD日LT',
-            llll : 'YYYY年MMMD日ddddLT'
+            lll : 'YYYY年MMMD日Ah点mm分',
+            llll : 'YYYY年MMMD日ddddAh点mm分'
+        },
+        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+        meridiemHour: function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === '凌晨' || meridiem === '早上' ||
+                    meridiem === '上午') {
+                return hour;
+            } else if (meridiem === '下午' || meridiem === '晚上') {
+                return hour + 12;
+            } else {
+                // '中午'
+                return hour >= 11 ? hour : hour + 12;
+            }
         },
         meridiem : function (hour, minute, isLower) {
             var hm = hour * 100 + minute;
@@ -61,7 +73,7 @@
             nextWeek : function () {
                 var startOfWeek, prefix;
                 startOfWeek = moment().startOf('week');
-                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+                prefix = this.diff(startOfWeek, 'days') >= 7 ? '[下]' : '[本]';
                 return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
             },
             lastWeek : function () {
         ordinalParse: /\d{1,2}(日|月|周)/,
         ordinal : function (number, period) {
             switch (period) {
-            case 'd':
-            case 'D':
-            case 'DDD':
-                return number + '日';
-            case 'M':
-                return number + '月';
-            case 'w':
-            case 'W':
-                return number + '周';
-            default:
-                return number;
+                case 'd':
+                case 'D':
+                case 'DDD':
+                    return number + '日';
+                case 'M':
+                    return number + '月';
+                case 'w':
+                case 'W':
+                    return number + '周';
+                default:
+                    return number;
             }
         },
         relativeTime : {
             future : '%s内',
             past : '%s前',
             s : '几秒',
-            m : '1分钟',
-            mm : '%d分钟',
-            h : '1小时',
-            hh : '%d小时',
-            d : '1天',
-            dd : '%d天',
-            M : '1个月',
-            MM : '%d个月',
-            y : '1年',
-            yy : '%d年'
+            m : '1 分钟',
+            mm : '%d 分钟',
+            h : '1 小时',
+            hh : '%d 小时',
+            d : '1 天',
+            dd : '%d 天',
+            M : '1 个月',
+            MM : '%d 个月',
+            y : '1 年',
+            yy : '%d 年'
         },
         week : {
             // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
             doy : 4  // The week that contains Jan 4th is the first week of the year.
         }
     });
-}));
+
+    return zh_cn;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/moment/locale/zh-hk.js b/resources/lib/moment/locale/zh-hk.js
new file mode 100644 (file)
index 0000000..d12a260
--- /dev/null
@@ -0,0 +1,105 @@
+//! moment.js locale configuration
+//! locale : Chinese (Hong Kong) [zh-hk]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
+//! author : Konstantin : https://github.com/skfd
+
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var zh_hk = moment.defineLocale('zh-hk', {
+        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
+        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
+        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
+        weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
+        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
+        longDateFormat : {
+            LT : 'Ah點mm分',
+            LTS : 'Ah點m分s秒',
+            L : 'YYYY年MMMD日',
+            LL : 'YYYY年MMMD日',
+            LLL : 'YYYY年MMMD日Ah點mm分',
+            LLLL : 'YYYY年MMMD日ddddAh點mm分',
+            l : 'YYYY年MMMD日',
+            ll : 'YYYY年MMMD日',
+            lll : 'YYYY年MMMD日Ah點mm分',
+            llll : 'YYYY年MMMD日ddddAh點mm分'
+        },
+        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+                return hour;
+            } else if (meridiem === '中午') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === '下午' || meridiem === '晚上') {
+                return hour + 12;
+            }
+        },
+        meridiem : function (hour, minute, isLower) {
+            var hm = hour * 100 + minute;
+            if (hm < 600) {
+                return '凌晨';
+            } else if (hm < 900) {
+                return '早上';
+            } else if (hm < 1130) {
+                return '上午';
+            } else if (hm < 1230) {
+                return '中午';
+            } else if (hm < 1800) {
+                return '下午';
+            } else {
+                return '晚上';
+            }
+        },
+        calendar : {
+            sameDay : '[今天]LT',
+            nextDay : '[明天]LT',
+            nextWeek : '[下]ddddLT',
+            lastDay : '[昨天]LT',
+            lastWeek : '[上]ddddLT',
+            sameElse : 'L'
+        },
+        ordinalParse: /\d{1,2}(日|月|週)/,
+        ordinal : function (number, period) {
+            switch (period) {
+                case 'd' :
+                case 'D' :
+                case 'DDD' :
+                    return number + '日';
+                case 'M' :
+                    return number + '月';
+                case 'w' :
+                case 'W' :
+                    return number + '週';
+                default :
+                    return number;
+            }
+        },
+        relativeTime : {
+            future : '%s內',
+            past : '%s前',
+            s : '幾秒',
+            m : '1 分鐘',
+            mm : '%d 分鐘',
+            h : '1 小時',
+            hh : '%d 小時',
+            d : '1 天',
+            dd : '%d 天',
+            M : '1 個月',
+            MM : '%d 個月',
+            y : '1 年',
+            yy : '%d 年'
+        }
+    });
+
+    return zh_hk;
+
+}));
\ No newline at end of file
index 7883ede..c6766c8 100644 (file)
@@ -1,39 +1,52 @@
-// moment.js locale configuration
-// locale : traditional chinese (zh-tw)
-// author : Ben : https://github.com/ben-lin
+//! moment.js locale configuration
+//! locale : Chinese (Taiwan) [zh-tw]
+//! author : Ben : https://github.com/ben-lin
+//! author : Chris Lam : https://github.com/hehachris
 
-(function (factory) {
-    // Comment out broken wrapper, see T145382
-    /*if (typeof define === 'function' && define.amd) {
-        define(['moment'], factory); // AMD
-    } else if (typeof exports === 'object') {
-        module.exports = factory(require('../moment')); // Node
-    } else {
-        factory((typeof global !== 'undefined' ? global : this).moment); // node or other global
-    }*/
-    factory(this.moment);
-}(function (moment) {
-    return moment.defineLocale('zh-tw', {
+;(function (global, factory) {
+   typeof exports === 'object' && typeof module !== 'undefined'
+       && typeof require === 'function' ? factory(require('../moment')) :
+   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
+   factory(global.moment)
+}(this, function (moment) { 'use strict';
+
+
+    var zh_tw = moment.defineLocale('zh-tw', {
         months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
         monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
         weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
         weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
         weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
         longDateFormat : {
-            LT : 'Ah點mm',
+            LT : 'Ah點mm',
             LTS : 'Ah點m分s秒',
             L : 'YYYY年MMMD日',
             LL : 'YYYY年MMMD日',
-            LLL : 'YYYY年MMMD日LT',
-            LLLL : 'YYYY年MMMD日ddddLT',
+            LLL : 'YYYY年MMMD日Ah點mm分',
+            LLLL : 'YYYY年MMMD日ddddAh點mm分',
             l : 'YYYY年MMMD日',
             ll : 'YYYY年MMMD日',
-            lll : 'YYYY年MMMD日LT',
-            llll : 'YYYY年MMMD日ddddLT'
+            lll : 'YYYY年MMMD日Ah點mm分',
+            llll : 'YYYY年MMMD日ddddAh點mm分'
+        },
+        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+        meridiemHour : function (hour, meridiem) {
+            if (hour === 12) {
+                hour = 0;
+            }
+            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
+                return hour;
+            } else if (meridiem === '中午') {
+                return hour >= 11 ? hour : hour + 12;
+            } else if (meridiem === '下午' || meridiem === '晚上') {
+                return hour + 12;
+            }
         },
         meridiem : function (hour, minute, isLower) {
             var hm = hour * 100 + minute;
-            if (hm < 900) {
+            if (hm < 600) {
+                return '凌晨';
+            } else if (hm < 900) {
                 return '早上';
             } else if (hm < 1130) {
                 return '上午';
         ordinalParse: /\d{1,2}(日|月|週)/,
         ordinal : function (number, period) {
             switch (period) {
-            case 'd' :
-            case 'D' :
-            case 'DDD' :
-                return number + '日';
-            case 'M' :
-                return number + '月';
-            case 'w' :
-            case 'W' :
-                return number + '週';
-            default :
-                return number;
+                case 'd' :
+                case 'D' :
+                case 'DDD' :
+                    return number + '日';
+                case 'M' :
+                    return number + '月';
+                case 'w' :
+                case 'W' :
+                    return number + '週';
+                default :
+                    return number;
             }
         },
         relativeTime : {
             future : '%s內',
             past : '%s前',
             s : '幾秒',
-            m : '分鐘',
-            mm : '%d分鐘',
-            h : '小時',
-            hh : '%d小時',
-            d : '天',
-            dd : '%d天',
-            M : '個月',
-            MM : '%d個月',
-            y : '年',
-            yy : '%d年'
+            m : '分鐘',
+            mm : '%d 分鐘',
+            h : '小時',
+            hh : '%d 小時',
+            d : '天',
+            dd : '%d 天',
+            M : '個月',
+            MM : '%d 個月',
+            y : '年',
+            yy : '%d 年'
         }
     });
-}));
+
+    return zh_tw;
+
+}));
\ No newline at end of file
index 85e190d..7d0fef9 100644 (file)
 //! moment.js
-//! version : 2.8.4
+//! version : 2.15.0
 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
 //! license : MIT
 //! momentjs.com
 
-(function (undefined) {
-    /************************************
-        Constants
-    ************************************/
-
-    var moment,
-        VERSION = '2.8.4',
-        // the global-scope this is NOT the global object in Node.js
-        globalScope = typeof global !== 'undefined' ? global : this,
-        oldGlobalMoment,
-        round = Math.round,
-        hasOwnProperty = Object.prototype.hasOwnProperty,
-        i,
-
-        YEAR = 0,
-        MONTH = 1,
-        DATE = 2,
-        HOUR = 3,
-        MINUTE = 4,
-        SECOND = 5,
-        MILLISECOND = 6,
-
-        // internal storage for locale config files
-        locales = {},
-
-        // extra moment internal properties (plugins register props here)
-        momentProperties = [],
-
-        // check for nodeJS
-        hasModule = (typeof module !== 'undefined' && module && module.exports),
-
-        // ASP.NET json date format regex
-        aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
-        aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
-
-        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
-        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
-        isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
-
-        // format tokens
-        formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,
-        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
-
-        // parsing token regexes
-        parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
-        parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
-        parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
-        parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
-        parseTokenDigits = /\d+/, // nonzero number of digits
-        parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
-        parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
-        parseTokenT = /T/i, // T (ISO separator)
-        parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123
-        parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
-
-        //strict parsing regexes
-        parseTokenOneDigit = /\d/, // 0 - 9
-        parseTokenTwoDigits = /\d\d/, // 00 - 99
-        parseTokenThreeDigits = /\d{3}/, // 000 - 999
-        parseTokenFourDigits = /\d{4}/, // 0000 - 9999
-        parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
-        parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
-
-        // iso 8601 regex
-        // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
-        isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
-
-        isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
-
-        isoDates = [
-            ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
-            ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
-            ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
-            ['GGGG-[W]WW', /\d{4}-W\d{2}/],
-            ['YYYY-DDD', /\d{4}-\d{3}/]
-        ],
-
-        // iso time formats and regexes
-        isoTimes = [
-            ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
-            ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
-            ['HH:mm', /(T| )\d\d:\d\d/],
-            ['HH', /(T| )\d\d/]
-        ],
-
-        // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']
-        parseTimezoneChunker = /([\+\-]|\d\d)/gi,
-
-        // getter and setter names
-        proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
-        unitMillisecondFactors = {
-            'Milliseconds' : 1,
-            'Seconds' : 1e3,
-            'Minutes' : 6e4,
-            'Hours' : 36e5,
-            'Days' : 864e5,
-            'Months' : 2592e6,
-            'Years' : 31536e6
-        },
-
-        unitAliases = {
-            ms : 'millisecond',
-            s : 'second',
-            m : 'minute',
-            h : 'hour',
-            d : 'day',
-            D : 'date',
-            w : 'week',
-            W : 'isoWeek',
-            M : 'month',
-            Q : 'quarter',
-            y : 'year',
-            DDD : 'dayOfYear',
-            e : 'weekday',
-            E : 'isoWeekday',
-            gg: 'weekYear',
-            GG: 'isoWeekYear'
-        },
-
-        camelFunctions = {
-            dayofyear : 'dayOfYear',
-            isoweekday : 'isoWeekday',
-            isoweek : 'isoWeek',
-            weekyear : 'weekYear',
-            isoweekyear : 'isoWeekYear'
-        },
-
-        // format function strings
-        formatFunctions = {},
-
-        // default relative time thresholds
-        relativeTimeThresholds = {
-            s: 45,  // seconds to minute
-            m: 45,  // minutes to hour
-            h: 22,  // hours to day
-            d: 26,  // days to month
-            M: 11   // months to year
-        },
-
-        // tokens to ordinalize and pad
-        ordinalizeTokens = 'DDD w W M D d'.split(' '),
-        paddedTokens = 'M D H h m s w W'.split(' '),
-
-        formatTokenFunctions = {
-            M    : function () {
-                return this.month() + 1;
-            },
-            MMM  : function (format) {
-                return this.localeData().monthsShort(this, format);
-            },
-            MMMM : function (format) {
-                return this.localeData().months(this, format);
-            },
-            D    : function () {
-                return this.date();
-            },
-            DDD  : function () {
-                return this.dayOfYear();
-            },
-            d    : function () {
-                return this.day();
-            },
-            dd   : function (format) {
-                return this.localeData().weekdaysMin(this, format);
-            },
-            ddd  : function (format) {
-                return this.localeData().weekdaysShort(this, format);
-            },
-            dddd : function (format) {
-                return this.localeData().weekdays(this, format);
-            },
-            w    : function () {
-                return this.week();
-            },
-            W    : function () {
-                return this.isoWeek();
-            },
-            YY   : function () {
-                return leftZeroFill(this.year() % 100, 2);
-            },
-            YYYY : function () {
-                return leftZeroFill(this.year(), 4);
-            },
-            YYYYY : function () {
-                return leftZeroFill(this.year(), 5);
-            },
-            YYYYYY : function () {
-                var y = this.year(), sign = y >= 0 ? '+' : '-';
-                return sign + leftZeroFill(Math.abs(y), 6);
-            },
-            gg   : function () {
-                return leftZeroFill(this.weekYear() % 100, 2);
-            },
-            gggg : function () {
-                return leftZeroFill(this.weekYear(), 4);
-            },
-            ggggg : function () {
-                return leftZeroFill(this.weekYear(), 5);
-            },
-            GG   : function () {
-                return leftZeroFill(this.isoWeekYear() % 100, 2);
-            },
-            GGGG : function () {
-                return leftZeroFill(this.isoWeekYear(), 4);
-            },
-            GGGGG : function () {
-                return leftZeroFill(this.isoWeekYear(), 5);
-            },
-            e : function () {
-                return this.weekday();
-            },
-            E : function () {
-                return this.isoWeekday();
-            },
-            a    : function () {
-                return this.localeData().meridiem(this.hours(), this.minutes(), true);
-            },
-            A    : function () {
-                return this.localeData().meridiem(this.hours(), this.minutes(), false);
-            },
-            H    : function () {
-                return this.hours();
-            },
-            h    : function () {
-                return this.hours() % 12 || 12;
-            },
-            m    : function () {
-                return this.minutes();
-            },
-            s    : function () {
-                return this.seconds();
-            },
-            S    : function () {
-                return toInt(this.milliseconds() / 100);
-            },
-            SS   : function () {
-                return leftZeroFill(toInt(this.milliseconds() / 10), 2);
-            },
-            SSS  : function () {
-                return leftZeroFill(this.milliseconds(), 3);
-            },
-            SSSS : function () {
-                return leftZeroFill(this.milliseconds(), 3);
-            },
-            Z    : function () {
-                var a = -this.zone(),
-                    b = '+';
-                if (a < 0) {
-                    a = -a;
-                    b = '-';
-                }
-                return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);
-            },
-            ZZ   : function () {
-                var a = -this.zone(),
-                    b = '+';
-                if (a < 0) {
-                    a = -a;
-                    b = '-';
-                }
-                return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
-            },
-            z : function () {
-                return this.zoneAbbr();
-            },
-            zz : function () {
-                return this.zoneName();
-            },
-            x    : function () {
-                return this.valueOf();
-            },
-            X    : function () {
-                return this.unix();
-            },
-            Q : function () {
-                return this.quarter();
-            }
-        },
-
-        deprecations = {},
-
-        lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
-
-    // Pick the first defined of two or three arguments. dfl comes from
-    // default.
-    function dfl(a, b, c) {
-        switch (arguments.length) {
-            case 2: return a != null ? a : b;
-            case 3: return a != null ? a : b != null ? b : c;
-            default: throw new Error('Implement me');
-        }
-    }
+;(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    global.moment = factory()
+}(this, function () { 'use strict';
 
-    function hasOwnProp(a, b) {
-        return hasOwnProperty.call(a, b);
+    var hookCallback;
+
+    function utils_hooks__hooks () {
+        return hookCallback.apply(null, arguments);
     }
 
-    function defaultParsingFlags() {
-        // We need to deep clone this object, and es5 standard is not very
-        // helpful.
-        return {
-            empty : false,
-            unusedTokens : [],
-            unusedInput : [],
-            overflow : -2,
-            charsLeftOver : 0,
-            nullInput : false,
-            invalidMonth : null,
-            invalidFormat : false,
-            userInvalidated : false,
-            iso: false
-        };
+    // This is done to register the method called with moment()
+    // without creating circular dependencies.
+    function setHookCallback (callback) {
+        hookCallback = callback;
     }
 
-    function printMsg(msg) {
-        if (moment.suppressDeprecationWarnings === false &&
-                typeof console !== 'undefined' && console.warn) {
-            console.warn('Deprecation warning: ' + msg);
-        }
+    function isArray(input) {
+        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
     }
 
-    function deprecate(msg, fn) {
-        var firstTime = true;
-        return extend(function () {
-            if (firstTime) {
-                printMsg(msg);
-                firstTime = false;
-            }
-            return fn.apply(this, arguments);
-        }, fn);
+    function isObject(input) {
+        // IE8 will treat undefined and null as object if it wasn't for
+        // input != null
+        return input != null && Object.prototype.toString.call(input) === '[object Object]';
     }
 
-    function deprecateSimple(name, msg) {
-        if (!deprecations[name]) {
-            printMsg(msg);
-            deprecations[name] = true;
+    function isObjectEmpty(obj) {
+        var k;
+        for (k in obj) {
+            // even if its not own property I'd still call it non-empty
+            return false;
         }
+        return true;
     }
 
-    function padToken(func, count) {
-        return function (a) {
-            return leftZeroFill(func.call(this, a), count);
-        };
-    }
-    function ordinalizeToken(func, period) {
-        return function (a) {
-            return this.localeData().ordinal(func.call(this, a), period);
-        };
+    function isDate(input) {
+        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
     }
 
-    while (ordinalizeTokens.length) {
-        i = ordinalizeTokens.pop();
-        formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
+    function map(arr, fn) {
+        var res = [], i;
+        for (i = 0; i < arr.length; ++i) {
+            res.push(fn(arr[i], i));
+        }
+        return res;
     }
-    while (paddedTokens.length) {
-        i = paddedTokens.pop();
-        formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
+
+    function hasOwnProp(a, b) {
+        return Object.prototype.hasOwnProperty.call(a, b);
     }
-    formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
 
+    function extend(a, b) {
+        for (var i in b) {
+            if (hasOwnProp(b, i)) {
+                a[i] = b[i];
+            }
+        }
+
+        if (hasOwnProp(b, 'toString')) {
+            a.toString = b.toString;
+        }
 
-    /************************************
-        Constructors
-    ************************************/
+        if (hasOwnProp(b, 'valueOf')) {
+            a.valueOf = b.valueOf;
+        }
 
-    function Locale() {
+        return a;
     }
 
-    // Moment prototype object
-    function Moment(config, skipOverflow) {
-        if (skipOverflow !== false) {
-            checkOverflow(config);
-        }
-        copyConfig(this, config);
-        this._d = new Date(+config._d);
+    function create_utc__createUTC (input, format, locale, strict) {
+        return createLocalOrUTC(input, format, locale, strict, true).utc();
     }
 
-    // Duration Constructor
-    function Duration(duration) {
-        var normalizedInput = normalizeObjectUnits(duration),
-            years = normalizedInput.year || 0,
-            quarters = normalizedInput.quarter || 0,
-            months = normalizedInput.month || 0,
-            weeks = normalizedInput.week || 0,
-            days = normalizedInput.day || 0,
-            hours = normalizedInput.hour || 0,
-            minutes = normalizedInput.minute || 0,
-            seconds = normalizedInput.second || 0,
-            milliseconds = normalizedInput.millisecond || 0;
+    function defaultParsingFlags() {
+        // We need to deep clone this object.
+        return {
+            empty           : false,
+            unusedTokens    : [],
+            unusedInput     : [],
+            overflow        : -2,
+            charsLeftOver   : 0,
+            nullInput       : false,
+            invalidMonth    : null,
+            invalidFormat   : false,
+            userInvalidated : false,
+            iso             : false,
+            parsedDateParts : [],
+            meridiem        : null
+        };
+    }
 
-        // representation for dateAddRemove
-        this._milliseconds = +milliseconds +
-            seconds * 1e3 + // 1000
-            minutes * 6e4 + // 1000 * 60
-            hours * 36e5; // 1000 * 60 * 60
-        // Because of dateAddRemove treats 24 hours as different from a
-        // day when working around DST, we need to store them separately
-        this._days = +days +
-            weeks * 7;
-        // It is impossible translate months into days without knowing
-        // which months you are are talking about, so we have to store
-        // it separately.
-        this._months = +months +
-            quarters * 3 +
-            years * 12;
+    function getParsingFlags(m) {
+        if (m._pf == null) {
+            m._pf = defaultParsingFlags();
+        }
+        return m._pf;
+    }
 
-        this._data = {};
+    var some;
+    if (Array.prototype.some) {
+        some = Array.prototype.some;
+    } else {
+        some = function (fun) {
+            var t = Object(this);
+            var len = t.length >>> 0;
 
-        this._locale = moment.localeData();
+            for (var i = 0; i < len; i++) {
+                if (i in t && fun.call(this, t[i], i, t)) {
+                    return true;
+                }
+            }
 
-        this._bubble();
+            return false;
+        };
     }
 
-    /************************************
-        Helpers
-    ************************************/
+    function valid__isValid(m) {
+        if (m._isValid == null) {
+            var flags = getParsingFlags(m);
+            var parsedParts = some.call(flags.parsedDateParts, function (i) {
+                return i != null;
+            });
+            var isNowValid = !isNaN(m._d.getTime()) &&
+                flags.overflow < 0 &&
+                !flags.empty &&
+                !flags.invalidMonth &&
+                !flags.invalidWeekday &&
+                !flags.nullInput &&
+                !flags.invalidFormat &&
+                !flags.userInvalidated &&
+                (!flags.meridiem || (flags.meridiem && parsedParts));
 
+            if (m._strict) {
+                isNowValid = isNowValid &&
+                    flags.charsLeftOver === 0 &&
+                    flags.unusedTokens.length === 0 &&
+                    flags.bigHour === undefined;
+            }
 
-    function extend(a, b) {
-        for (var i in b) {
-            if (hasOwnProp(b, i)) {
-                a[i] = b[i];
+            if (Object.isFrozen == null || !Object.isFrozen(m)) {
+                m._isValid = isNowValid;
+            }
+            else {
+                return isNowValid;
             }
         }
+        return m._isValid;
+    }
 
-        if (hasOwnProp(b, 'toString')) {
-            a.toString = b.toString;
+    function valid__createInvalid (flags) {
+        var m = create_utc__createUTC(NaN);
+        if (flags != null) {
+            extend(getParsingFlags(m), flags);
         }
-
-        if (hasOwnProp(b, 'valueOf')) {
-            a.valueOf = b.valueOf;
+        else {
+            getParsingFlags(m).userInvalidated = true;
         }
 
-        return a;
+        return m;
+    }
+
+    function isUndefined(input) {
+        return input === void 0;
     }
 
+    // Plugins that add properties should also add the key here (null value),
+    // so we can properly clone ourselves.
+    var momentProperties = utils_hooks__hooks.momentProperties = [];
+
     function copyConfig(to, from) {
         var i, prop, val;
 
-        if (typeof from._isAMomentObject !== 'undefined') {
+        if (!isUndefined(from._isAMomentObject)) {
             to._isAMomentObject = from._isAMomentObject;
         }
-        if (typeof from._i !== 'undefined') {
+        if (!isUndefined(from._i)) {
             to._i = from._i;
         }
-        if (typeof from._f !== 'undefined') {
+        if (!isUndefined(from._f)) {
             to._f = from._f;
         }
-        if (typeof from._l !== 'undefined') {
+        if (!isUndefined(from._l)) {
             to._l = from._l;
         }
-        if (typeof from._strict !== 'undefined') {
+        if (!isUndefined(from._strict)) {
             to._strict = from._strict;
         }
-        if (typeof from._tzm !== 'undefined') {
+        if (!isUndefined(from._tzm)) {
             to._tzm = from._tzm;
         }
-        if (typeof from._isUTC !== 'undefined') {
+        if (!isUndefined(from._isUTC)) {
             to._isUTC = from._isUTC;
         }
-        if (typeof from._offset !== 'undefined') {
+        if (!isUndefined(from._offset)) {
             to._offset = from._offset;
         }
-        if (typeof from._pf !== 'undefined') {
-            to._pf = from._pf;
+        if (!isUndefined(from._pf)) {
+            to._pf = getParsingFlags(from);
         }
-        if (typeof from._locale !== 'undefined') {
+        if (!isUndefined(from._locale)) {
             to._locale = from._locale;
         }
 
             for (i in momentProperties) {
                 prop = momentProperties[i];
                 val = from[prop];
-                if (typeof val !== 'undefined') {
+                if (!isUndefined(val)) {
                     to[prop] = val;
                 }
             }
         return to;
     }
 
-    function absRound(number) {
-        if (number < 0) {
-            return Math.ceil(number);
-        } else {
-            return Math.floor(number);
-        }
-    }
-
-    // left zero fill a number
-    // see http://jsperf.com/left-zero-filling for performance comparison
-    function leftZeroFill(number, targetLength, forceSign) {
-        var output = '' + Math.abs(number),
-            sign = number >= 0;
+    var updateInProgress = false;
 
-        while (output.length < targetLength) {
-            output = '0' + output;
+    // Moment prototype object
+    function Moment(config) {
+        copyConfig(this, config);
+        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
+        // Prevent infinite loop in case updateOffset creates new moment
+        // objects.
+        if (updateInProgress === false) {
+            updateInProgress = true;
+            utils_hooks__hooks.updateOffset(this);
+            updateInProgress = false;
         }
-        return (sign ? (forceSign ? '+' : '') : '-') + output;
     }
 
-    function positiveMomentsDifference(base, other) {
-        var res = {milliseconds: 0, months: 0};
-
-        res.months = other.month() - base.month() +
-            (other.year() - base.year()) * 12;
-        if (base.clone().add(res.months, 'M').isAfter(other)) {
-            --res.months;
-        }
-
-        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
-
-        return res;
+    function isMoment (obj) {
+        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
     }
 
-    function momentsDifference(base, other) {
-        var res;
-        other = makeAs(other, base);
-        if (base.isBefore(other)) {
-            res = positiveMomentsDifference(base, other);
+    function absFloor (number) {
+        if (number < 0) {
+            // -0 -> 0
+            return Math.ceil(number) || 0;
         } else {
-            res = positiveMomentsDifference(other, base);
-            res.milliseconds = -res.milliseconds;
-            res.months = -res.months;
+            return Math.floor(number);
         }
-
-        return res;
-    }
-
-    // TODO: remove 'name' arg after deprecation is removed
-    function createAdder(direction, name) {
-        return function (val, period) {
-            var dur, tmp;
-            //invert the arguments, but complain about it
-            if (period !== null && !isNaN(+period)) {
-                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
-                tmp = val; val = period; period = tmp;
-            }
-
-            val = typeof val === 'string' ? +val : val;
-            dur = moment.duration(val, period);
-            addOrSubtractDurationFromMoment(this, dur, direction);
-            return this;
-        };
     }
 
-    function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {
-        var milliseconds = duration._milliseconds,
-            days = duration._days,
-            months = duration._months;
-        updateOffset = updateOffset == null ? true : updateOffset;
+    function toInt(argumentForCoercion) {
+        var coercedNumber = +argumentForCoercion,
+            value = 0;
 
-        if (milliseconds) {
-            mom._d.setTime(+mom._d + milliseconds * isAdding);
-        }
-        if (days) {
-            rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);
-        }
-        if (months) {
-            rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);
-        }
-        if (updateOffset) {
-            moment.updateOffset(mom, days || months);
+        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+            value = absFloor(coercedNumber);
         }
-    }
 
-    // check if is an array
-    function isArray(input) {
-        return Object.prototype.toString.call(input) === '[object Array]';
-    }
-
-    function isDate(input) {
-        return Object.prototype.toString.call(input) === '[object Date]' ||
-            input instanceof Date;
+        return value;
     }
 
     // compare two arrays, return the number of differences
         return diffs + lengthDiff;
     }
 
-    function normalizeUnits(units) {
-        if (units) {
-            var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
-            units = unitAliases[units] || camelFunctions[lowered] || lowered;
+    function warn(msg) {
+        if (utils_hooks__hooks.suppressDeprecationWarnings === false &&
+                (typeof console !==  'undefined') && console.warn) {
+            console.warn('Deprecation warning: ' + msg);
         }
-        return units;
     }
 
-    function normalizeObjectUnits(inputObject) {
-        var normalizedInput = {},
-            normalizedProp,
-            prop;
+    function deprecate(msg, fn) {
+        var firstTime = true;
 
-        for (prop in inputObject) {
-            if (hasOwnProp(inputObject, prop)) {
-                normalizedProp = normalizeUnits(prop);
-                if (normalizedProp) {
-                    normalizedInput[normalizedProp] = inputObject[prop];
+        return extend(function () {
+            if (utils_hooks__hooks.deprecationHandler != null) {
+                utils_hooks__hooks.deprecationHandler(null, msg);
+            }
+            if (firstTime) {
+                var args = [];
+                var arg;
+                for (var i = 0; i < arguments.length; i++) {
+                    arg = '';
+                    if (typeof arguments[i] === 'object') {
+                        arg += '\n[' + i + '] ';
+                        for (var key in arguments[0]) {
+                            arg += key + ': ' + arguments[0][key] + ', ';
+                        }
+                        arg = arg.slice(0, -2); // Remove trailing comma and space
+                    } else {
+                        arg = arguments[i];
+                    }
+                    args.push(arg);
                 }
+                warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+                firstTime = false;
             }
-        }
-
-        return normalizedInput;
+            return fn.apply(this, arguments);
+        }, fn);
     }
 
-    function makeList(field) {
-        var count, setter;
+    var deprecations = {};
 
-        if (field.indexOf('week') === 0) {
-            count = 7;
-            setter = 'day';
-        }
-        else if (field.indexOf('month') === 0) {
-            count = 12;
-            setter = 'month';
+    function deprecateSimple(name, msg) {
+        if (utils_hooks__hooks.deprecationHandler != null) {
+            utils_hooks__hooks.deprecationHandler(name, msg);
         }
-        else {
-            return;
+        if (!deprecations[name]) {
+            warn(msg);
+            deprecations[name] = true;
         }
+    }
 
-        moment[field] = function (format, index) {
-            var i, getter,
-                method = moment._locale[field],
-                results = [];
-
-            if (typeof format === 'number') {
-                index = format;
-                format = undefined;
-            }
-
-            getter = function (i) {
-                var m = moment().utc().set(setter, i);
-                return method.call(moment._locale, m, format || '');
-            };
+    utils_hooks__hooks.suppressDeprecationWarnings = false;
+    utils_hooks__hooks.deprecationHandler = null;
 
-            if (index != null) {
-                return getter(index);
-            }
-            else {
-                for (i = 0; i < count; i++) {
-                    results.push(getter(i));
-                }
-                return results;
-            }
-        };
+    function isFunction(input) {
+        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
     }
 
-    function toInt(argumentForCoercion) {
-        var coercedNumber = +argumentForCoercion,
-            value = 0;
-
-        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
-            if (coercedNumber >= 0) {
-                value = Math.floor(coercedNumber);
+    function locale_set__set (config) {
+        var prop, i;
+        for (i in config) {
+            prop = config[i];
+            if (isFunction(prop)) {
+                this[i] = prop;
             } else {
-                value = Math.ceil(coercedNumber);
+                this['_' + i] = prop;
             }
         }
-
-        return value;
+        this._config = config;
+        // Lenient ordinal parsing accepts just a number in addition to
+        // number + (possibly) stuff coming from _ordinalParseLenient.
+        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
     }
 
-    function daysInMonth(year, month) {
-        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+    function mergeConfigs(parentConfig, childConfig) {
+        var res = extend({}, parentConfig), prop;
+        for (prop in childConfig) {
+            if (hasOwnProp(childConfig, prop)) {
+                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
+                    res[prop] = {};
+                    extend(res[prop], parentConfig[prop]);
+                    extend(res[prop], childConfig[prop]);
+                } else if (childConfig[prop] != null) {
+                    res[prop] = childConfig[prop];
+                } else {
+                    delete res[prop];
+                }
+            }
+        }
+        for (prop in parentConfig) {
+            if (hasOwnProp(parentConfig, prop) &&
+                    !hasOwnProp(childConfig, prop) &&
+                    isObject(parentConfig[prop])) {
+                // make sure changes to properties don't modify parent config
+                res[prop] = extend({}, res[prop]);
+            }
+        }
+        return res;
     }
 
-    function weeksInYear(year, dow, doy) {
-        return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;
+    function Locale(config) {
+        if (config != null) {
+            this.set(config);
+        }
     }
 
-    function daysInYear(year) {
-        return isLeapYear(year) ? 366 : 365;
-    }
+    var keys;
 
-    function isLeapYear(year) {
-        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+    if (Object.keys) {
+        keys = Object.keys;
+    } else {
+        keys = function (obj) {
+            var i, res = [];
+            for (i in obj) {
+                if (hasOwnProp(obj, i)) {
+                    res.push(i);
+                }
+            }
+            return res;
+        };
     }
 
-    function checkOverflow(m) {
-        var overflow;
-        if (m._a && m._pf.overflow === -2) {
-            overflow =
-                m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
-                m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
-                m._a[HOUR] < 0 || m._a[HOUR] > 24 ||
-                    (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 ||
-                                           m._a[SECOND] !== 0 ||
-                                           m._a[MILLISECOND] !== 0)) ? HOUR :
-                m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
-                m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
-                m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
-                -1;
-
-            if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
-                overflow = DATE;
-            }
+    var defaultCalendar = {
+        sameDay : '[Today at] LT',
+        nextDay : '[Tomorrow at] LT',
+        nextWeek : 'dddd [at] LT',
+        lastDay : '[Yesterday at] LT',
+        lastWeek : '[Last] dddd [at] LT',
+        sameElse : 'L'
+    };
 
-            m._pf.overflow = overflow;
-        }
+    function locale_calendar__calendar (key, mom, now) {
+        var output = this._calendar[key] || this._calendar['sameElse'];
+        return isFunction(output) ? output.call(mom, now) : output;
     }
 
-    function isValid(m) {
-        if (m._isValid == null) {
-            m._isValid = !isNaN(m._d.getTime()) &&
-                m._pf.overflow < 0 &&
-                !m._pf.empty &&
-                !m._pf.invalidMonth &&
-                !m._pf.nullInput &&
-                !m._pf.invalidFormat &&
-                !m._pf.userInvalidated;
+    var defaultLongDateFormat = {
+        LTS  : 'h:mm:ss A',
+        LT   : 'h:mm A',
+        L    : 'MM/DD/YYYY',
+        LL   : 'MMMM D, YYYY',
+        LLL  : 'MMMM D, YYYY h:mm A',
+        LLLL : 'dddd, MMMM D, YYYY h:mm A'
+    };
 
-            if (m._strict) {
-                m._isValid = m._isValid &&
-                    m._pf.charsLeftOver === 0 &&
-                    m._pf.unusedTokens.length === 0 &&
-                    m._pf.bigHour === undefined;
-            }
+    function longDateFormat (key) {
+        var format = this._longDateFormat[key],
+            formatUpper = this._longDateFormat[key.toUpperCase()];
+
+        if (format || !formatUpper) {
+            return format;
         }
-        return m._isValid;
+
+        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
+            return val.slice(1);
+        });
+
+        return this._longDateFormat[key];
     }
 
-    function normalizeLocale(key) {
-        return key ? key.toLowerCase().replace('_', '-') : key;
+    var defaultInvalidDate = 'Invalid date';
+
+    function invalidDate () {
+        return this._invalidDate;
     }
 
-    // pick the locale from the array
-    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
-    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
-    function chooseLocale(names) {
-        var i = 0, j, next, locale, split;
+    var defaultOrdinal = '%d';
+    var defaultOrdinalParse = /\d{1,2}/;
 
-        while (i < names.length) {
-            split = normalizeLocale(names[i]).split('-');
-            j = split.length;
-            next = normalizeLocale(names[i + 1]);
-            next = next ? next.split('-') : null;
-            while (j > 0) {
-                locale = loadLocale(split.slice(0, j).join('-'));
-                if (locale) {
-                    return locale;
-                }
-                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
-                    //the next array item is better than a shallower substring of this one
-                    break;
-                }
-                j--;
-            }
-            i++;
-        }
-        return null;
+    function ordinal (number) {
+        return this._ordinal.replace('%d', number);
     }
 
-    function loadLocale(name) {
-        var oldLocale = null;
-        if (!locales[name] && hasModule) {
-            try {
-                oldLocale = moment.locale();
-                require('./locale/' + name);
-                // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales
-                moment.locale(oldLocale);
-            } catch (e) { }
-        }
-        return locales[name];
+    var defaultRelativeTime = {
+        future : 'in %s',
+        past   : '%s ago',
+        s  : 'a few seconds',
+        m  : 'a minute',
+        mm : '%d minutes',
+        h  : 'an hour',
+        hh : '%d hours',
+        d  : 'a day',
+        dd : '%d days',
+        M  : 'a month',
+        MM : '%d months',
+        y  : 'a year',
+        yy : '%d years'
+    };
+
+    function relative__relativeTime (number, withoutSuffix, string, isFuture) {
+        var output = this._relativeTime[string];
+        return (isFunction(output)) ?
+            output(number, withoutSuffix, string, isFuture) :
+            output.replace(/%d/i, number);
     }
 
-    // Return a moment from input, that is local/utc/zone equivalent to model.
-    function makeAs(input, model) {
-        var res, diff;
-        if (model._isUTC) {
-            res = model.clone();
-            diff = (moment.isMoment(input) || isDate(input) ?
-                    +input : +moment(input)) - (+res);
-            // Use low-level api, because this fn is low-level api.
-            res._d.setTime(+res._d + diff);
-            moment.updateOffset(res, false);
-            return res;
-        } else {
-            return moment(input).local();
-        }
+    function pastFuture (diff, output) {
+        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
     }
 
-    /************************************
-        Locale
-    ************************************/
+    var aliases = {};
 
+    function addUnitAlias (unit, shorthand) {
+        var lowerCase = unit.toLowerCase();
+        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+    }
 
-    extend(Locale.prototype, {
+    function normalizeUnits(units) {
+        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+    }
 
-        set : function (config) {
-            var prop, i;
-            for (i in config) {
-                prop = config[i];
-                if (typeof prop === 'function') {
-                    this[i] = prop;
-                } else {
-                    this['_' + i] = prop;
+    function normalizeObjectUnits(inputObject) {
+        var normalizedInput = {},
+            normalizedProp,
+            prop;
+
+        for (prop in inputObject) {
+            if (hasOwnProp(inputObject, prop)) {
+                normalizedProp = normalizeUnits(prop);
+                if (normalizedProp) {
+                    normalizedInput[normalizedProp] = inputObject[prop];
                 }
             }
-            // Lenient ordinal parsing accepts just a number in addition to
-            // number + (possibly) stuff coming from _ordinalParseLenient.
-            this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source);
-        },
+        }
 
-        _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
-        months : function (m) {
-            return this._months[m.month()];
-        },
+        return normalizedInput;
+    }
 
-        _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
-        monthsShort : function (m) {
-            return this._monthsShort[m.month()];
-        },
+    var priorities = {};
 
-        monthsParse : function (monthName, format, strict) {
-            var i, mom, regex;
+    function addUnitPriority(unit, priority) {
+        priorities[unit] = priority;
+    }
 
-            if (!this._monthsParse) {
-                this._monthsParse = [];
-                this._longMonthsParse = [];
-                this._shortMonthsParse = [];
-            }
+    function getPrioritizedUnits(unitsObj) {
+        var units = [];
+        for (var u in unitsObj) {
+            units.push({unit: u, priority: priorities[u]});
+        }
+        units.sort(function (a, b) {
+            return a.priority - b.priority;
+        });
+        return units;
+    }
 
-            for (i = 0; i < 12; i++) {
-                // make the regex if we don't have it already
-                mom = moment.utc([2000, i]);
-                if (strict && !this._longMonthsParse[i]) {
-                    this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
-                    this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
-                }
-                if (!strict && !this._monthsParse[i]) {
-                    regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
-                    this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
-                }
-                // test the regex
-                if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
-                    return i;
-                } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
-                    return i;
-                } else if (!strict && this._monthsParse[i].test(monthName)) {
-                    return i;
-                }
+    function makeGetSet (unit, keepTime) {
+        return function (value) {
+            if (value != null) {
+                get_set__set(this, unit, value);
+                utils_hooks__hooks.updateOffset(this, keepTime);
+                return this;
+            } else {
+                return get_set__get(this, unit);
             }
-        },
+        };
+    }
 
-        _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
-        weekdays : function (m) {
-            return this._weekdays[m.day()];
-        },
+    function get_set__get (mom, unit) {
+        return mom.isValid() ?
+            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
+    }
 
-        _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
-        weekdaysShort : function (m) {
-            return this._weekdaysShort[m.day()];
-        },
+    function get_set__set (mom, unit, value) {
+        if (mom.isValid()) {
+            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+        }
+    }
 
-        _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
-        weekdaysMin : function (m) {
-            return this._weekdaysMin[m.day()];
-        },
+    // MOMENTS
 
-        weekdaysParse : function (weekdayName) {
-            var i, mom, regex;
+    function stringGet (units) {
+        units = normalizeUnits(units);
+        if (isFunction(this[units])) {
+            return this[units]();
+        }
+        return this;
+    }
 
-            if (!this._weekdaysParse) {
-                this._weekdaysParse = [];
-            }
 
-            for (i = 0; i < 7; i++) {
-                // make the regex if we don't have it already
-                if (!this._weekdaysParse[i]) {
-                    mom = moment([2000, 1]).day(i);
-                    regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
-                    this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
-                }
-                // test the regex
-                if (this._weekdaysParse[i].test(weekdayName)) {
-                    return i;
-                }
+    function stringSet (units, value) {
+        if (typeof units === 'object') {
+            units = normalizeObjectUnits(units);
+            var prioritized = getPrioritizedUnits(units);
+            for (var i = 0; i < prioritized.length; i++) {
+                this[prioritized[i].unit](units[prioritized[i].unit]);
             }
-        },
-
-        _longDateFormat : {
-            LTS : 'h:mm:ss A',
-            LT : 'h:mm A',
-            L : 'MM/DD/YYYY',
-            LL : 'MMMM D, YYYY',
-            LLL : 'MMMM D, YYYY LT',
-            LLLL : 'dddd, MMMM D, YYYY LT'
-        },
-        longDateFormat : function (key) {
-            var output = this._longDateFormat[key];
-            if (!output && this._longDateFormat[key.toUpperCase()]) {
-                output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
-                    return val.slice(1);
-                });
-                this._longDateFormat[key] = output;
+        } else {
+            units = normalizeUnits(units);
+            if (isFunction(this[units])) {
+                return this[units](value);
             }
-            return output;
-        },
-
-        isPM : function (input) {
-            // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
-            // Using charAt should be more compatible.
-            return ((input + '').toLowerCase().charAt(0) === 'p');
-        },
-
-        _meridiemParse : /[ap]\.?m?\.?/i,
-        meridiem : function (hours, minutes, isLower) {
-            if (hours > 11) {
-                return isLower ? 'pm' : 'PM';
-            } else {
-                return isLower ? 'am' : 'AM';
-            }
-        },
-
-        _calendar : {
-            sameDay : '[Today at] LT',
-            nextDay : '[Tomorrow at] LT',
-            nextWeek : 'dddd [at] LT',
-            lastDay : '[Yesterday at] LT',
-            lastWeek : '[Last] dddd [at] LT',
-            sameElse : 'L'
-        },
-        calendar : function (key, mom, now) {
-            var output = this._calendar[key];
-            return typeof output === 'function' ? output.apply(mom, [now]) : output;
-        },
-
-        _relativeTime : {
-            future : 'in %s',
-            past : '%s ago',
-            s : 'a few seconds',
-            m : 'a minute',
-            mm : '%d minutes',
-            h : 'an hour',
-            hh : '%d hours',
-            d : 'a day',
-            dd : '%d days',
-            M : 'a month',
-            MM : '%d months',
-            y : 'a year',
-            yy : '%d years'
-        },
-
-        relativeTime : function (number, withoutSuffix, string, isFuture) {
-            var output = this._relativeTime[string];
-            return (typeof output === 'function') ?
-                output(number, withoutSuffix, string, isFuture) :
-                output.replace(/%d/i, number);
-        },
-
-        pastFuture : function (diff, output) {
-            var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
-            return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
-        },
+        }
+        return this;
+    }
 
-        ordinal : function (number) {
-            return this._ordinal.replace('%d', number);
-        },
-        _ordinal : '%d',
-        _ordinalParse : /\d{1,2}/,
+    function zeroFill(number, targetLength, forceSign) {
+        var absNumber = '' + Math.abs(number),
+            zerosToFill = targetLength - absNumber.length,
+            sign = number >= 0;
+        return (sign ? (forceSign ? '+' : '') : '-') +
+            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
+    }
 
-        preparse : function (string) {
-            return string;
-        },
+    var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
 
-        postformat : function (string) {
-            return string;
-        },
+    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
 
-        week : function (mom) {
-            return weekOfYear(mom, this._week.dow, this._week.doy).week;
-        },
+    var formatFunctions = {};
 
-        _week : {
-            dow : 0, // Sunday is the first day of the week.
-            doy : 6  // The week that contains Jan 1st is the first week of the year.
-        },
+    var formatTokenFunctions = {};
 
-        _invalidDate: 'Invalid date',
-        invalidDate: function () {
-            return this._invalidDate;
+    // token:    'M'
+    // padded:   ['MM', 2]
+    // ordinal:  'Mo'
+    // callback: function () { this.month() + 1 }
+    function addFormatToken (token, padded, ordinal, callback) {
+        var func = callback;
+        if (typeof callback === 'string') {
+            func = function () {
+                return this[callback]();
+            };
         }
-    });
-
-    /************************************
-        Formatting
-    ************************************/
-
+        if (token) {
+            formatTokenFunctions[token] = func;
+        }
+        if (padded) {
+            formatTokenFunctions[padded[0]] = function () {
+                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+            };
+        }
+        if (ordinal) {
+            formatTokenFunctions[ordinal] = function () {
+                return this.localeData().ordinal(func.apply(this, arguments), token);
+            };
+        }
+    }
 
     function removeFormattingTokens(input) {
         if (input.match(/\[[\s\S]/)) {
         }
 
         return function (mom) {
-            var output = '';
+            var output = '', i;
             for (i = 0; i < length; i++) {
                 output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
             }
         }
 
         format = expandFormat(format, m.localeData());
-
-        if (!formatFunctions[format]) {
-            formatFunctions[format] = makeFormatFunction(format);
-        }
+        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
 
         return formatFunctions[format](m);
     }
         return format;
     }
 
+    var match1         = /\d/;            //       0 - 9
+    var match2         = /\d\d/;          //      00 - 99
+    var match3         = /\d{3}/;         //     000 - 999
+    var match4         = /\d{4}/;         //    0000 - 9999
+    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
+    var match1to2      = /\d\d?/;         //       0 - 99
+    var match3to4      = /\d\d\d\d?/;     //     999 - 9999
+    var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
+    var match1to3      = /\d{1,3}/;       //       0 - 999
+    var match1to4      = /\d{1,4}/;       //       0 - 9999
+    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999
 
-    /************************************
-        Parsing
-    ************************************/
-
-
-    // get the regex to find the next token
-    function getParseRegexForToken(token, config) {
-        var a, strict = config._strict;
-        switch (token) {
-        case 'Q':
-            return parseTokenOneDigit;
-        case 'DDDD':
-            return parseTokenThreeDigits;
-        case 'YYYY':
-        case 'GGGG':
-        case 'gggg':
-            return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
-        case 'Y':
-        case 'G':
-        case 'g':
-            return parseTokenSignedNumber;
-        case 'YYYYYY':
-        case 'YYYYY':
-        case 'GGGGG':
-        case 'ggggg':
-            return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
-        case 'S':
-            if (strict) {
-                return parseTokenOneDigit;
-            }
-            /* falls through */
-        case 'SS':
-            if (strict) {
-                return parseTokenTwoDigits;
-            }
-            /* falls through */
-        case 'SSS':
-            if (strict) {
-                return parseTokenThreeDigits;
-            }
-            /* falls through */
-        case 'DDD':
-            return parseTokenOneToThreeDigits;
-        case 'MMM':
-        case 'MMMM':
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
-            return parseTokenWord;
-        case 'a':
-        case 'A':
-            return config._locale._meridiemParse;
-        case 'x':
-            return parseTokenOffsetMs;
-        case 'X':
-            return parseTokenTimestampMs;
-        case 'Z':
-        case 'ZZ':
-            return parseTokenTimezone;
-        case 'T':
-            return parseTokenT;
-        case 'SSSS':
-            return parseTokenDigits;
-        case 'MM':
-        case 'DD':
-        case 'YY':
-        case 'GG':
-        case 'gg':
-        case 'HH':
-        case 'hh':
-        case 'mm':
-        case 'ss':
-        case 'ww':
-        case 'WW':
-            return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
-        case 'M':
-        case 'D':
-        case 'd':
-        case 'H':
-        case 'h':
-        case 'm':
-        case 's':
-        case 'w':
-        case 'W':
-        case 'e':
-        case 'E':
-            return parseTokenOneOrTwoDigits;
-        case 'Do':
-            return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient;
-        default :
-            a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));
-            return a;
+    var matchUnsigned  = /\d+/;           //       0 - inf
+    var matchSigned    = /[+-]?\d+/;      //    -inf - inf
+
+    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+    var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
+
+    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+    // any word (or two) characters or numbers including two/three word month in arabic.
+    // includes scottish gaelic two word and hyphenated months
+    var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
+
+
+    var regexes = {};
+
+    function addRegexToken (token, regex, strictRegex) {
+        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
+            return (isStrict && strictRegex) ? strictRegex : regex;
+        };
+    }
+
+    function getParseRegexForToken (token, config) {
+        if (!hasOwnProp(regexes, token)) {
+            return new RegExp(unescapeFormat(token));
         }
+
+        return regexes[token](config._strict, config._locale);
     }
 
-    function timezoneMinutesFromString(string) {
-        string = string || '';
-        var possibleTzMatches = (string.match(parseTokenTimezone) || []),
-            tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
-            parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
-            minutes = +(parts[1] * 60) + toInt(parts[2]);
+    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+    function unescapeFormat(s) {
+        return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+            return p1 || p2 || p3 || p4;
+        }));
+    }
 
-        return parts[0] === '+' ? -minutes : minutes;
+    function regexEscape(s) {
+        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
     }
 
-    // function to convert string input to date
-    function addTimeToArrayFromToken(token, input, config) {
-        var a, datePartArray = config._a;
-
-        switch (token) {
-        // QUARTER
-        case 'Q':
-            if (input != null) {
-                datePartArray[MONTH] = (toInt(input) - 1) * 3;
-            }
-            break;
-        // MONTH
-        case 'M' : // fall through to MM
-        case 'MM' :
-            if (input != null) {
-                datePartArray[MONTH] = toInt(input) - 1;
-            }
-            break;
-        case 'MMM' : // fall through to MMMM
-        case 'MMMM' :
-            a = config._locale.monthsParse(input, token, config._strict);
-            // if we didn't find a month name, mark the date as invalid.
-            if (a != null) {
-                datePartArray[MONTH] = a;
-            } else {
-                config._pf.invalidMonth = input;
-            }
-            break;
-        // DAY OF MONTH
-        case 'D' : // fall through to DD
-        case 'DD' :
-            if (input != null) {
-                datePartArray[DATE] = toInt(input);
-            }
-            break;
-        case 'Do' :
-            if (input != null) {
-                datePartArray[DATE] = toInt(parseInt(
-                            input.match(/\d{1,2}/)[0], 10));
-            }
-            break;
-        // DAY OF YEAR
-        case 'DDD' : // fall through to DDDD
-        case 'DDDD' :
-            if (input != null) {
-                config._dayOfYear = toInt(input);
-            }
-
-            break;
-        // YEAR
-        case 'YY' :
-            datePartArray[YEAR] = moment.parseTwoDigitYear(input);
-            break;
-        case 'YYYY' :
-        case 'YYYYY' :
-        case 'YYYYYY' :
-            datePartArray[YEAR] = toInt(input);
-            break;
-        // AM / PM
-        case 'a' : // fall through to A
-        case 'A' :
-            config._isPm = config._locale.isPM(input);
-            break;
-        // HOUR
-        case 'h' : // fall through to hh
-        case 'hh' :
-            config._pf.bigHour = true;
-            /* falls through */
-        case 'H' : // fall through to HH
-        case 'HH' :
-            datePartArray[HOUR] = toInt(input);
-            break;
-        // MINUTE
-        case 'm' : // fall through to mm
-        case 'mm' :
-            datePartArray[MINUTE] = toInt(input);
-            break;
-        // SECOND
-        case 's' : // fall through to ss
-        case 'ss' :
-            datePartArray[SECOND] = toInt(input);
-            break;
-        // MILLISECOND
-        case 'S' :
-        case 'SS' :
-        case 'SSS' :
-        case 'SSSS' :
-            datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
-            break;
-        // UNIX OFFSET (MILLISECONDS)
-        case 'x':
-            config._d = new Date(toInt(input));
-            break;
-        // UNIX TIMESTAMP WITH MS
-        case 'X':
-            config._d = new Date(parseFloat(input) * 1000);
-            break;
-        // TIMEZONE
-        case 'Z' : // fall through to ZZ
-        case 'ZZ' :
-            config._useUTC = true;
-            config._tzm = timezoneMinutesFromString(input);
-            break;
-        // WEEKDAY - human
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
-            a = config._locale.weekdaysParse(input);
-            // if we didn't get a weekday name, mark the date as invalid
-            if (a != null) {
-                config._w = config._w || {};
-                config._w['d'] = a;
-            } else {
-                config._pf.invalidWeekday = input;
-            }
-            break;
-        // WEEK, WEEK DAY - numeric
-        case 'w':
-        case 'ww':
-        case 'W':
-        case 'WW':
-        case 'd':
-        case 'e':
-        case 'E':
-            token = token.substr(0, 1);
-            /* falls through */
-        case 'gggg':
-        case 'GGGG':
-        case 'GGGGG':
-            token = token.substr(0, 2);
-            if (input) {
-                config._w = config._w || {};
-                config._w[token] = toInt(input);
-            }
-            break;
-        case 'gg':
-        case 'GG':
-            config._w = config._w || {};
-            config._w[token] = moment.parseTwoDigitYear(input);
+    var tokens = {};
+
+    function addParseToken (token, callback) {
+        var i, func = callback;
+        if (typeof token === 'string') {
+            token = [token];
+        }
+        if (typeof callback === 'number') {
+            func = function (input, array) {
+                array[callback] = toInt(input);
+            };
+        }
+        for (i = 0; i < token.length; i++) {
+            tokens[token[i]] = func;
         }
     }
 
-    function dayOfYearFromWeekInfo(config) {
-        var w, weekYear, week, weekday, dow, doy, temp;
+    function addWeekParseToken (token, callback) {
+        addParseToken(token, function (input, array, config, token) {
+            config._w = config._w || {};
+            callback(input, config._w, config, token);
+        });
+    }
 
-        w = config._w;
-        if (w.GG != null || w.W != null || w.E != null) {
-            dow = 1;
-            doy = 4;
+    function addTimeToArrayFromToken(token, input, config) {
+        if (input != null && hasOwnProp(tokens, token)) {
+            tokens[token](input, config._a, config, token);
+        }
+    }
 
-            // TODO: We need to take the current isoWeekYear, but that depends on
-            // how we interpret now (local, utc, fixed offset). So create
-            // a now version of current config (take local/utc/offset flags, and
-            // create now).
-            weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);
-            week = dfl(w.W, 1);
-            weekday = dfl(w.E, 1);
-        } else {
-            dow = config._locale._week.dow;
-            doy = config._locale._week.doy;
+    var YEAR = 0;
+    var MONTH = 1;
+    var DATE = 2;
+    var HOUR = 3;
+    var MINUTE = 4;
+    var SECOND = 5;
+    var MILLISECOND = 6;
+    var WEEK = 7;
+    var WEEKDAY = 8;
 
-            weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);
-            week = dfl(w.w, 1);
+    var indexOf;
 
-            if (w.d != null) {
-                // weekday -- low day numbers are considered next week
-                weekday = w.d;
-                if (weekday < dow) {
-                    ++week;
+    if (Array.prototype.indexOf) {
+        indexOf = Array.prototype.indexOf;
+    } else {
+        indexOf = function (o) {
+            // I know
+            var i;
+            for (i = 0; i < this.length; ++i) {
+                if (this[i] === o) {
+                    return i;
                 }
-            } else if (w.e != null) {
-                // local weekday -- counting starts from begining of week
-                weekday = w.e + dow;
-            } else {
-                // default to begining of week
-                weekday = dow;
             }
-        }
-        temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
+            return -1;
+        };
+    }
 
-        config._a[YEAR] = temp.year;
-        config._dayOfYear = temp.dayOfYear;
+    function daysInMonth(year, month) {
+        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
     }
 
-    // convert an array to a date.
-    // the array should mirror the parameters below
-    // note: all values past the year are optional and will default to the lowest possible value.
-    // [year, month, day , hour, minute, second, millisecond]
-    function dateFromConfig(config) {
-        var i, date, input = [], currentDate, yearToUse;
+    // FORMATTING
 
-        if (config._d) {
-            return;
-        }
+    addFormatToken('M', ['MM', 2], 'Mo', function () {
+        return this.month() + 1;
+    });
 
-        currentDate = currentDateArray(config);
+    addFormatToken('MMM', 0, 0, function (format) {
+        return this.localeData().monthsShort(this, format);
+    });
 
-        //compute day of the year from weeks and weekdays
-        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
-            dayOfYearFromWeekInfo(config);
-        }
+    addFormatToken('MMMM', 0, 0, function (format) {
+        return this.localeData().months(this, format);
+    });
 
-        //if the day of the year is set, figure out what it is
-        if (config._dayOfYear) {
-            yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);
+    // ALIASES
 
-            if (config._dayOfYear > daysInYear(yearToUse)) {
-                config._pf._overflowDayOfYear = true;
-            }
+    addUnitAlias('month', 'M');
 
-            date = makeUTCDate(yearToUse, 0, config._dayOfYear);
-            config._a[MONTH] = date.getUTCMonth();
-            config._a[DATE] = date.getUTCDate();
-        }
+    // PRIORITY
 
-        // Default to current date.
-        // * if no year, month, day of month are given, default to today
-        // * if day of month is given, default month and year
-        // * if month is given, default only year
-        // * if year is given, don't default anything
-        for (i = 0; i < 3 && config._a[i] == null; ++i) {
-            config._a[i] = input[i] = currentDate[i];
+    addUnitPriority('month', 8);
+
+    // PARSING
+
+    addRegexToken('M',    match1to2);
+    addRegexToken('MM',   match1to2, match2);
+    addRegexToken('MMM',  function (isStrict, locale) {
+        return locale.monthsShortRegex(isStrict);
+    });
+    addRegexToken('MMMM', function (isStrict, locale) {
+        return locale.monthsRegex(isStrict);
+    });
+
+    addParseToken(['M', 'MM'], function (input, array) {
+        array[MONTH] = toInt(input) - 1;
+    });
+
+    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+        var month = config._locale.monthsParse(input, token, config._strict);
+        // if we didn't find a month name, mark the date as invalid.
+        if (month != null) {
+            array[MONTH] = month;
+        } else {
+            getParsingFlags(config).invalidMonth = input;
         }
+    });
 
-        // Zero out whatever was not defaulted, including time
-        for (; i < 7; i++) {
-            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+    // LOCALES
+
+    var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/;
+    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+    function localeMonths (m, format) {
+        if (!m) {
+            return this._months;
         }
+        return isArray(this._months) ? this._months[m.month()] :
+            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
+    }
 
-        // Check for 24:00:00.000
-        if (config._a[HOUR] === 24 &&
-                config._a[MINUTE] === 0 &&
-                config._a[SECOND] === 0 &&
-                config._a[MILLISECOND] === 0) {
-            config._nextDay = true;
-            config._a[HOUR] = 0;
+    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+    function localeMonthsShort (m, format) {
+        if (!m) {
+            return this._monthsShort;
         }
+        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
+            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
+    }
 
-        config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
-        // Apply timezone offset from input. The actual zone can be changed
-        // with parseZone.
-        if (config._tzm != null) {
-            config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm);
+    function units_month__handleStrictParse(monthName, format, strict) {
+        var i, ii, mom, llc = monthName.toLocaleLowerCase();
+        if (!this._monthsParse) {
+            // this is not used
+            this._monthsParse = [];
+            this._longMonthsParse = [];
+            this._shortMonthsParse = [];
+            for (i = 0; i < 12; ++i) {
+                mom = create_utc__createUTC([2000, i]);
+                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
+                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
+            }
         }
 
-        if (config._nextDay) {
-            config._a[HOUR] = 24;
+        if (strict) {
+            if (format === 'MMM') {
+                ii = indexOf.call(this._shortMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._longMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            }
+        } else {
+            if (format === 'MMM') {
+                ii = indexOf.call(this._shortMonthsParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._longMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._longMonthsParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._shortMonthsParse, llc);
+                return ii !== -1 ? ii : null;
+            }
         }
     }
 
-    function dateFromObject(config) {
-        var normalizedInput;
+    function localeMonthsParse (monthName, format, strict) {
+        var i, mom, regex;
 
-        if (config._d) {
-            return;
+        if (this._monthsParseExact) {
+            return units_month__handleStrictParse.call(this, monthName, format, strict);
         }
 
-        normalizedInput = normalizeObjectUnits(config._i);
-        config._a = [
-            normalizedInput.year,
-            normalizedInput.month,
-            normalizedInput.day || normalizedInput.date,
-            normalizedInput.hour,
-            normalizedInput.minute,
-            normalizedInput.second,
-            normalizedInput.millisecond
-        ];
+        if (!this._monthsParse) {
+            this._monthsParse = [];
+            this._longMonthsParse = [];
+            this._shortMonthsParse = [];
+        }
 
-        dateFromConfig(config);
+        // TODO: add sorting
+        // Sorting makes sure if one month (or abbr) is a prefix of another
+        // see sorting in computeMonthsParse
+        for (i = 0; i < 12; i++) {
+            // make the regex if we don't have it already
+            mom = create_utc__createUTC([2000, i]);
+            if (strict && !this._longMonthsParse[i]) {
+                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
+            }
+            if (!strict && !this._monthsParse[i]) {
+                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+            }
+            // test the regex
+            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+                return i;
+            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+                return i;
+            } else if (!strict && this._monthsParse[i].test(monthName)) {
+                return i;
+            }
+        }
     }
 
-    function currentDateArray(config) {
-        var now = new Date();
-        if (config._useUTC) {
-            return [
-                now.getUTCFullYear(),
-                now.getUTCMonth(),
-                now.getUTCDate()
-            ];
-        } else {
-            return [now.getFullYear(), now.getMonth(), now.getDate()];
+    // MOMENTS
+
+    function setMonth (mom, value) {
+        var dayOfMonth;
+
+        if (!mom.isValid()) {
+            // No op
+            return mom;
         }
-    }
 
-    // date from string and format string
-    function makeDateFromStringAndFormat(config) {
-        if (config._f === moment.ISO_8601) {
-            parseISO(config);
-            return;
+        if (typeof value === 'string') {
+            if (/^\d+$/.test(value)) {
+                value = toInt(value);
+            } else {
+                value = mom.localeData().monthsParse(value);
+                // TODO: Another silent failure?
+                if (typeof value !== 'number') {
+                    return mom;
+                }
+            }
         }
 
-        config._a = [];
-        config._pf.empty = true;
+        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+        return mom;
+    }
 
-        // This array is used to make a Date, either with `new Date` or `Date.UTC`
-        var string = '' + config._i,
-            i, parsedInput, tokens, token, skipped,
-            stringLength = string.length,
-            totalParsedInputLength = 0;
+    function getSetMonth (value) {
+        if (value != null) {
+            setMonth(this, value);
+            utils_hooks__hooks.updateOffset(this, true);
+            return this;
+        } else {
+            return get_set__get(this, 'Month');
+        }
+    }
 
-        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+    function getDaysInMonth () {
+        return daysInMonth(this.year(), this.month());
+    }
 
-        for (i = 0; i < tokens.length; i++) {
-            token = tokens[i];
-            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
-            if (parsedInput) {
-                skipped = string.substr(0, string.indexOf(parsedInput));
-                if (skipped.length > 0) {
-                    config._pf.unusedInput.push(skipped);
-                }
-                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
-                totalParsedInputLength += parsedInput.length;
+    var defaultMonthsShortRegex = matchWord;
+    function monthsShortRegex (isStrict) {
+        if (this._monthsParseExact) {
+            if (!hasOwnProp(this, '_monthsRegex')) {
+                computeMonthsParse.call(this);
             }
-            // don't parse if it's not a known token
-            if (formatTokenFunctions[token]) {
-                if (parsedInput) {
-                    config._pf.empty = false;
-                }
-                else {
-                    config._pf.unusedTokens.push(token);
-                }
-                addTimeToArrayFromToken(token, parsedInput, config);
+            if (isStrict) {
+                return this._monthsShortStrictRegex;
+            } else {
+                return this._monthsShortRegex;
             }
-            else if (config._strict && !parsedInput) {
-                config._pf.unusedTokens.push(token);
+        } else {
+            if (!hasOwnProp(this, '_monthsShortRegex')) {
+                this._monthsShortRegex = defaultMonthsShortRegex;
             }
+            return this._monthsShortStrictRegex && isStrict ?
+                this._monthsShortStrictRegex : this._monthsShortRegex;
         }
+    }
 
-        // add remaining unparsed input length to the string
-        config._pf.charsLeftOver = stringLength - totalParsedInputLength;
-        if (string.length > 0) {
-            config._pf.unusedInput.push(string);
+    var defaultMonthsRegex = matchWord;
+    function monthsRegex (isStrict) {
+        if (this._monthsParseExact) {
+            if (!hasOwnProp(this, '_monthsRegex')) {
+                computeMonthsParse.call(this);
+            }
+            if (isStrict) {
+                return this._monthsStrictRegex;
+            } else {
+                return this._monthsRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_monthsRegex')) {
+                this._monthsRegex = defaultMonthsRegex;
+            }
+            return this._monthsStrictRegex && isStrict ?
+                this._monthsStrictRegex : this._monthsRegex;
         }
+    }
 
-        // clear _12h flag if hour is <= 12
-        if (config._pf.bigHour === true && config._a[HOUR] <= 12) {
-            config._pf.bigHour = undefined;
+    function computeMonthsParse () {
+        function cmpLenRev(a, b) {
+            return b.length - a.length;
         }
-        // handle am pm
-        if (config._isPm && config._a[HOUR] < 12) {
-            config._a[HOUR] += 12;
+
+        var shortPieces = [], longPieces = [], mixedPieces = [],
+            i, mom;
+        for (i = 0; i < 12; i++) {
+            // make the regex if we don't have it already
+            mom = create_utc__createUTC([2000, i]);
+            shortPieces.push(this.monthsShort(mom, ''));
+            longPieces.push(this.months(mom, ''));
+            mixedPieces.push(this.months(mom, ''));
+            mixedPieces.push(this.monthsShort(mom, ''));
         }
-        // if is 12 am, change hours to 0
-        if (config._isPm === false && config._a[HOUR] === 12) {
-            config._a[HOUR] = 0;
+        // Sorting makes sure if one month (or abbr) is a prefix of another it
+        // will match the longer piece.
+        shortPieces.sort(cmpLenRev);
+        longPieces.sort(cmpLenRev);
+        mixedPieces.sort(cmpLenRev);
+        for (i = 0; i < 12; i++) {
+            shortPieces[i] = regexEscape(shortPieces[i]);
+            longPieces[i] = regexEscape(longPieces[i]);
+        }
+        for (i = 0; i < 24; i++) {
+            mixedPieces[i] = regexEscape(mixedPieces[i]);
         }
-        dateFromConfig(config);
-        checkOverflow(config);
-    }
 
-    function unescapeFormat(s) {
-        return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
-            return p1 || p2 || p3 || p4;
-        });
+        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+        this._monthsShortRegex = this._monthsRegex;
+        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
     }
 
-    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
-    function regexpEscape(s) {
-        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
-    }
+    // FORMATTING
 
-    // date from string and array of format strings
-    function makeDateFromStringAndArray(config) {
-        var tempConfig,
-            bestMoment,
+    addFormatToken('Y', 0, 0, function () {
+        var y = this.year();
+        return y <= 9999 ? '' + y : '+' + y;
+    });
 
-            scoreToBeat,
-            i,
-            currentScore;
+    addFormatToken(0, ['YY', 2], 0, function () {
+        return this.year() % 100;
+    });
 
-        if (config._f.length === 0) {
-            config._pf.invalidFormat = true;
-            config._d = new Date(NaN);
-            return;
-        }
+    addFormatToken(0, ['YYYY',   4],       0, 'year');
+    addFormatToken(0, ['YYYYY',  5],       0, 'year');
+    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
 
-        for (i = 0; i < config._f.length; i++) {
-            currentScore = 0;
-            tempConfig = copyConfig({}, config);
-            if (config._useUTC != null) {
-                tempConfig._useUTC = config._useUTC;
-            }
-            tempConfig._pf = defaultParsingFlags();
-            tempConfig._f = config._f[i];
-            makeDateFromStringAndFormat(tempConfig);
+    // ALIASES
 
-            if (!isValid(tempConfig)) {
-                continue;
-            }
+    addUnitAlias('year', 'y');
 
-            // if there is any input that was not parsed add a penalty for that format
-            currentScore += tempConfig._pf.charsLeftOver;
+    // PRIORITIES
 
-            //or tokens
-            currentScore += tempConfig._pf.unusedTokens.length * 10;
+    addUnitPriority('year', 1);
 
-            tempConfig._pf.score = currentScore;
+    // PARSING
 
-            if (scoreToBeat == null || currentScore < scoreToBeat) {
-                scoreToBeat = currentScore;
-                bestMoment = tempConfig;
-            }
-        }
+    addRegexToken('Y',      matchSigned);
+    addRegexToken('YY',     match1to2, match2);
+    addRegexToken('YYYY',   match1to4, match4);
+    addRegexToken('YYYYY',  match1to6, match6);
+    addRegexToken('YYYYYY', match1to6, match6);
 
-        extend(config, bestMoment || tempConfig);
-    }
+    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
+    addParseToken('YYYY', function (input, array) {
+        array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);
+    });
+    addParseToken('YY', function (input, array) {
+        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);
+    });
+    addParseToken('Y', function (input, array) {
+        array[YEAR] = parseInt(input, 10);
+    });
 
-    // date from iso format
-    function parseISO(config) {
-        var i, l,
-            string = config._i,
-            match = isoRegex.exec(string);
+    // HELPERS
 
-        if (match) {
-            config._pf.iso = true;
-            for (i = 0, l = isoDates.length; i < l; i++) {
-                if (isoDates[i][1].exec(string)) {
-                    // match[5] should be 'T' or undefined
-                    config._f = isoDates[i][0] + (match[6] || ' ');
-                    break;
-                }
-            }
-            for (i = 0, l = isoTimes.length; i < l; i++) {
-                if (isoTimes[i][1].exec(string)) {
-                    config._f += isoTimes[i][0];
-                    break;
-                }
-            }
-            if (string.match(parseTokenTimezone)) {
-                config._f += 'Z';
-            }
-            makeDateFromStringAndFormat(config);
-        } else {
-            config._isValid = false;
-        }
+    function daysInYear(year) {
+        return isLeapYear(year) ? 366 : 365;
     }
 
-    // date from iso format or fallback
-    function makeDateFromString(config) {
-        parseISO(config);
-        if (config._isValid === false) {
-            delete config._isValid;
-            moment.createFromInputFallback(config);
-        }
+    function isLeapYear(year) {
+        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
     }
 
-    function map(arr, fn) {
-        var res = [], i;
-        for (i = 0; i < arr.length; ++i) {
-            res.push(fn(arr[i], i));
-        }
-        return res;
-    }
+    // HOOKS
 
-    function makeDateFromInput(config) {
-        var input = config._i, matched;
-        if (input === undefined) {
-            config._d = new Date();
-        } else if (isDate(input)) {
-            config._d = new Date(+input);
-        } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {
-            config._d = new Date(+matched[1]);
-        } else if (typeof input === 'string') {
-            makeDateFromString(config);
-        } else if (isArray(input)) {
-            config._a = map(input.slice(0), function (obj) {
-                return parseInt(obj, 10);
-            });
-            dateFromConfig(config);
-        } else if (typeof(input) === 'object') {
-            dateFromObject(config);
-        } else if (typeof(input) === 'number') {
-            // from milliseconds
-            config._d = new Date(input);
-        } else {
-            moment.createFromInputFallback(config);
-        }
+    utils_hooks__hooks.parseTwoDigitYear = function (input) {
+        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+    };
+
+    // MOMENTS
+
+    var getSetYear = makeGetSet('FullYear', true);
+
+    function getIsLeapYear () {
+        return isLeapYear(this.year());
     }
 
-    function makeDate(y, m, d, h, M, s, ms) {
+    function createDate (y, m, d, h, M, s, ms) {
         //can't just apply() to create a date:
         //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
         var date = new Date(y, m, d, h, M, s, ms);
 
-        //the date constructor doesn't accept years < 1970
-        if (y < 1970) {
+        //the date constructor remaps years 0-99 to 1900-1999
+        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
             date.setFullYear(y);
         }
         return date;
     }
 
-    function makeUTCDate(y) {
+    function createUTCDate (y) {
         var date = new Date(Date.UTC.apply(null, arguments));
-        if (y < 1970) {
+
+        //the Date.UTC function remaps years 0-99 to 1900-1999
+        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
             date.setUTCFullYear(y);
         }
         return date;
     }
 
-    function parseWeekday(input, locale) {
-        if (typeof input === 'string') {
-            if (!isNaN(input)) {
-                input = parseInt(input, 10);
-            }
-            else {
-                input = locale.weekdaysParse(input);
-                if (typeof input !== 'number') {
-                    return null;
-                }
-            }
+    // start-of-first-week - start-of-year
+    function firstWeekOffset(year, dow, doy) {
+        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+            fwd = 7 + dow - doy,
+            // first-week day local weekday -- which local weekday is fwd
+            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
+
+        return -fwdlw + fwd - 1;
+    }
+
+    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
+        var localWeekday = (7 + weekday - dow) % 7,
+            weekOffset = firstWeekOffset(year, dow, doy),
+            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
+            resYear, resDayOfYear;
+
+        if (dayOfYear <= 0) {
+            resYear = year - 1;
+            resDayOfYear = daysInYear(resYear) + dayOfYear;
+        } else if (dayOfYear > daysInYear(year)) {
+            resYear = year + 1;
+            resDayOfYear = dayOfYear - daysInYear(year);
+        } else {
+            resYear = year;
+            resDayOfYear = dayOfYear;
         }
-        return input;
+
+        return {
+            year: resYear,
+            dayOfYear: resDayOfYear
+        };
     }
 
-    /************************************
-        Relative Time
-    ************************************/
+    function weekOfYear(mom, dow, doy) {
+        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
+            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
+            resWeek, resYear;
+
+        if (week < 1) {
+            resYear = mom.year() - 1;
+            resWeek = week + weeksInYear(resYear, dow, doy);
+        } else if (week > weeksInYear(mom.year(), dow, doy)) {
+            resWeek = week - weeksInYear(mom.year(), dow, doy);
+            resYear = mom.year() + 1;
+        } else {
+            resYear = mom.year();
+            resWeek = week;
+        }
 
+        return {
+            week: resWeek,
+            year: resYear
+        };
+    }
 
-    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
-    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
-        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+    function weeksInYear(year, dow, doy) {
+        var weekOffset = firstWeekOffset(year, dow, doy),
+            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
+        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
     }
 
-    function relativeTime(posNegDuration, withoutSuffix, locale) {
-        var duration = moment.duration(posNegDuration).abs(),
-            seconds = round(duration.as('s')),
-            minutes = round(duration.as('m')),
-            hours = round(duration.as('h')),
-            days = round(duration.as('d')),
-            months = round(duration.as('M')),
-            years = round(duration.as('y')),
+    // FORMATTING
 
-            args = seconds < relativeTimeThresholds.s && ['s', seconds] ||
-                minutes === 1 && ['m'] ||
-                minutes < relativeTimeThresholds.m && ['mm', minutes] ||
-                hours === 1 && ['h'] ||
-                hours < relativeTimeThresholds.h && ['hh', hours] ||
-                days === 1 && ['d'] ||
-                days < relativeTimeThresholds.d && ['dd', days] ||
-                months === 1 && ['M'] ||
-                months < relativeTimeThresholds.M && ['MM', months] ||
-                years === 1 && ['y'] || ['yy', years];
+    addFormatToken('w', ['ww', 2], 'wo', 'week');
+    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
 
-        args[2] = withoutSuffix;
-        args[3] = +posNegDuration > 0;
-        args[4] = locale;
-        return substituteTimeAgo.apply({}, args);
-    }
+    // ALIASES
 
+    addUnitAlias('week', 'w');
+    addUnitAlias('isoWeek', 'W');
 
-    /************************************
-        Week of Year
-    ************************************/
+    // PRIORITIES
 
+    addUnitPriority('week', 5);
+    addUnitPriority('isoWeek', 5);
 
-    // firstDayOfWeek       0 = sun, 6 = sat
-    //                      the day of the week that starts the week
-    //                      (usually sunday or monday)
-    // firstDayOfWeekOfYear 0 = sun, 6 = sat
-    //                      the first week is the week that contains the first
-    //                      of this day of the week
-    //                      (eg. ISO weeks use thursday (4))
-    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
-        var end = firstDayOfWeekOfYear - firstDayOfWeek,
-            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
-            adjustedMoment;
+    // PARSING
 
+    addRegexToken('w',  match1to2);
+    addRegexToken('ww', match1to2, match2);
+    addRegexToken('W',  match1to2);
+    addRegexToken('WW', match1to2, match2);
 
-        if (daysToDayOfWeek > end) {
-            daysToDayOfWeek -= 7;
-        }
+    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+        week[token.substr(0, 1)] = toInt(input);
+    });
 
-        if (daysToDayOfWeek < end - 7) {
-            daysToDayOfWeek += 7;
-        }
+    // HELPERS
 
-        adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');
-        return {
-            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
-            year: adjustedMoment.year()
-        };
+    // LOCALES
+
+    function localeWeek (mom) {
+        return weekOfYear(mom, this._week.dow, this._week.doy).week;
     }
 
-    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
-    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
-        var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
+    var defaultLocaleWeek = {
+        dow : 0, // Sunday is the first day of the week.
+        doy : 6  // The week that contains Jan 1st is the first week of the year.
+    };
 
-        d = d === 0 ? 7 : d;
-        weekday = weekday != null ? weekday : firstDayOfWeek;
-        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
-        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+    function localeFirstDayOfWeek () {
+        return this._week.dow;
+    }
 
-        return {
-            year: dayOfYear > 0 ? year : year - 1,
-            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
-        };
+    function localeFirstDayOfYear () {
+        return this._week.doy;
     }
 
-    /************************************
-        Top Level Functions
-    ************************************/
+    // MOMENTS
 
-    function makeMoment(config) {
-        var input = config._i,
-            format = config._f,
-            res;
+    function getSetWeek (input) {
+        var week = this.localeData().week(this);
+        return input == null ? week : this.add((input - week) * 7, 'd');
+    }
 
-        config._locale = config._locale || moment.localeData(config._l);
+    function getSetISOWeek (input) {
+        var week = weekOfYear(this, 1, 4).week;
+        return input == null ? week : this.add((input - week) * 7, 'd');
+    }
 
-        if (input === null || (format === undefined && input === '')) {
-            return moment.invalid({nullInput: true});
-        }
+    // FORMATTING
 
-        if (typeof input === 'string') {
-            config._i = input = config._locale.preparse(input);
-        }
+    addFormatToken('d', 0, 'do', 'day');
 
-        if (moment.isMoment(input)) {
-            return new Moment(input, true);
-        } else if (format) {
-            if (isArray(format)) {
-                makeDateFromStringAndArray(config);
-            } else {
-                makeDateFromStringAndFormat(config);
-            }
-        } else {
-            makeDateFromInput(config);
-        }
+    addFormatToken('dd', 0, 0, function (format) {
+        return this.localeData().weekdaysMin(this, format);
+    });
 
-        res = new Moment(config);
-        if (res._nextDay) {
-            // Adding is smart enough around DST
-            res.add(1, 'd');
-            res._nextDay = undefined;
-        }
+    addFormatToken('ddd', 0, 0, function (format) {
+        return this.localeData().weekdaysShort(this, format);
+    });
 
-        return res;
-    }
+    addFormatToken('dddd', 0, 0, function (format) {
+        return this.localeData().weekdays(this, format);
+    });
 
-    moment = function (input, format, locale, strict) {
-        var c;
+    addFormatToken('e', 0, 0, 'weekday');
+    addFormatToken('E', 0, 0, 'isoWeekday');
 
-        if (typeof(locale) === 'boolean') {
-            strict = locale;
-            locale = undefined;
+    // ALIASES
+
+    addUnitAlias('day', 'd');
+    addUnitAlias('weekday', 'e');
+    addUnitAlias('isoWeekday', 'E');
+
+    // PRIORITY
+    addUnitPriority('day', 11);
+    addUnitPriority('weekday', 11);
+    addUnitPriority('isoWeekday', 11);
+
+    // PARSING
+
+    addRegexToken('d',    match1to2);
+    addRegexToken('e',    match1to2);
+    addRegexToken('E',    match1to2);
+    addRegexToken('dd',   function (isStrict, locale) {
+        return locale.weekdaysMinRegex(isStrict);
+    });
+    addRegexToken('ddd',   function (isStrict, locale) {
+        return locale.weekdaysShortRegex(isStrict);
+    });
+    addRegexToken('dddd',   function (isStrict, locale) {
+        return locale.weekdaysRegex(isStrict);
+    });
+
+    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+        var weekday = config._locale.weekdaysParse(input, token, config._strict);
+        // if we didn't get a weekday name, mark the date as invalid
+        if (weekday != null) {
+            week.d = weekday;
+        } else {
+            getParsingFlags(config).invalidWeekday = input;
         }
-        // object construction must be done this way.
-        // https://github.com/moment/moment/issues/1423
-        c = {};
-        c._isAMomentObject = true;
-        c._i = input;
-        c._f = format;
-        c._l = locale;
-        c._strict = strict;
-        c._isUTC = false;
-        c._pf = defaultParsingFlags();
+    });
 
-        return makeMoment(c);
-    };
+    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+        week[token] = toInt(input);
+    });
 
-    moment.suppressDeprecationWarnings = false;
+    // HELPERS
 
-    moment.createFromInputFallback = deprecate(
-        'moment construction falls back to js Date. This is ' +
-        'discouraged and will be removed in upcoming major ' +
-        'release. Please refer to ' +
-        'https://github.com/moment/moment/issues/1407 for more info.',
-        function (config) {
-            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+    function parseWeekday(input, locale) {
+        if (typeof input !== 'string') {
+            return input;
         }
-    );
 
-    // Pick a moment m from moments so that m[fn](other) is true for all
-    // other. This relies on the function fn to be transitive.
-    //
-    // moments should either be an array of moment objects or an array, whose
-    // first element is an array of moment objects.
-    function pickBy(fn, moments) {
-        var res, i;
-        if (moments.length === 1 && isArray(moments[0])) {
-            moments = moments[0];
+        if (!isNaN(input)) {
+            return parseInt(input, 10);
         }
-        if (!moments.length) {
-            return moment();
+
+        input = locale.weekdaysParse(input);
+        if (typeof input === 'number') {
+            return input;
         }
-        res = moments[0];
-        for (i = 1; i < moments.length; ++i) {
-            if (moments[i][fn](res)) {
-                res = moments[i];
-            }
+
+        return null;
+    }
+
+    function parseIsoWeekday(input, locale) {
+        if (typeof input === 'string') {
+            return locale.weekdaysParse(input) % 7 || 7;
         }
-        return res;
+        return isNaN(input) ? null : input;
     }
 
-    moment.min = function () {
-        var args = [].slice.call(arguments, 0);
+    // LOCALES
 
-        return pickBy('isBefore', args);
-    };
+    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+    function localeWeekdays (m, format) {
+        if (!m) {
+            return this._weekdays;
+        }
+        return isArray(this._weekdays) ? this._weekdays[m.day()] :
+            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
+    }
 
-    moment.max = function () {
-        var args = [].slice.call(arguments, 0);
+    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+    function localeWeekdaysShort (m) {
+        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
+    }
 
-        return pickBy('isAfter', args);
-    };
+    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+    function localeWeekdaysMin (m) {
+        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
+    }
 
-    // creating with utc
-    moment.utc = function (input, format, locale, strict) {
-        var c;
+    function day_of_week__handleStrictParse(weekdayName, format, strict) {
+        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
+        if (!this._weekdaysParse) {
+            this._weekdaysParse = [];
+            this._shortWeekdaysParse = [];
+            this._minWeekdaysParse = [];
+
+            for (i = 0; i < 7; ++i) {
+                mom = create_utc__createUTC([2000, 1]).day(i);
+                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
+                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
+                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
+            }
+        }
 
-        if (typeof(locale) === 'boolean') {
-            strict = locale;
-            locale = undefined;
+        if (strict) {
+            if (format === 'dddd') {
+                ii = indexOf.call(this._weekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else if (format === 'ddd') {
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            }
+        } else {
+            if (format === 'dddd') {
+                ii = indexOf.call(this._weekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else if (format === 'ddd') {
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._weekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            } else {
+                ii = indexOf.call(this._minWeekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._weekdaysParse, llc);
+                if (ii !== -1) {
+                    return ii;
+                }
+                ii = indexOf.call(this._shortWeekdaysParse, llc);
+                return ii !== -1 ? ii : null;
+            }
         }
-        // object construction must be done this way.
-        // https://github.com/moment/moment/issues/1423
-        c = {};
-        c._isAMomentObject = true;
-        c._useUTC = true;
-        c._isUTC = true;
-        c._l = locale;
-        c._i = input;
-        c._f = format;
-        c._strict = strict;
-        c._pf = defaultParsingFlags();
+    }
 
-        return makeMoment(c).utc();
-    };
+    function localeWeekdaysParse (weekdayName, format, strict) {
+        var i, mom, regex;
 
-    // creating with unix timestamp (in seconds)
-    moment.unix = function (input) {
-        return moment(input * 1000);
-    };
+        if (this._weekdaysParseExact) {
+            return day_of_week__handleStrictParse.call(this, weekdayName, format, strict);
+        }
 
-    // duration
-    moment.duration = function (input, key) {
-        var duration = input,
-            // matching against regexp is expensive, do it on demand
-            match = null,
-            sign,
-            ret,
-            parseIso,
-            diffRes;
+        if (!this._weekdaysParse) {
+            this._weekdaysParse = [];
+            this._minWeekdaysParse = [];
+            this._shortWeekdaysParse = [];
+            this._fullWeekdaysParse = [];
+        }
 
-        if (moment.isDuration(input)) {
-            duration = {
-                ms: input._milliseconds,
-                d: input._days,
-                M: input._months
-            };
-        } else if (typeof input === 'number') {
-            duration = {};
-            if (key) {
-                duration[key] = input;
-            } else {
-                duration.milliseconds = input;
+        for (i = 0; i < 7; i++) {
+            // make the regex if we don't have it already
+
+            mom = create_utc__createUTC([2000, 1]).day(i);
+            if (strict && !this._fullWeekdaysParse[i]) {
+                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
             }
-        } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
-            sign = (match[1] === '-') ? -1 : 1;
-            duration = {
-                y: 0,
-                d: toInt(match[DATE]) * sign,
-                h: toInt(match[HOUR]) * sign,
-                m: toInt(match[MINUTE]) * sign,
-                s: toInt(match[SECOND]) * sign,
-                ms: toInt(match[MILLISECOND]) * sign
-            };
-        } else if (!!(match = isoDurationRegex.exec(input))) {
-            sign = (match[1] === '-') ? -1 : 1;
-            parseIso = function (inp) {
-                // We'd normally use ~~inp for this, but unfortunately it also
-                // converts floats to ints.
-                // inp may be undefined, so careful calling replace on it.
-                var res = inp && parseFloat(inp.replace(',', '.'));
-                // apply sign while we're at it
-                return (isNaN(res) ? 0 : res) * sign;
-            };
-            duration = {
-                y: parseIso(match[2]),
-                M: parseIso(match[3]),
-                d: parseIso(match[4]),
-                h: parseIso(match[5]),
-                m: parseIso(match[6]),
-                s: parseIso(match[7]),
-                w: parseIso(match[8])
-            };
-        } else if (typeof duration === 'object' &&
-                ('from' in duration || 'to' in duration)) {
-            diffRes = momentsDifference(moment(duration.from), moment(duration.to));
+            if (!this._weekdaysParse[i]) {
+                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+            }
+            // test the regex
+            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+                return i;
+            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+                return i;
+            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+                return i;
+            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
+                return i;
+            }
+        }
+    }
 
-            duration = {};
-            duration.ms = diffRes.milliseconds;
-            duration.M = diffRes.months;
+    // MOMENTS
+
+    function getSetDayOfWeek (input) {
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
+        }
+        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+        if (input != null) {
+            input = parseWeekday(input, this.localeData());
+            return this.add(input - day, 'd');
+        } else {
+            return day;
         }
+    }
 
-        ret = new Duration(duration);
+    function getSetLocaleDayOfWeek (input) {
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
+        }
+        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+        return input == null ? weekday : this.add(input - weekday, 'd');
+    }
 
-        if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {
-            ret._locale = input._locale;
+    function getSetISODayOfWeek (input) {
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
         }
 
-        return ret;
-    };
+        // behaves the same as moment#day except
+        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+        // as a setter, sunday should belong to the previous week.
 
-    // version number
-    moment.version = VERSION;
+        if (input != null) {
+            var weekday = parseIsoWeekday(input, this.localeData());
+            return this.day(this.day() % 7 ? weekday : weekday - 7);
+        } else {
+            return this.day() || 7;
+        }
+    }
 
-    // default format
-    moment.defaultFormat = isoFormat;
+    var defaultWeekdaysRegex = matchWord;
+    function weekdaysRegex (isStrict) {
+        if (this._weekdaysParseExact) {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                computeWeekdaysParse.call(this);
+            }
+            if (isStrict) {
+                return this._weekdaysStrictRegex;
+            } else {
+                return this._weekdaysRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                this._weekdaysRegex = defaultWeekdaysRegex;
+            }
+            return this._weekdaysStrictRegex && isStrict ?
+                this._weekdaysStrictRegex : this._weekdaysRegex;
+        }
+    }
 
-    // constant that refers to the ISO standard
-    moment.ISO_8601 = function () {};
+    var defaultWeekdaysShortRegex = matchWord;
+    function weekdaysShortRegex (isStrict) {
+        if (this._weekdaysParseExact) {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                computeWeekdaysParse.call(this);
+            }
+            if (isStrict) {
+                return this._weekdaysShortStrictRegex;
+            } else {
+                return this._weekdaysShortRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
+                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
+            }
+            return this._weekdaysShortStrictRegex && isStrict ?
+                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
+        }
+    }
 
-    // Plugins that add properties should also add the key here (null value),
-    // so we can properly clone ourselves.
-    moment.momentProperties = momentProperties;
+    var defaultWeekdaysMinRegex = matchWord;
+    function weekdaysMinRegex (isStrict) {
+        if (this._weekdaysParseExact) {
+            if (!hasOwnProp(this, '_weekdaysRegex')) {
+                computeWeekdaysParse.call(this);
+            }
+            if (isStrict) {
+                return this._weekdaysMinStrictRegex;
+            } else {
+                return this._weekdaysMinRegex;
+            }
+        } else {
+            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
+                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
+            }
+            return this._weekdaysMinStrictRegex && isStrict ?
+                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
+        }
+    }
 
-    // This function will be called whenever a moment is mutated.
-    // It is intended to keep the offset in sync with the timezone.
-    moment.updateOffset = function () {};
 
-    // This function allows you to set a threshold for relative time strings
-    moment.relativeTimeThreshold = function (threshold, limit) {
-        if (relativeTimeThresholds[threshold] === undefined) {
-            return false;
+    function computeWeekdaysParse () {
+        function cmpLenRev(a, b) {
+            return b.length - a.length;
         }
-        if (limit === undefined) {
-            return relativeTimeThresholds[threshold];
+
+        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
+            i, mom, minp, shortp, longp;
+        for (i = 0; i < 7; i++) {
+            // make the regex if we don't have it already
+            mom = create_utc__createUTC([2000, 1]).day(i);
+            minp = this.weekdaysMin(mom, '');
+            shortp = this.weekdaysShort(mom, '');
+            longp = this.weekdays(mom, '');
+            minPieces.push(minp);
+            shortPieces.push(shortp);
+            longPieces.push(longp);
+            mixedPieces.push(minp);
+            mixedPieces.push(shortp);
+            mixedPieces.push(longp);
         }
-        relativeTimeThresholds[threshold] = limit;
-        return true;
+        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
+        // will match the longer piece.
+        minPieces.sort(cmpLenRev);
+        shortPieces.sort(cmpLenRev);
+        longPieces.sort(cmpLenRev);
+        mixedPieces.sort(cmpLenRev);
+        for (i = 0; i < 7; i++) {
+            shortPieces[i] = regexEscape(shortPieces[i]);
+            longPieces[i] = regexEscape(longPieces[i]);
+            mixedPieces[i] = regexEscape(mixedPieces[i]);
+        }
+
+        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+        this._weekdaysShortRegex = this._weekdaysRegex;
+        this._weekdaysMinRegex = this._weekdaysRegex;
+
+        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
+    }
+
+    // FORMATTING
+
+    function hFormat() {
+        return this.hours() % 12 || 12;
+    }
+
+    function kFormat() {
+        return this.hours() || 24;
+    }
+
+    addFormatToken('H', ['HH', 2], 0, 'hour');
+    addFormatToken('h', ['hh', 2], 0, hFormat);
+    addFormatToken('k', ['kk', 2], 0, kFormat);
+
+    addFormatToken('hmm', 0, 0, function () {
+        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
+    });
+
+    addFormatToken('hmmss', 0, 0, function () {
+        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
+            zeroFill(this.seconds(), 2);
+    });
+
+    addFormatToken('Hmm', 0, 0, function () {
+        return '' + this.hours() + zeroFill(this.minutes(), 2);
+    });
+
+    addFormatToken('Hmmss', 0, 0, function () {
+        return '' + this.hours() + zeroFill(this.minutes(), 2) +
+            zeroFill(this.seconds(), 2);
+    });
+
+    function meridiem (token, lowercase) {
+        addFormatToken(token, 0, 0, function () {
+            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+        });
+    }
+
+    meridiem('a', true);
+    meridiem('A', false);
+
+    // ALIASES
+
+    addUnitAlias('hour', 'h');
+
+    // PRIORITY
+    addUnitPriority('hour', 13);
+
+    // PARSING
+
+    function matchMeridiem (isStrict, locale) {
+        return locale._meridiemParse;
+    }
+
+    addRegexToken('a',  matchMeridiem);
+    addRegexToken('A',  matchMeridiem);
+    addRegexToken('H',  match1to2);
+    addRegexToken('h',  match1to2);
+    addRegexToken('HH', match1to2, match2);
+    addRegexToken('hh', match1to2, match2);
+
+    addRegexToken('hmm', match3to4);
+    addRegexToken('hmmss', match5to6);
+    addRegexToken('Hmm', match3to4);
+    addRegexToken('Hmmss', match5to6);
+
+    addParseToken(['H', 'HH'], HOUR);
+    addParseToken(['a', 'A'], function (input, array, config) {
+        config._isPm = config._locale.isPM(input);
+        config._meridiem = input;
+    });
+    addParseToken(['h', 'hh'], function (input, array, config) {
+        array[HOUR] = toInt(input);
+        getParsingFlags(config).bigHour = true;
+    });
+    addParseToken('hmm', function (input, array, config) {
+        var pos = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos));
+        array[MINUTE] = toInt(input.substr(pos));
+        getParsingFlags(config).bigHour = true;
+    });
+    addParseToken('hmmss', function (input, array, config) {
+        var pos1 = input.length - 4;
+        var pos2 = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos1));
+        array[MINUTE] = toInt(input.substr(pos1, 2));
+        array[SECOND] = toInt(input.substr(pos2));
+        getParsingFlags(config).bigHour = true;
+    });
+    addParseToken('Hmm', function (input, array, config) {
+        var pos = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos));
+        array[MINUTE] = toInt(input.substr(pos));
+    });
+    addParseToken('Hmmss', function (input, array, config) {
+        var pos1 = input.length - 4;
+        var pos2 = input.length - 2;
+        array[HOUR] = toInt(input.substr(0, pos1));
+        array[MINUTE] = toInt(input.substr(pos1, 2));
+        array[SECOND] = toInt(input.substr(pos2));
+    });
+
+    // LOCALES
+
+    function localeIsPM (input) {
+        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+        // Using charAt should be more compatible.
+        return ((input + '').toLowerCase().charAt(0) === 'p');
+    }
+
+    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+    function localeMeridiem (hours, minutes, isLower) {
+        if (hours > 11) {
+            return isLower ? 'pm' : 'PM';
+        } else {
+            return isLower ? 'am' : 'AM';
+        }
+    }
+
+
+    // MOMENTS
+
+    // Setting the hour should keep the time, because the user explicitly
+    // specified which hour he wants. So trying to maintain the same hour (in
+    // a new timezone) makes sense. Adding/subtracting hours does not follow
+    // this rule.
+    var getSetHour = makeGetSet('Hours', true);
+
+    var baseConfig = {
+        calendar: defaultCalendar,
+        longDateFormat: defaultLongDateFormat,
+        invalidDate: defaultInvalidDate,
+        ordinal: defaultOrdinal,
+        ordinalParse: defaultOrdinalParse,
+        relativeTime: defaultRelativeTime,
+
+        months: defaultLocaleMonths,
+        monthsShort: defaultLocaleMonthsShort,
+
+        week: defaultLocaleWeek,
+
+        weekdays: defaultLocaleWeekdays,
+        weekdaysMin: defaultLocaleWeekdaysMin,
+        weekdaysShort: defaultLocaleWeekdaysShort,
+
+        meridiemParse: defaultLocaleMeridiemParse
     };
 
-    moment.lang = deprecate(
-        'moment.lang is deprecated. Use moment.locale instead.',
-        function (key, value) {
-            return moment.locale(key, value);
+    // internal storage for locale config files
+    var locales = {};
+    var globalLocale;
+
+    function normalizeLocale(key) {
+        return key ? key.toLowerCase().replace('_', '-') : key;
+    }
+
+    // pick the locale from the array
+    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+    function chooseLocale(names) {
+        var i = 0, j, next, locale, split;
+
+        while (i < names.length) {
+            split = normalizeLocale(names[i]).split('-');
+            j = split.length;
+            next = normalizeLocale(names[i + 1]);
+            next = next ? next.split('-') : null;
+            while (j > 0) {
+                locale = loadLocale(split.slice(0, j).join('-'));
+                if (locale) {
+                    return locale;
+                }
+                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+                    //the next array item is better than a shallower substring of this one
+                    break;
+                }
+                j--;
+            }
+            i++;
+        }
+        return null;
+    }
+
+    function loadLocale(name) {
+        var oldLocale = null;
+        // TODO: Find a better way to register and load all the locales in Node
+        if (!locales[name] && (typeof module !== 'undefined') &&
+                module && module.require) {
+            try {
+                oldLocale = globalLocale._abbr;
+                module.require('./locale/' + name);
+                // because defineLocale currently also sets the global locale, we
+                // want to undo that for lazy loaded locales
+                locale_locales__getSetGlobalLocale(oldLocale);
+            } catch (e) { }
         }
-    );
+        return locales[name];
+    }
 
     // This function will load locale and then set the global locale.  If
     // no arguments are passed in, it will simply return the current global
     // locale key.
-    moment.locale = function (key, values) {
+    function locale_locales__getSetGlobalLocale (key, values) {
         var data;
         if (key) {
-            if (typeof(values) !== 'undefined') {
-                data = moment.defineLocale(key, values);
+            if (isUndefined(values)) {
+                data = locale_locales__getLocale(key);
             }
             else {
-                data = moment.localeData(key);
+                data = defineLocale(key, values);
             }
 
             if (data) {
-                moment.duration._locale = moment._locale = data;
+                // moment.duration._locale = moment._locale = data;
+                globalLocale = data;
             }
         }
 
-        return moment._locale._abbr;
-    };
+        return globalLocale._abbr;
+    }
 
-    moment.defineLocale = function (name, values) {
-        if (values !== null) {
-            values.abbr = name;
-            if (!locales[name]) {
-                locales[name] = new Locale();
+    function defineLocale (name, config) {
+        if (config !== null) {
+            var parentConfig = baseConfig;
+            config.abbr = name;
+            if (locales[name] != null) {
+                deprecateSimple('defineLocaleOverride',
+                        'use moment.updateLocale(localeName, config) to change ' +
+                        'an existing locale. moment.defineLocale(localeName, ' +
+                        'config) should only be used for creating a new locale ' +
+                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
+                parentConfig = locales[name]._config;
+            } else if (config.parentLocale != null) {
+                if (locales[config.parentLocale] != null) {
+                    parentConfig = locales[config.parentLocale]._config;
+                } else {
+                    // treat as if there is no base config
+                    deprecateSimple('parentLocaleUndefined',
+                            'specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/');
+                }
             }
-            locales[name].set(values);
+            locales[name] = new Locale(mergeConfigs(parentConfig, config));
 
             // backwards compat for now: also set the locale
-            moment.locale(name);
+            locale_locales__getSetGlobalLocale(name);
 
             return locales[name];
         } else {
             delete locales[name];
             return null;
         }
-    };
+    }
 
-    moment.langData = deprecate(
-        'moment.langData is deprecated. Use moment.localeData instead.',
-        function (key) {
-            return moment.localeData(key);
+    function updateLocale(name, config) {
+        if (config != null) {
+            var locale, parentConfig = baseConfig;
+            // MERGE
+            if (locales[name] != null) {
+                parentConfig = locales[name]._config;
+            }
+            config = mergeConfigs(parentConfig, config);
+            locale = new Locale(config);
+            locale.parentLocale = locales[name];
+            locales[name] = locale;
+
+            // backwards compat for now: also set the locale
+            locale_locales__getSetGlobalLocale(name);
+        } else {
+            // pass null for config to unupdate, useful for tests
+            if (locales[name] != null) {
+                if (locales[name].parentLocale != null) {
+                    locales[name] = locales[name].parentLocale;
+                } else if (locales[name] != null) {
+                    delete locales[name];
+                }
+            }
         }
-    );
+        return locales[name];
+    }
 
     // returns locale data
-    moment.localeData = function (key) {
+    function locale_locales__getLocale (key) {
         var locale;
 
-        if (key && key._locale && key._locale._abbr) {
-            key = key._locale._abbr;
-        }
+        if (key && key._locale && key._locale._abbr) {
+            key = key._locale._abbr;
+        }
+
+        if (!key) {
+            return globalLocale;
+        }
+
+        if (!isArray(key)) {
+            //short-circuit everything else
+            locale = loadLocale(key);
+            if (locale) {
+                return locale;
+            }
+            key = [key];
+        }
+
+        return chooseLocale(key);
+    }
+
+    function locale_locales__listLocales() {
+        return keys(locales);
+    }
+
+    function checkOverflow (m) {
+        var overflow;
+        var a = m._a;
+
+        if (a && getParsingFlags(m).overflow === -2) {
+            overflow =
+                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
+                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
+                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
+                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+                -1;
+
+            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+                overflow = DATE;
+            }
+            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
+                overflow = WEEK;
+            }
+            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+                overflow = WEEKDAY;
+            }
+
+            getParsingFlags(m).overflow = overflow;
+        }
+
+        return m;
+    }
+
+    // iso 8601 regex
+    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+    var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/;
+    var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/;
+
+    var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
+
+    var isoDates = [
+        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
+        ['YYYY-DDD', /\d{4}-\d{3}/],
+        ['YYYY-MM', /\d{4}-\d\d/, false],
+        ['YYYYYYMMDD', /[+-]\d{10}/],
+        ['YYYYMMDD', /\d{8}/],
+        // YYYYMM is NOT allowed by the standard
+        ['GGGG[W]WWE', /\d{4}W\d{3}/],
+        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
+        ['YYYYDDD', /\d{7}/]
+    ];
+
+    // iso time formats and regexes
+    var isoTimes = [
+        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
+        ['HH:mm', /\d\d:\d\d/],
+        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+        ['HHmmss', /\d\d\d\d\d\d/],
+        ['HHmm', /\d\d\d\d/],
+        ['HH', /\d\d/]
+    ];
+
+    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+    // date from iso format
+    function configFromISO(config) {
+        var i, l,
+            string = config._i,
+            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
+            allowTime, dateFormat, timeFormat, tzFormat;
+
+        if (match) {
+            getParsingFlags(config).iso = true;
+
+            for (i = 0, l = isoDates.length; i < l; i++) {
+                if (isoDates[i][1].exec(match[1])) {
+                    dateFormat = isoDates[i][0];
+                    allowTime = isoDates[i][2] !== false;
+                    break;
+                }
+            }
+            if (dateFormat == null) {
+                config._isValid = false;
+                return;
+            }
+            if (match[3]) {
+                for (i = 0, l = isoTimes.length; i < l; i++) {
+                    if (isoTimes[i][1].exec(match[3])) {
+                        // match[2] should be 'T' or space
+                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
+                        break;
+                    }
+                }
+                if (timeFormat == null) {
+                    config._isValid = false;
+                    return;
+                }
+            }
+            if (!allowTime && timeFormat != null) {
+                config._isValid = false;
+                return;
+            }
+            if (match[4]) {
+                if (tzRegex.exec(match[4])) {
+                    tzFormat = 'Z';
+                } else {
+                    config._isValid = false;
+                    return;
+                }
+            }
+            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
+            configFromStringAndFormat(config);
+        } else {
+            config._isValid = false;
+        }
+    }
+
+    // date from iso format or fallback
+    function configFromString(config) {
+        var matched = aspNetJsonRegex.exec(config._i);
+
+        if (matched !== null) {
+            config._d = new Date(+matched[1]);
+            return;
+        }
+
+        configFromISO(config);
+        if (config._isValid === false) {
+            delete config._isValid;
+            utils_hooks__hooks.createFromInputFallback(config);
+        }
+    }
+
+    utils_hooks__hooks.createFromInputFallback = deprecate(
+        'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
+        'which is not reliable across all browsers and versions. Non ISO date formats are ' +
+        'discouraged and will be removed in an upcoming major release. Please refer to ' +
+        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+        function (config) {
+            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+        }
+    );
+
+    // Pick the first defined of two or three arguments.
+    function defaults(a, b, c) {
+        if (a != null) {
+            return a;
+        }
+        if (b != null) {
+            return b;
+        }
+        return c;
+    }
+
+    function currentDateArray(config) {
+        // hooks is actually the exported moment object
+        var nowValue = new Date(utils_hooks__hooks.now());
+        if (config._useUTC) {
+            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
+        }
+        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
+    }
+
+    // convert an array to a date.
+    // the array should mirror the parameters below
+    // note: all values past the year are optional and will default to the lowest possible value.
+    // [year, month, day , hour, minute, second, millisecond]
+    function configFromArray (config) {
+        var i, date, input = [], currentDate, yearToUse;
+
+        if (config._d) {
+            return;
+        }
+
+        currentDate = currentDateArray(config);
+
+        //compute day of the year from weeks and weekdays
+        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+            dayOfYearFromWeekInfo(config);
+        }
+
+        //if the day of the year is set, figure out what it is
+        if (config._dayOfYear) {
+            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
+
+            if (config._dayOfYear > daysInYear(yearToUse)) {
+                getParsingFlags(config)._overflowDayOfYear = true;
+            }
+
+            date = createUTCDate(yearToUse, 0, config._dayOfYear);
+            config._a[MONTH] = date.getUTCMonth();
+            config._a[DATE] = date.getUTCDate();
+        }
+
+        // Default to current date.
+        // * if no year, month, day of month are given, default to today
+        // * if day of month is given, default month and year
+        // * if month is given, default only year
+        // * if year is given, don't default anything
+        for (i = 0; i < 3 && config._a[i] == null; ++i) {
+            config._a[i] = input[i] = currentDate[i];
+        }
+
+        // Zero out whatever was not defaulted, including time
+        for (; i < 7; i++) {
+            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+        }
+
+        // Check for 24:00:00.000
+        if (config._a[HOUR] === 24 &&
+                config._a[MINUTE] === 0 &&
+                config._a[SECOND] === 0 &&
+                config._a[MILLISECOND] === 0) {
+            config._nextDay = true;
+            config._a[HOUR] = 0;
+        }
+
+        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+        // Apply timezone offset from input. The actual utcOffset can be changed
+        // with parseZone.
+        if (config._tzm != null) {
+            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+        }
+
+        if (config._nextDay) {
+            config._a[HOUR] = 24;
+        }
+    }
+
+    function dayOfYearFromWeekInfo(config) {
+        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
+
+        w = config._w;
+        if (w.GG != null || w.W != null || w.E != null) {
+            dow = 1;
+            doy = 4;
+
+            // TODO: We need to take the current isoWeekYear, but that depends on
+            // how we interpret now (local, utc, fixed offset). So create
+            // a now version of current config (take local/utc/offset flags, and
+            // create now).
+            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);
+            week = defaults(w.W, 1);
+            weekday = defaults(w.E, 1);
+            if (weekday < 1 || weekday > 7) {
+                weekdayOverflow = true;
+            }
+        } else {
+            dow = config._locale._week.dow;
+            doy = config._locale._week.doy;
+
+            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);
+            week = defaults(w.w, 1);
+
+            if (w.d != null) {
+                // weekday -- low day numbers are considered next week
+                weekday = w.d;
+                if (weekday < 0 || weekday > 6) {
+                    weekdayOverflow = true;
+                }
+            } else if (w.e != null) {
+                // local weekday -- counting starts from begining of week
+                weekday = w.e + dow;
+                if (w.e < 0 || w.e > 6) {
+                    weekdayOverflow = true;
+                }
+            } else {
+                // default to begining of week
+                weekday = dow;
+            }
+        }
+        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+            getParsingFlags(config)._overflowWeeks = true;
+        } else if (weekdayOverflow != null) {
+            getParsingFlags(config)._overflowWeekday = true;
+        } else {
+            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
+            config._a[YEAR] = temp.year;
+            config._dayOfYear = temp.dayOfYear;
+        }
+    }
+
+    // constant that refers to the ISO standard
+    utils_hooks__hooks.ISO_8601 = function () {};
+
+    // date from string and format string
+    function configFromStringAndFormat(config) {
+        // TODO: Move this to another part of the creation flow to prevent circular deps
+        if (config._f === utils_hooks__hooks.ISO_8601) {
+            configFromISO(config);
+            return;
+        }
+
+        config._a = [];
+        getParsingFlags(config).empty = true;
+
+        // This array is used to make a Date, either with `new Date` or `Date.UTC`
+        var string = '' + config._i,
+            i, parsedInput, tokens, token, skipped,
+            stringLength = string.length,
+            totalParsedInputLength = 0;
+
+        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+
+        for (i = 0; i < tokens.length; i++) {
+            token = tokens[i];
+            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+            // console.log('token', token, 'parsedInput', parsedInput,
+            //         'regex', getParseRegexForToken(token, config));
+            if (parsedInput) {
+                skipped = string.substr(0, string.indexOf(parsedInput));
+                if (skipped.length > 0) {
+                    getParsingFlags(config).unusedInput.push(skipped);
+                }
+                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+                totalParsedInputLength += parsedInput.length;
+            }
+            // don't parse if it's not a known token
+            if (formatTokenFunctions[token]) {
+                if (parsedInput) {
+                    getParsingFlags(config).empty = false;
+                }
+                else {
+                    getParsingFlags(config).unusedTokens.push(token);
+                }
+                addTimeToArrayFromToken(token, parsedInput, config);
+            }
+            else if (config._strict && !parsedInput) {
+                getParsingFlags(config).unusedTokens.push(token);
+            }
+        }
+
+        // add remaining unparsed input length to the string
+        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
+        if (string.length > 0) {
+            getParsingFlags(config).unusedInput.push(string);
+        }
+
+        // clear _12h flag if hour is <= 12
+        if (config._a[HOUR] <= 12 &&
+            getParsingFlags(config).bigHour === true &&
+            config._a[HOUR] > 0) {
+            getParsingFlags(config).bigHour = undefined;
+        }
+
+        getParsingFlags(config).parsedDateParts = config._a.slice(0);
+        getParsingFlags(config).meridiem = config._meridiem;
+        // handle meridiem
+        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
+
+        configFromArray(config);
+        checkOverflow(config);
+    }
+
+
+    function meridiemFixWrap (locale, hour, meridiem) {
+        var isPm;
+
+        if (meridiem == null) {
+            // nothing to do
+            return hour;
+        }
+        if (locale.meridiemHour != null) {
+            return locale.meridiemHour(hour, meridiem);
+        } else if (locale.isPM != null) {
+            // Fallback
+            isPm = locale.isPM(meridiem);
+            if (isPm && hour < 12) {
+                hour += 12;
+            }
+            if (!isPm && hour === 12) {
+                hour = 0;
+            }
+            return hour;
+        } else {
+            // this is not supposed to happen
+            return hour;
+        }
+    }
+
+    // date from string and array of format strings
+    function configFromStringAndArray(config) {
+        var tempConfig,
+            bestMoment,
+
+            scoreToBeat,
+            i,
+            currentScore;
+
+        if (config._f.length === 0) {
+            getParsingFlags(config).invalidFormat = true;
+            config._d = new Date(NaN);
+            return;
+        }
+
+        for (i = 0; i < config._f.length; i++) {
+            currentScore = 0;
+            tempConfig = copyConfig({}, config);
+            if (config._useUTC != null) {
+                tempConfig._useUTC = config._useUTC;
+            }
+            tempConfig._f = config._f[i];
+            configFromStringAndFormat(tempConfig);
+
+            if (!valid__isValid(tempConfig)) {
+                continue;
+            }
+
+            // if there is any input that was not parsed add a penalty for that format
+            currentScore += getParsingFlags(tempConfig).charsLeftOver;
+
+            //or tokens
+            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
+
+            getParsingFlags(tempConfig).score = currentScore;
+
+            if (scoreToBeat == null || currentScore < scoreToBeat) {
+                scoreToBeat = currentScore;
+                bestMoment = tempConfig;
+            }
+        }
+
+        extend(config, bestMoment || tempConfig);
+    }
+
+    function configFromObject(config) {
+        if (config._d) {
+            return;
+        }
+
+        var i = normalizeObjectUnits(config._i);
+        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
+            return obj && parseInt(obj, 10);
+        });
+
+        configFromArray(config);
+    }
+
+    function createFromConfig (config) {
+        var res = new Moment(checkOverflow(prepareConfig(config)));
+        if (res._nextDay) {
+            // Adding is smart enough around DST
+            res.add(1, 'd');
+            res._nextDay = undefined;
+        }
+
+        return res;
+    }
+
+    function prepareConfig (config) {
+        var input = config._i,
+            format = config._f;
+
+        config._locale = config._locale || locale_locales__getLocale(config._l);
+
+        if (input === null || (format === undefined && input === '')) {
+            return valid__createInvalid({nullInput: true});
+        }
+
+        if (typeof input === 'string') {
+            config._i = input = config._locale.preparse(input);
+        }
+
+        if (isMoment(input)) {
+            return new Moment(checkOverflow(input));
+        } else if (isArray(format)) {
+            configFromStringAndArray(config);
+        } else if (isDate(input)) {
+            config._d = input;
+        } else if (format) {
+            configFromStringAndFormat(config);
+        }  else {
+            configFromInput(config);
+        }
+
+        if (!valid__isValid(config)) {
+            config._d = null;
+        }
+
+        return config;
+    }
+
+    function configFromInput(config) {
+        var input = config._i;
+        if (input === undefined) {
+            config._d = new Date(utils_hooks__hooks.now());
+        } else if (isDate(input)) {
+            config._d = new Date(input.valueOf());
+        } else if (typeof input === 'string') {
+            configFromString(config);
+        } else if (isArray(input)) {
+            config._a = map(input.slice(0), function (obj) {
+                return parseInt(obj, 10);
+            });
+            configFromArray(config);
+        } else if (typeof(input) === 'object') {
+            configFromObject(config);
+        } else if (typeof(input) === 'number') {
+            // from milliseconds
+            config._d = new Date(input);
+        } else {
+            utils_hooks__hooks.createFromInputFallback(config);
+        }
+    }
+
+    function createLocalOrUTC (input, format, locale, strict, isUTC) {
+        var c = {};
+
+        if (typeof(locale) === 'boolean') {
+            strict = locale;
+            locale = undefined;
+        }
+
+        if ((isObject(input) && isObjectEmpty(input)) ||
+                (isArray(input) && input.length === 0)) {
+            input = undefined;
+        }
+        // object construction must be done this way.
+        // https://github.com/moment/moment/issues/1423
+        c._isAMomentObject = true;
+        c._useUTC = c._isUTC = isUTC;
+        c._l = locale;
+        c._i = input;
+        c._f = format;
+        c._strict = strict;
+
+        return createFromConfig(c);
+    }
+
+    function local__createLocal (input, format, locale, strict) {
+        return createLocalOrUTC(input, format, locale, strict, false);
+    }
+
+    var prototypeMin = deprecate(
+        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+        function () {
+            var other = local__createLocal.apply(null, arguments);
+            if (this.isValid() && other.isValid()) {
+                return other < this ? this : other;
+            } else {
+                return valid__createInvalid();
+            }
+        }
+    );
+
+    var prototypeMax = deprecate(
+        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+        function () {
+            var other = local__createLocal.apply(null, arguments);
+            if (this.isValid() && other.isValid()) {
+                return other > this ? this : other;
+            } else {
+                return valid__createInvalid();
+            }
+        }
+    );
+
+    // Pick a moment m from moments so that m[fn](other) is true for all
+    // other. This relies on the function fn to be transitive.
+    //
+    // moments should either be an array of moment objects or an array, whose
+    // first element is an array of moment objects.
+    function pickBy(fn, moments) {
+        var res, i;
+        if (moments.length === 1 && isArray(moments[0])) {
+            moments = moments[0];
+        }
+        if (!moments.length) {
+            return local__createLocal();
+        }
+        res = moments[0];
+        for (i = 1; i < moments.length; ++i) {
+            if (!moments[i].isValid() || moments[i][fn](res)) {
+                res = moments[i];
+            }
+        }
+        return res;
+    }
+
+    // TODO: Use [].sort instead?
+    function min () {
+        var args = [].slice.call(arguments, 0);
+
+        return pickBy('isBefore', args);
+    }
+
+    function max () {
+        var args = [].slice.call(arguments, 0);
+
+        return pickBy('isAfter', args);
+    }
+
+    var now = function () {
+        return Date.now ? Date.now() : +(new Date());
+    };
+
+    function Duration (duration) {
+        var normalizedInput = normalizeObjectUnits(duration),
+            years = normalizedInput.year || 0,
+            quarters = normalizedInput.quarter || 0,
+            months = normalizedInput.month || 0,
+            weeks = normalizedInput.week || 0,
+            days = normalizedInput.day || 0,
+            hours = normalizedInput.hour || 0,
+            minutes = normalizedInput.minute || 0,
+            seconds = normalizedInput.second || 0,
+            milliseconds = normalizedInput.millisecond || 0;
+
+        // representation for dateAddRemove
+        this._milliseconds = +milliseconds +
+            seconds * 1e3 + // 1000
+            minutes * 6e4 + // 1000 * 60
+            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+        // Because of dateAddRemove treats 24 hours as different from a
+        // day when working around DST, we need to store them separately
+        this._days = +days +
+            weeks * 7;
+        // It is impossible translate months into days without knowing
+        // which months you are are talking about, so we have to store
+        // it separately.
+        this._months = +months +
+            quarters * 3 +
+            years * 12;
+
+        this._data = {};
+
+        this._locale = locale_locales__getLocale();
+
+        this._bubble();
+    }
+
+    function isDuration (obj) {
+        return obj instanceof Duration;
+    }
+
+    function absRound (number) {
+        if (number < 0) {
+            return Math.round(-1 * number) * -1;
+        } else {
+            return Math.round(number);
+        }
+    }
+
+    // FORMATTING
+
+    function offset (token, separator) {
+        addFormatToken(token, 0, 0, function () {
+            var offset = this.utcOffset();
+            var sign = '+';
+            if (offset < 0) {
+                offset = -offset;
+                sign = '-';
+            }
+            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+        });
+    }
+
+    offset('Z', ':');
+    offset('ZZ', '');
+
+    // PARSING
+
+    addRegexToken('Z',  matchShortOffset);
+    addRegexToken('ZZ', matchShortOffset);
+    addParseToken(['Z', 'ZZ'], function (input, array, config) {
+        config._useUTC = true;
+        config._tzm = offsetFromString(matchShortOffset, input);
+    });
+
+    // HELPERS
+
+    // timezone chunker
+    // '+10:00' > ['10',  '00']
+    // '-1530'  > ['-15', '30']
+    var chunkOffset = /([\+\-]|\d\d)/gi;
+
+    function offsetFromString(matcher, string) {
+        var matches = ((string || '').match(matcher) || []);
+        var chunk   = matches[matches.length - 1] || [];
+        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+        var minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+        return parts[0] === '+' ? minutes : -minutes;
+    }
+
+    // Return a moment from input, that is local/utc/zone equivalent to model.
+    function cloneWithOffset(input, model) {
+        var res, diff;
+        if (model._isUTC) {
+            res = model.clone();
+            diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf();
+            // Use low-level api, because this fn is low-level api.
+            res._d.setTime(res._d.valueOf() + diff);
+            utils_hooks__hooks.updateOffset(res, false);
+            return res;
+        } else {
+            return local__createLocal(input).local();
+        }
+    }
+
+    function getDateOffset (m) {
+        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+        // https://github.com/moment/moment/pull/1871
+        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+    }
+
+    // HOOKS
+
+    // This function will be called whenever a moment is mutated.
+    // It is intended to keep the offset in sync with the timezone.
+    utils_hooks__hooks.updateOffset = function () {};
+
+    // MOMENTS
+
+    // keepLocalTime = true means only change the timezone, without
+    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+    // +0200, so we adjust the time as needed, to be valid.
+    //
+    // Keeping the time actually adds/subtracts (one hour)
+    // from the actual represented time. That is why we call updateOffset
+    // a second time. In case it wants us to change the offset again
+    // _changeInProgress == true case, then we have to adjust, because
+    // there is no such time in the given timezone.
+    function getSetOffset (input, keepLocalTime) {
+        var offset = this._offset || 0,
+            localAdjust;
+        if (!this.isValid()) {
+            return input != null ? this : NaN;
+        }
+        if (input != null) {
+            if (typeof input === 'string') {
+                input = offsetFromString(matchShortOffset, input);
+            } else if (Math.abs(input) < 16) {
+                input = input * 60;
+            }
+            if (!this._isUTC && keepLocalTime) {
+                localAdjust = getDateOffset(this);
+            }
+            this._offset = input;
+            this._isUTC = true;
+            if (localAdjust != null) {
+                this.add(localAdjust, 'm');
+            }
+            if (offset !== input) {
+                if (!keepLocalTime || this._changeInProgress) {
+                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);
+                } else if (!this._changeInProgress) {
+                    this._changeInProgress = true;
+                    utils_hooks__hooks.updateOffset(this, true);
+                    this._changeInProgress = null;
+                }
+            }
+            return this;
+        } else {
+            return this._isUTC ? offset : getDateOffset(this);
+        }
+    }
+
+    function getSetZone (input, keepLocalTime) {
+        if (input != null) {
+            if (typeof input !== 'string') {
+                input = -input;
+            }
+
+            this.utcOffset(input, keepLocalTime);
+
+            return this;
+        } else {
+            return -this.utcOffset();
+        }
+    }
+
+    function setOffsetToUTC (keepLocalTime) {
+        return this.utcOffset(0, keepLocalTime);
+    }
+
+    function setOffsetToLocal (keepLocalTime) {
+        if (this._isUTC) {
+            this.utcOffset(0, keepLocalTime);
+            this._isUTC = false;
+
+            if (keepLocalTime) {
+                this.subtract(getDateOffset(this), 'm');
+            }
+        }
+        return this;
+    }
+
+    function setOffsetToParsedOffset () {
+        if (this._tzm) {
+            this.utcOffset(this._tzm);
+        } else if (typeof this._i === 'string') {
+            var tZone = offsetFromString(matchOffset, this._i);
+
+            if (tZone === 0) {
+                this.utcOffset(0, true);
+            } else {
+                this.utcOffset(offsetFromString(matchOffset, this._i));
+            }
+        }
+        return this;
+    }
+
+    function hasAlignedHourOffset (input) {
+        if (!this.isValid()) {
+            return false;
+        }
+        input = input ? local__createLocal(input).utcOffset() : 0;
+
+        return (this.utcOffset() - input) % 60 === 0;
+    }
+
+    function isDaylightSavingTime () {
+        return (
+            this.utcOffset() > this.clone().month(0).utcOffset() ||
+            this.utcOffset() > this.clone().month(5).utcOffset()
+        );
+    }
+
+    function isDaylightSavingTimeShifted () {
+        if (!isUndefined(this._isDSTShifted)) {
+            return this._isDSTShifted;
+        }
+
+        var c = {};
+
+        copyConfig(c, this);
+        c = prepareConfig(c);
+
+        if (c._a) {
+            var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);
+            this._isDSTShifted = this.isValid() &&
+                compareArrays(c._a, other.toArray()) > 0;
+        } else {
+            this._isDSTShifted = false;
+        }
+
+        return this._isDSTShifted;
+    }
+
+    function isLocal () {
+        return this.isValid() ? !this._isUTC : false;
+    }
+
+    function isUtcOffset () {
+        return this.isValid() ? this._isUTC : false;
+    }
+
+    function isUtc () {
+        return this.isValid() ? this._isUTC && this._offset === 0 : false;
+    }
+
+    // ASP.NET json date format regex
+    var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
+
+    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+    // and further modified to allow for strings containing both week and day
+    var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
+
+    function create__createDuration (input, key) {
+        var duration = input,
+            // matching against regexp is expensive, do it on demand
+            match = null,
+            sign,
+            ret,
+            diffRes;
+
+        if (isDuration(input)) {
+            duration = {
+                ms : input._milliseconds,
+                d  : input._days,
+                M  : input._months
+            };
+        } else if (typeof input === 'number') {
+            duration = {};
+            if (key) {
+                duration[key] = input;
+            } else {
+                duration.milliseconds = input;
+            }
+        } else if (!!(match = aspNetRegex.exec(input))) {
+            sign = (match[1] === '-') ? -1 : 1;
+            duration = {
+                y  : 0,
+                d  : toInt(match[DATE])                         * sign,
+                h  : toInt(match[HOUR])                         * sign,
+                m  : toInt(match[MINUTE])                       * sign,
+                s  : toInt(match[SECOND])                       * sign,
+                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
+            };
+        } else if (!!(match = isoRegex.exec(input))) {
+            sign = (match[1] === '-') ? -1 : 1;
+            duration = {
+                y : parseIso(match[2], sign),
+                M : parseIso(match[3], sign),
+                w : parseIso(match[4], sign),
+                d : parseIso(match[5], sign),
+                h : parseIso(match[6], sign),
+                m : parseIso(match[7], sign),
+                s : parseIso(match[8], sign)
+            };
+        } else if (duration == null) {// checks for null or undefined
+            duration = {};
+        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));
+
+            duration = {};
+            duration.ms = diffRes.milliseconds;
+            duration.M = diffRes.months;
+        }
+
+        ret = new Duration(duration);
+
+        if (isDuration(input) && hasOwnProp(input, '_locale')) {
+            ret._locale = input._locale;
+        }
+
+        return ret;
+    }
+
+    create__createDuration.fn = Duration.prototype;
+
+    function parseIso (inp, sign) {
+        // We'd normally use ~~inp for this, but unfortunately it also
+        // converts floats to ints.
+        // inp may be undefined, so careful calling replace on it.
+        var res = inp && parseFloat(inp.replace(',', '.'));
+        // apply sign while we're at it
+        return (isNaN(res) ? 0 : res) * sign;
+    }
+
+    function positiveMomentsDifference(base, other) {
+        var res = {milliseconds: 0, months: 0};
+
+        res.months = other.month() - base.month() +
+            (other.year() - base.year()) * 12;
+        if (base.clone().add(res.months, 'M').isAfter(other)) {
+            --res.months;
+        }
+
+        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
+
+        return res;
+    }
+
+    function momentsDifference(base, other) {
+        var res;
+        if (!(base.isValid() && other.isValid())) {
+            return {milliseconds: 0, months: 0};
+        }
+
+        other = cloneWithOffset(other, base);
+        if (base.isBefore(other)) {
+            res = positiveMomentsDifference(base, other);
+        } else {
+            res = positiveMomentsDifference(other, base);
+            res.milliseconds = -res.milliseconds;
+            res.months = -res.months;
+        }
+
+        return res;
+    }
+
+    // TODO: remove 'name' arg after deprecation is removed
+    function createAdder(direction, name) {
+        return function (val, period) {
+            var dur, tmp;
+            //invert the arguments, but complain about it
+            if (period !== null && !isNaN(+period)) {
+                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
+                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
+                tmp = val; val = period; period = tmp;
+            }
+
+            val = typeof val === 'string' ? +val : val;
+            dur = create__createDuration(val, period);
+            add_subtract__addSubtract(this, dur, direction);
+            return this;
+        };
+    }
+
+    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {
+        var milliseconds = duration._milliseconds,
+            days = absRound(duration._days),
+            months = absRound(duration._months);
+
+        if (!mom.isValid()) {
+            // No op
+            return;
+        }
+
+        updateOffset = updateOffset == null ? true : updateOffset;
+
+        if (milliseconds) {
+            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
+        }
+        if (days) {
+            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);
+        }
+        if (months) {
+            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);
+        }
+        if (updateOffset) {
+            utils_hooks__hooks.updateOffset(mom, days || months);
+        }
+    }
+
+    var add_subtract__add      = createAdder(1, 'add');
+    var add_subtract__subtract = createAdder(-1, 'subtract');
+
+    function getCalendarFormat(myMoment, now) {
+        var diff = myMoment.diff(now, 'days', true);
+        return diff < -6 ? 'sameElse' :
+                diff < -1 ? 'lastWeek' :
+                diff < 0 ? 'lastDay' :
+                diff < 1 ? 'sameDay' :
+                diff < 2 ? 'nextDay' :
+                diff < 7 ? 'nextWeek' : 'sameElse';
+    }
+
+    function moment_calendar__calendar (time, formats) {
+        // We want to compare the start of today, vs this.
+        // Getting start-of-today depends on whether we're local/utc/offset or not.
+        var now = time || local__createLocal(),
+            sod = cloneWithOffset(now, this).startOf('day'),
+            format = utils_hooks__hooks.calendarFormat(this, sod) || 'sameElse';
+
+        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
+
+        return this.format(output || this.localeData().calendar(format, this, local__createLocal(now)));
+    }
+
+    function clone () {
+        return new Moment(this);
+    }
+
+    function isAfter (input, units) {
+        var localInput = isMoment(input) ? input : local__createLocal(input);
+        if (!(this.isValid() && localInput.isValid())) {
+            return false;
+        }
+        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+        if (units === 'millisecond') {
+            return this.valueOf() > localInput.valueOf();
+        } else {
+            return localInput.valueOf() < this.clone().startOf(units).valueOf();
+        }
+    }
+
+    function isBefore (input, units) {
+        var localInput = isMoment(input) ? input : local__createLocal(input);
+        if (!(this.isValid() && localInput.isValid())) {
+            return false;
+        }
+        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+        if (units === 'millisecond') {
+            return this.valueOf() < localInput.valueOf();
+        } else {
+            return this.clone().endOf(units).valueOf() < localInput.valueOf();
+        }
+    }
+
+    function isBetween (from, to, units, inclusivity) {
+        inclusivity = inclusivity || '()';
+        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
+            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
+    }
+
+    function isSame (input, units) {
+        var localInput = isMoment(input) ? input : local__createLocal(input),
+            inputMs;
+        if (!(this.isValid() && localInput.isValid())) {
+            return false;
+        }
+        units = normalizeUnits(units || 'millisecond');
+        if (units === 'millisecond') {
+            return this.valueOf() === localInput.valueOf();
+        } else {
+            inputMs = localInput.valueOf();
+            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
+        }
+    }
+
+    function isSameOrAfter (input, units) {
+        return this.isSame(input, units) || this.isAfter(input,units);
+    }
+
+    function isSameOrBefore (input, units) {
+        return this.isSame(input, units) || this.isBefore(input,units);
+    }
+
+    function diff (input, units, asFloat) {
+        var that,
+            zoneDelta,
+            delta, output;
+
+        if (!this.isValid()) {
+            return NaN;
+        }
+
+        that = cloneWithOffset(input, this);
+
+        if (!that.isValid()) {
+            return NaN;
+        }
+
+        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
+
+        units = normalizeUnits(units);
+
+        if (units === 'year' || units === 'month' || units === 'quarter') {
+            output = monthDiff(this, that);
+            if (units === 'quarter') {
+                output = output / 3;
+            } else if (units === 'year') {
+                output = output / 12;
+            }
+        } else {
+            delta = this - that;
+            output = units === 'second' ? delta / 1e3 : // 1000
+                units === 'minute' ? delta / 6e4 : // 1000 * 60
+                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
+                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+                delta;
+        }
+        return asFloat ? output : absFloor(output);
+    }
+
+    function monthDiff (a, b) {
+        // difference in months
+        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+            // b is in (anchor - 1 month, anchor + 1 month)
+            anchor = a.clone().add(wholeMonthDiff, 'months'),
+            anchor2, adjust;
+
+        if (b - anchor < 0) {
+            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+            // linear across the month
+            adjust = (b - anchor) / (anchor - anchor2);
+        } else {
+            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+            // linear across the month
+            adjust = (b - anchor) / (anchor2 - anchor);
+        }
+
+        //check for negative zero, return zero if negative zero
+        return -(wholeMonthDiff + adjust) || 0;
+    }
+
+    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
+    utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+    function toString () {
+        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+    }
+
+    function moment_format__toISOString () {
+        var m = this.clone().utc();
+        if (0 < m.year() && m.year() <= 9999) {
+            if (isFunction(Date.prototype.toISOString)) {
+                // native implementation is ~50x faster, use it when we can
+                return this.toDate().toISOString();
+            } else {
+                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+            }
+        } else {
+            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+        }
+    }
+
+    function format (inputString) {
+        if (!inputString) {
+            inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat;
+        }
+        var output = formatMoment(this, inputString);
+        return this.localeData().postformat(output);
+    }
+
+    function from (time, withoutSuffix) {
+        if (this.isValid() &&
+                ((isMoment(time) && time.isValid()) ||
+                 local__createLocal(time).isValid())) {
+            return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+        } else {
+            return this.localeData().invalidDate();
+        }
+    }
+
+    function fromNow (withoutSuffix) {
+        return this.from(local__createLocal(), withoutSuffix);
+    }
+
+    function to (time, withoutSuffix) {
+        if (this.isValid() &&
+                ((isMoment(time) && time.isValid()) ||
+                 local__createLocal(time).isValid())) {
+            return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+        } else {
+            return this.localeData().invalidDate();
+        }
+    }
+
+    function toNow (withoutSuffix) {
+        return this.to(local__createLocal(), withoutSuffix);
+    }
+
+    // If passed a locale key, it will set the locale for this
+    // instance.  Otherwise, it will return the locale configuration
+    // variables for this instance.
+    function locale (key) {
+        var newLocaleData;
+
+        if (key === undefined) {
+            return this._locale._abbr;
+        } else {
+            newLocaleData = locale_locales__getLocale(key);
+            if (newLocaleData != null) {
+                this._locale = newLocaleData;
+            }
+            return this;
+        }
+    }
+
+    var lang = deprecate(
+        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+        function (key) {
+            if (key === undefined) {
+                return this.localeData();
+            } else {
+                return this.locale(key);
+            }
+        }
+    );
+
+    function localeData () {
+        return this._locale;
+    }
+
+    function startOf (units) {
+        units = normalizeUnits(units);
+        // the following switch intentionally omits break keywords
+        // to utilize falling through the cases.
+        switch (units) {
+            case 'year':
+                this.month(0);
+                /* falls through */
+            case 'quarter':
+            case 'month':
+                this.date(1);
+                /* falls through */
+            case 'week':
+            case 'isoWeek':
+            case 'day':
+            case 'date':
+                this.hours(0);
+                /* falls through */
+            case 'hour':
+                this.minutes(0);
+                /* falls through */
+            case 'minute':
+                this.seconds(0);
+                /* falls through */
+            case 'second':
+                this.milliseconds(0);
+        }
+
+        // weeks are a special case
+        if (units === 'week') {
+            this.weekday(0);
+        }
+        if (units === 'isoWeek') {
+            this.isoWeekday(1);
+        }
+
+        // quarters are also special
+        if (units === 'quarter') {
+            this.month(Math.floor(this.month() / 3) * 3);
+        }
+
+        return this;
+    }
+
+    function endOf (units) {
+        units = normalizeUnits(units);
+        if (units === undefined || units === 'millisecond') {
+            return this;
+        }
+
+        // 'date' is an alias for 'day', so it should be considered as such.
+        if (units === 'date') {
+            units = 'day';
+        }
+
+        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+    }
+
+    function to_type__valueOf () {
+        return this._d.valueOf() - ((this._offset || 0) * 60000);
+    }
+
+    function unix () {
+        return Math.floor(this.valueOf() / 1000);
+    }
+
+    function toDate () {
+        return new Date(this.valueOf());
+    }
+
+    function toArray () {
+        var m = this;
+        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+    }
+
+    function toObject () {
+        var m = this;
+        return {
+            years: m.year(),
+            months: m.month(),
+            date: m.date(),
+            hours: m.hours(),
+            minutes: m.minutes(),
+            seconds: m.seconds(),
+            milliseconds: m.milliseconds()
+        };
+    }
+
+    function toJSON () {
+        // new Date(NaN).toJSON() === null
+        return this.isValid() ? this.toISOString() : null;
+    }
+
+    function moment_valid__isValid () {
+        return valid__isValid(this);
+    }
+
+    function parsingFlags () {
+        return extend({}, getParsingFlags(this));
+    }
+
+    function invalidAt () {
+        return getParsingFlags(this).overflow;
+    }
+
+    function creationData() {
+        return {
+            input: this._i,
+            format: this._f,
+            locale: this._locale,
+            isUTC: this._isUTC,
+            strict: this._strict
+        };
+    }
+
+    // FORMATTING
+
+    addFormatToken(0, ['gg', 2], 0, function () {
+        return this.weekYear() % 100;
+    });
+
+    addFormatToken(0, ['GG', 2], 0, function () {
+        return this.isoWeekYear() % 100;
+    });
+
+    function addWeekYearFormatToken (token, getter) {
+        addFormatToken(0, [token, token.length], 0, getter);
+    }
+
+    addWeekYearFormatToken('gggg',     'weekYear');
+    addWeekYearFormatToken('ggggg',    'weekYear');
+    addWeekYearFormatToken('GGGG',  'isoWeekYear');
+    addWeekYearFormatToken('GGGGG', 'isoWeekYear');
+
+    // ALIASES
+
+    addUnitAlias('weekYear', 'gg');
+    addUnitAlias('isoWeekYear', 'GG');
+
+    // PRIORITY
+
+    addUnitPriority('weekYear', 1);
+    addUnitPriority('isoWeekYear', 1);
+
+
+    // PARSING
+
+    addRegexToken('G',      matchSigned);
+    addRegexToken('g',      matchSigned);
+    addRegexToken('GG',     match1to2, match2);
+    addRegexToken('gg',     match1to2, match2);
+    addRegexToken('GGGG',   match1to4, match4);
+    addRegexToken('gggg',   match1to4, match4);
+    addRegexToken('GGGGG',  match1to6, match6);
+    addRegexToken('ggggg',  match1to6, match6);
+
+    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+        week[token.substr(0, 2)] = toInt(input);
+    });
+
+    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);
+    });
+
+    // MOMENTS
+
+    function getSetWeekYear (input) {
+        return getSetWeekYearHelper.call(this,
+                input,
+                this.week(),
+                this.weekday(),
+                this.localeData()._week.dow,
+                this.localeData()._week.doy);
+    }
+
+    function getSetISOWeekYear (input) {
+        return getSetWeekYearHelper.call(this,
+                input, this.isoWeek(), this.isoWeekday(), 1, 4);
+    }
+
+    function getISOWeeksInYear () {
+        return weeksInYear(this.year(), 1, 4);
+    }
+
+    function getWeeksInYear () {
+        var weekInfo = this.localeData()._week;
+        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+    }
+
+    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+        var weeksTarget;
+        if (input == null) {
+            return weekOfYear(this, dow, doy).year;
+        } else {
+            weeksTarget = weeksInYear(input, dow, doy);
+            if (week > weeksTarget) {
+                week = weeksTarget;
+            }
+            return setWeekAll.call(this, input, week, weekday, dow, doy);
+        }
+    }
+
+    function setWeekAll(weekYear, week, weekday, dow, doy) {
+        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
+            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+        this.year(date.getUTCFullYear());
+        this.month(date.getUTCMonth());
+        this.date(date.getUTCDate());
+        return this;
+    }
+
+    // FORMATTING
+
+    addFormatToken('Q', 0, 'Qo', 'quarter');
+
+    // ALIASES
+
+    addUnitAlias('quarter', 'Q');
+
+    // PRIORITY
+
+    addUnitPriority('quarter', 7);
+
+    // PARSING
+
+    addRegexToken('Q', match1);
+    addParseToken('Q', function (input, array) {
+        array[MONTH] = (toInt(input) - 1) * 3;
+    });
+
+    // MOMENTS
+
+    function getSetQuarter (input) {
+        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+    }
+
+    // FORMATTING
+
+    addFormatToken('D', ['DD', 2], 'Do', 'date');
+
+    // ALIASES
+
+    addUnitAlias('date', 'D');
+
+    // PRIOROITY
+    addUnitPriority('date', 9);
+
+    // PARSING
 
-        if (!key) {
-            return moment._locale;
-        }
+    addRegexToken('D',  match1to2);
+    addRegexToken('DD', match1to2, match2);
+    addRegexToken('Do', function (isStrict, locale) {
+        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
+    });
 
-        if (!isArray(key)) {
-            //short-circuit everything else
-            locale = loadLocale(key);
-            if (locale) {
-                return locale;
-            }
-            key = [key];
-        }
+    addParseToken(['D', 'DD'], DATE);
+    addParseToken('Do', function (input, array) {
+        array[DATE] = toInt(input.match(match1to2)[0], 10);
+    });
 
-        return chooseLocale(key);
-    };
+    // MOMENTS
 
-    // compare moment object
-    moment.isMoment = function (obj) {
-        return obj instanceof Moment ||
-            (obj != null && hasOwnProp(obj, '_isAMomentObject'));
-    };
+    var getSetDayOfMonth = makeGetSet('Date', true);
 
-    // for typechecking Duration objects
-    moment.isDuration = function (obj) {
-        return obj instanceof Duration;
-    };
+    // FORMATTING
 
-    for (i = lists.length - 1; i >= 0; --i) {
-        makeList(lists[i]);
-    }
+    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
 
-    moment.normalizeUnits = function (units) {
-        return normalizeUnits(units);
-    };
+    // ALIASES
 
-    moment.invalid = function (flags) {
-        var m = moment.utc(NaN);
-        if (flags != null) {
-            extend(m._pf, flags);
-        }
-        else {
-            m._pf.userInvalidated = true;
-        }
+    addUnitAlias('dayOfYear', 'DDD');
 
-        return m;
-    };
+    // PRIORITY
+    addUnitPriority('dayOfYear', 4);
 
-    moment.parseZone = function () {
-        return moment.apply(null, arguments).parseZone();
-    };
+    // PARSING
 
-    moment.parseTwoDigitYear = function (input) {
-        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
-    };
+    addRegexToken('DDD',  match1to3);
+    addRegexToken('DDDD', match3);
+    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+        config._dayOfYear = toInt(input);
+    });
 
-    /************************************
-        Moment Prototype
-    ************************************/
+    // HELPERS
 
+    // MOMENTS
 
-    extend(moment.fn = Moment.prototype, {
+    function getSetDayOfYear (input) {
+        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+    }
 
-        clone : function () {
-            return moment(this);
-        },
+    // FORMATTING
 
-        valueOf : function () {
-            return +this._d + ((this._offset || 0) * 60000);
-        },
+    addFormatToken('m', ['mm', 2], 0, 'minute');
 
-        unix : function () {
-            return Math.floor(+this / 1000);
-        },
+    // ALIASES
 
-        toString : function () {
-            return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
-        },
+    addUnitAlias('minute', 'm');
 
-        toDate : function () {
-            return this._offset ? new Date(+this) : this._d;
-        },
+    // PRIORITY
 
-        toISOString : function () {
-            var m = moment(this).utc();
-            if (0 < m.year() && m.year() <= 9999) {
-                if ('function' === typeof Date.prototype.toISOString) {
-                    // native implementation is ~50x faster, use it when we can
-                    return this.toDate().toISOString();
-                } else {
-                    return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
-                }
-            } else {
-                return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
-            }
-        },
+    addUnitPriority('minute', 14);
 
-        toArray : function () {
-            var m = this;
-            return [
-                m.year(),
-                m.month(),
-                m.date(),
-                m.hours(),
-                m.minutes(),
-                m.seconds(),
-                m.milliseconds()
-            ];
-        },
+    // PARSING
 
-        isValid : function () {
-            return isValid(this);
-        },
+    addRegexToken('m',  match1to2);
+    addRegexToken('mm', match1to2, match2);
+    addParseToken(['m', 'mm'], MINUTE);
 
-        isDSTShifted : function () {
-            if (this._a) {
-                return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
-            }
+    // MOMENTS
 
-            return false;
-        },
+    var getSetMinute = makeGetSet('Minutes', false);
 
-        parsingFlags : function () {
-            return extend({}, this._pf);
-        },
+    // FORMATTING
 
-        invalidAt: function () {
-            return this._pf.overflow;
-        },
+    addFormatToken('s', ['ss', 2], 0, 'second');
 
-        utc : function (keepLocalTime) {
-            return this.zone(0, keepLocalTime);
-        },
+    // ALIASES
 
-        local : function (keepLocalTime) {
-            if (this._isUTC) {
-                this.zone(0, keepLocalTime);
-                this._isUTC = false;
+    addUnitAlias('second', 's');
 
-                if (keepLocalTime) {
-                    this.add(this._dateTzOffset(), 'm');
-                }
-            }
-            return this;
-        },
+    // PRIORITY
 
-        format : function (inputString) {
-            var output = formatMoment(this, inputString || moment.defaultFormat);
-            return this.localeData().postformat(output);
-        },
+    addUnitPriority('second', 15);
 
-        add : createAdder(1, 'add'),
+    // PARSING
 
-        subtract : createAdder(-1, 'subtract'),
+    addRegexToken('s',  match1to2);
+    addRegexToken('ss', match1to2, match2);
+    addParseToken(['s', 'ss'], SECOND);
 
-        diff : function (input, units, asFloat) {
-            var that = makeAs(input, this),
-                zoneDiff = (this.zone() - that.zone()) * 6e4,
-                diff, output, daysAdjust;
+    // MOMENTS
 
-            units = normalizeUnits(units);
+    var getSetSecond = makeGetSet('Seconds', false);
 
-            if (units === 'year' || units === 'month') {
-                // average number of days in the months in the given dates
-                diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
-                // difference in months
-                output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
-                // adjust by taking difference in days, average number of days
-                // and dst in the given months.
-                daysAdjust = (this - moment(this).startOf('month')) -
-                    (that - moment(that).startOf('month'));
-                // same as above but with zones, to negate all dst
-                daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -
-                        (that.zone() - moment(that).startOf('month').zone())) * 6e4;
-                output += daysAdjust / diff;
-                if (units === 'year') {
-                    output = output / 12;
-                }
-            } else {
-                diff = (this - that);
-                output = units === 'second' ? diff / 1e3 : // 1000
-                    units === 'minute' ? diff / 6e4 : // 1000 * 60
-                    units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
-                    units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
-                    units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
-                    diff;
-            }
-            return asFloat ? output : absRound(output);
-        },
-
-        from : function (time, withoutSuffix) {
-            return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
-        },
-
-        fromNow : function (withoutSuffix) {
-            return this.from(moment(), withoutSuffix);
-        },
-
-        calendar : function (time) {
-            // We want to compare the start of today, vs this.
-            // Getting start-of-today depends on whether we're zone'd or not.
-            var now = time || moment(),
-                sod = makeAs(now, this).startOf('day'),
-                diff = this.diff(sod, 'days', true),
-                format = diff < -6 ? 'sameElse' :
-                    diff < -1 ? 'lastWeek' :
-                    diff < 0 ? 'lastDay' :
-                    diff < 1 ? 'sameDay' :
-                    diff < 2 ? 'nextDay' :
-                    diff < 7 ? 'nextWeek' : 'sameElse';
-            return this.format(this.localeData().calendar(format, this, moment(now)));
-        },
-
-        isLeapYear : function () {
-            return isLeapYear(this.year());
-        },
-
-        isDST : function () {
-            return (this.zone() < this.clone().month(0).zone() ||
-                this.zone() < this.clone().month(5).zone());
-        },
-
-        day : function (input) {
-            var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
-            if (input != null) {
-                input = parseWeekday(input, this.localeData());
-                return this.add(input - day, 'd');
-            } else {
-                return day;
-            }
-        },
+    // FORMATTING
 
-        month : makeAccessor('Month', true),
+    addFormatToken('S', 0, 0, function () {
+        return ~~(this.millisecond() / 100);
+    });
 
-        startOf : function (units) {
-            units = normalizeUnits(units);
-            // the following switch intentionally omits break keywords
-            // to utilize falling through the cases.
-            switch (units) {
-            case 'year':
-                this.month(0);
-                /* falls through */
-            case 'quarter':
-            case 'month':
-                this.date(1);
-                /* falls through */
-            case 'week':
-            case 'isoWeek':
-            case 'day':
-                this.hours(0);
-                /* falls through */
-            case 'hour':
-                this.minutes(0);
-                /* falls through */
-            case 'minute':
-                this.seconds(0);
-                /* falls through */
-            case 'second':
-                this.milliseconds(0);
-                /* falls through */
-            }
+    addFormatToken(0, ['SS', 2], 0, function () {
+        return ~~(this.millisecond() / 10);
+    });
 
-            // weeks are a special case
-            if (units === 'week') {
-                this.weekday(0);
-            } else if (units === 'isoWeek') {
-                this.isoWeekday(1);
-            }
+    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
+    addFormatToken(0, ['SSSS', 4], 0, function () {
+        return this.millisecond() * 10;
+    });
+    addFormatToken(0, ['SSSSS', 5], 0, function () {
+        return this.millisecond() * 100;
+    });
+    addFormatToken(0, ['SSSSSS', 6], 0, function () {
+        return this.millisecond() * 1000;
+    });
+    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
+        return this.millisecond() * 10000;
+    });
+    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
+        return this.millisecond() * 100000;
+    });
+    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
+        return this.millisecond() * 1000000;
+    });
 
-            // quarters are also special
-            if (units === 'quarter') {
-                this.month(Math.floor(this.month() / 3) * 3);
-            }
 
-            return this;
-        },
+    // ALIASES
 
-        endOf: function (units) {
-            units = normalizeUnits(units);
-            if (units === undefined || units === 'millisecond') {
-                return this;
-            }
-            return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
-        },
+    addUnitAlias('millisecond', 'ms');
 
-        isAfter: function (input, units) {
-            var inputMs;
-            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
-            if (units === 'millisecond') {
-                input = moment.isMoment(input) ? input : moment(input);
-                return +this > +input;
-            } else {
-                inputMs = moment.isMoment(input) ? +input : +moment(input);
-                return inputMs < +this.clone().startOf(units);
-            }
-        },
+    // PRIORITY
 
-        isBefore: function (input, units) {
-            var inputMs;
-            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
-            if (units === 'millisecond') {
-                input = moment.isMoment(input) ? input : moment(input);
-                return +this < +input;
-            } else {
-                inputMs = moment.isMoment(input) ? +input : +moment(input);
-                return +this.clone().endOf(units) < inputMs;
-            }
-        },
+    addUnitPriority('millisecond', 16);
 
-        isSame: function (input, units) {
-            var inputMs;
-            units = normalizeUnits(units || 'millisecond');
-            if (units === 'millisecond') {
-                input = moment.isMoment(input) ? input : moment(input);
-                return +this === +input;
-            } else {
-                inputMs = +moment(input);
-                return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
-            }
-        },
-
-        min: deprecate(
-                 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
-                 function (other) {
-                     other = moment.apply(null, arguments);
-                     return other < this ? this : other;
-                 }
-         ),
-
-        max: deprecate(
-                'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
-                function (other) {
-                    other = moment.apply(null, arguments);
-                    return other > this ? this : other;
-                }
-        ),
-
-        // keepLocalTime = true means only change the timezone, without
-        // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]-->
-        // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone
-        // +0200, so we adjust the time as needed, to be valid.
-        //
-        // Keeping the time actually adds/subtracts (one hour)
-        // from the actual represented time. That is why we call updateOffset
-        // a second time. In case it wants us to change the offset again
-        // _changeInProgress == true case, then we have to adjust, because
-        // there is no such time in the given timezone.
-        zone : function (input, keepLocalTime) {
-            var offset = this._offset || 0,
-                localAdjust;
-            if (input != null) {
-                if (typeof input === 'string') {
-                    input = timezoneMinutesFromString(input);
-                }
-                if (Math.abs(input) < 16) {
-                    input = input * 60;
-                }
-                if (!this._isUTC && keepLocalTime) {
-                    localAdjust = this._dateTzOffset();
-                }
-                this._offset = input;
-                this._isUTC = true;
-                if (localAdjust != null) {
-                    this.subtract(localAdjust, 'm');
-                }
-                if (offset !== input) {
-                    if (!keepLocalTime || this._changeInProgress) {
-                        addOrSubtractDurationFromMoment(this,
-                                moment.duration(offset - input, 'm'), 1, false);
-                    } else if (!this._changeInProgress) {
-                        this._changeInProgress = true;
-                        moment.updateOffset(this, true);
-                        this._changeInProgress = null;
-                    }
-                }
-            } else {
-                return this._isUTC ? offset : this._dateTzOffset();
-            }
-            return this;
-        },
+    // PARSING
 
-        zoneAbbr : function () {
-            return this._isUTC ? 'UTC' : '';
-        },
+    addRegexToken('S',    match1to3, match1);
+    addRegexToken('SS',   match1to3, match2);
+    addRegexToken('SSS',  match1to3, match3);
 
-        zoneName : function () {
-            return this._isUTC ? 'Coordinated Universal Time' : '';
-        },
+    var token;
+    for (token = 'SSSS'; token.length <= 9; token += 'S') {
+        addRegexToken(token, matchUnsigned);
+    }
 
-        parseZone : function () {
-            if (this._tzm) {
-                this.zone(this._tzm);
-            } else if (typeof this._i === 'string') {
-                this.zone(this._i);
-            }
-            return this;
-        },
+    function parseMs(input, array) {
+        array[MILLISECOND] = toInt(('0.' + input) * 1000);
+    }
 
-        hasAlignedHourOffset : function (input) {
-            if (!input) {
-                input = 0;
-            }
-            else {
-                input = moment(input).zone();
-            }
-
-            return (this.zone() - input) % 60 === 0;
-        },
-
-        daysInMonth : function () {
-            return daysInMonth(this.year(), this.month());
-        },
-
-        dayOfYear : function (input) {
-            var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
-            return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
-        },
-
-        quarter : function (input) {
-            return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
-        },
-
-        weekYear : function (input) {
-            var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
-            return input == null ? year : this.add((input - year), 'y');
-        },
-
-        isoWeekYear : function (input) {
-            var year = weekOfYear(this, 1, 4).year;
-            return input == null ? year : this.add((input - year), 'y');
-        },
-
-        week : function (input) {
-            var week = this.localeData().week(this);
-            return input == null ? week : this.add((input - week) * 7, 'd');
-        },
-
-        isoWeek : function (input) {
-            var week = weekOfYear(this, 1, 4).week;
-            return input == null ? week : this.add((input - week) * 7, 'd');
-        },
-
-        weekday : function (input) {
-            var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
-            return input == null ? weekday : this.add(input - weekday, 'd');
-        },
-
-        isoWeekday : function (input) {
-            // behaves the same as moment#day except
-            // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
-            // as a setter, sunday should belong to the previous week.
-            return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
-        },
-
-        isoWeeksInYear : function () {
-            return weeksInYear(this.year(), 1, 4);
-        },
-
-        weeksInYear : function () {
-            var weekInfo = this.localeData()._week;
-            return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
-        },
-
-        get : function (units) {
-            units = normalizeUnits(units);
-            return this[units]();
-        },
+    for (token = 'S'; token.length <= 9; token += 'S') {
+        addParseToken(token, parseMs);
+    }
+    // MOMENTS
 
-        set : function (units, value) {
-            units = normalizeUnits(units);
-            if (typeof this[units] === 'function') {
-                this[units](value);
-            }
-            return this;
-        },
+    var getSetMillisecond = makeGetSet('Milliseconds', false);
 
-        // If passed a locale key, it will set the locale for this
-        // instance.  Otherwise, it will return the locale configuration
-        // variables for this instance.
-        locale : function (key) {
-            var newLocaleData;
+    // FORMATTING
 
-            if (key === undefined) {
-                return this._locale._abbr;
-            } else {
-                newLocaleData = moment.localeData(key);
-                if (newLocaleData != null) {
-                    this._locale = newLocaleData;
-                }
-                return this;
-            }
-        },
+    addFormatToken('z',  0, 0, 'zoneAbbr');
+    addFormatToken('zz', 0, 0, 'zoneName');
 
-        lang : deprecate(
-            'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
-            function (key) {
-                if (key === undefined) {
-                    return this.localeData();
-                } else {
-                    return this.locale(key);
-                }
-            }
-        ),
+    // MOMENTS
 
-        localeData : function () {
-            return this._locale;
-        },
+    function getZoneAbbr () {
+        return this._isUTC ? 'UTC' : '';
+    }
 
-        _dateTzOffset : function () {
-            // On Firefox.24 Date#getTimezoneOffset returns a floating point.
-            // https://github.com/moment/moment/pull/1871
-            return Math.round(this._d.getTimezoneOffset() / 15) * 15;
-        }
-    });
+    function getZoneName () {
+        return this._isUTC ? 'Coordinated Universal Time' : '';
+    }
 
-    function rawMonthSetter(mom, value) {
-        var dayOfMonth;
+    var momentPrototype__proto = Moment.prototype;
+
+    momentPrototype__proto.add               = add_subtract__add;
+    momentPrototype__proto.calendar          = moment_calendar__calendar;
+    momentPrototype__proto.clone             = clone;
+    momentPrototype__proto.diff              = diff;
+    momentPrototype__proto.endOf             = endOf;
+    momentPrototype__proto.format            = format;
+    momentPrototype__proto.from              = from;
+    momentPrototype__proto.fromNow           = fromNow;
+    momentPrototype__proto.to                = to;
+    momentPrototype__proto.toNow             = toNow;
+    momentPrototype__proto.get               = stringGet;
+    momentPrototype__proto.invalidAt         = invalidAt;
+    momentPrototype__proto.isAfter           = isAfter;
+    momentPrototype__proto.isBefore          = isBefore;
+    momentPrototype__proto.isBetween         = isBetween;
+    momentPrototype__proto.isSame            = isSame;
+    momentPrototype__proto.isSameOrAfter     = isSameOrAfter;
+    momentPrototype__proto.isSameOrBefore    = isSameOrBefore;
+    momentPrototype__proto.isValid           = moment_valid__isValid;
+    momentPrototype__proto.lang              = lang;
+    momentPrototype__proto.locale            = locale;
+    momentPrototype__proto.localeData        = localeData;
+    momentPrototype__proto.max               = prototypeMax;
+    momentPrototype__proto.min               = prototypeMin;
+    momentPrototype__proto.parsingFlags      = parsingFlags;
+    momentPrototype__proto.set               = stringSet;
+    momentPrototype__proto.startOf           = startOf;
+    momentPrototype__proto.subtract          = add_subtract__subtract;
+    momentPrototype__proto.toArray           = toArray;
+    momentPrototype__proto.toObject          = toObject;
+    momentPrototype__proto.toDate            = toDate;
+    momentPrototype__proto.toISOString       = moment_format__toISOString;
+    momentPrototype__proto.toJSON            = toJSON;
+    momentPrototype__proto.toString          = toString;
+    momentPrototype__proto.unix              = unix;
+    momentPrototype__proto.valueOf           = to_type__valueOf;
+    momentPrototype__proto.creationData      = creationData;
+
+    // Year
+    momentPrototype__proto.year       = getSetYear;
+    momentPrototype__proto.isLeapYear = getIsLeapYear;
+
+    // Week Year
+    momentPrototype__proto.weekYear    = getSetWeekYear;
+    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;
+
+    // Quarter
+    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;
+
+    // Month
+    momentPrototype__proto.month       = getSetMonth;
+    momentPrototype__proto.daysInMonth = getDaysInMonth;
+
+    // Week
+    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;
+    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;
+    momentPrototype__proto.weeksInYear    = getWeeksInYear;
+    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;
+
+    // Day
+    momentPrototype__proto.date       = getSetDayOfMonth;
+    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;
+    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;
+    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;
+    momentPrototype__proto.dayOfYear  = getSetDayOfYear;
+
+    // Hour
+    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;
+
+    // Minute
+    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;
+
+    // Second
+    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;
+
+    // Millisecond
+    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;
+
+    // Offset
+    momentPrototype__proto.utcOffset            = getSetOffset;
+    momentPrototype__proto.utc                  = setOffsetToUTC;
+    momentPrototype__proto.local                = setOffsetToLocal;
+    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;
+    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;
+    momentPrototype__proto.isDST                = isDaylightSavingTime;
+    momentPrototype__proto.isLocal              = isLocal;
+    momentPrototype__proto.isUtcOffset          = isUtcOffset;
+    momentPrototype__proto.isUtc                = isUtc;
+    momentPrototype__proto.isUTC                = isUtc;
+
+    // Timezone
+    momentPrototype__proto.zoneAbbr = getZoneAbbr;
+    momentPrototype__proto.zoneName = getZoneName;
+
+    // Deprecations
+    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
+    momentPrototype__proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
+
+    var momentPrototype = momentPrototype__proto;
+
+    function moment__createUnix (input) {
+        return local__createLocal(input * 1000);
+    }
 
-        // TODO: Move this out of here!
-        if (typeof value === 'string') {
-            value = mom.localeData().monthsParse(value);
-            // TODO: Another silent failure?
-            if (typeof value !== 'number') {
-                return mom;
-            }
-        }
+    function moment__createInZone () {
+        return local__createLocal.apply(null, arguments).parseZone();
+    }
 
-        dayOfMonth = Math.min(mom.date(),
-                daysInMonth(mom.year(), value));
-        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
-        return mom;
+    function preParsePostFormat (string) {
+        return string;
     }
 
-    function rawGetter(mom, unit) {
-        return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
+    var prototype__proto = Locale.prototype;
+
+    prototype__proto.calendar        = locale_calendar__calendar;
+    prototype__proto.longDateFormat  = longDateFormat;
+    prototype__proto.invalidDate     = invalidDate;
+    prototype__proto.ordinal         = ordinal;
+    prototype__proto.preparse        = preParsePostFormat;
+    prototype__proto.postformat      = preParsePostFormat;
+    prototype__proto.relativeTime    = relative__relativeTime;
+    prototype__proto.pastFuture      = pastFuture;
+    prototype__proto.set             = locale_set__set;
+
+    // Month
+    prototype__proto.months            =        localeMonths;
+    prototype__proto.monthsShort       =        localeMonthsShort;
+    prototype__proto.monthsParse       =        localeMonthsParse;
+    prototype__proto.monthsRegex       = monthsRegex;
+    prototype__proto.monthsShortRegex  = monthsShortRegex;
+
+    // Week
+    prototype__proto.week = localeWeek;
+    prototype__proto.firstDayOfYear = localeFirstDayOfYear;
+    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;
+
+    // Day of Week
+    prototype__proto.weekdays       =        localeWeekdays;
+    prototype__proto.weekdaysMin    =        localeWeekdaysMin;
+    prototype__proto.weekdaysShort  =        localeWeekdaysShort;
+    prototype__proto.weekdaysParse  =        localeWeekdaysParse;
+
+    prototype__proto.weekdaysRegex       =        weekdaysRegex;
+    prototype__proto.weekdaysShortRegex  =        weekdaysShortRegex;
+    prototype__proto.weekdaysMinRegex    =        weekdaysMinRegex;
+
+    // Hours
+    prototype__proto.isPM = localeIsPM;
+    prototype__proto.meridiem = localeMeridiem;
+
+    function lists__get (format, index, field, setter) {
+        var locale = locale_locales__getLocale();
+        var utc = create_utc__createUTC().set(setter, index);
+        return locale[field](utc, format);
     }
 
-    function rawSetter(mom, unit, value) {
-        if (unit === 'Month') {
-            return rawMonthSetter(mom, value);
-        } else {
-            return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+    function listMonthsImpl (format, index, field) {
+        if (typeof format === 'number') {
+            index = format;
+            format = undefined;
+        }
+
+        format = format || '';
+
+        if (index != null) {
+            return lists__get(format, index, field, 'month');
+        }
+
+        var i;
+        var out = [];
+        for (i = 0; i < 12; i++) {
+            out[i] = lists__get(format, i, field, 'month');
         }
+        return out;
     }
 
-    function makeAccessor(unit, keepTime) {
-        return function (value) {
-            if (value != null) {
-                rawSetter(this, unit, value);
-                moment.updateOffset(this, keepTime);
-                return this;
-            } else {
-                return rawGetter(this, unit);
+    // ()
+    // (5)
+    // (fmt, 5)
+    // (fmt)
+    // (true)
+    // (true, 5)
+    // (true, fmt, 5)
+    // (true, fmt)
+    function listWeekdaysImpl (localeSorted, format, index, field) {
+        if (typeof localeSorted === 'boolean') {
+            if (typeof format === 'number') {
+                index = format;
+                format = undefined;
             }
-        };
-    }
 
-    moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);
-    moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);
-    moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);
-    // Setting the hour should keep the time, because the user explicitly
-    // specified which hour he wants. So trying to maintain the same hour (in
-    // a new timezone) makes sense. Adding/subtracting hours does not follow
-    // this rule.
-    moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);
-    // moment.fn.month is defined separately
-    moment.fn.date = makeAccessor('Date', true);
-    moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));
-    moment.fn.year = makeAccessor('FullYear', true);
-    moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));
+            format = format || '';
+        } else {
+            format = localeSorted;
+            index = format;
+            localeSorted = false;
 
-    // add plural methods
-    moment.fn.days = moment.fn.day;
-    moment.fn.months = moment.fn.month;
-    moment.fn.weeks = moment.fn.week;
-    moment.fn.isoWeeks = moment.fn.isoWeek;
-    moment.fn.quarters = moment.fn.quarter;
+            if (typeof format === 'number') {
+                index = format;
+                format = undefined;
+            }
 
-    // add aliased format methods
-    moment.fn.toJSON = moment.fn.toISOString;
+            format = format || '';
+        }
 
-    /************************************
-        Duration Prototype
-    ************************************/
+        var locale = locale_locales__getLocale(),
+            shift = localeSorted ? locale._week.dow : 0;
 
+        if (index != null) {
+            return lists__get(format, (index + shift) % 7, field, 'day');
+        }
 
-    function daysToYears (days) {
-        // 400 years have 146097 days (taking into account leap year rules)
-        return days * 400 / 146097;
+        var i;
+        var out = [];
+        for (i = 0; i < 7; i++) {
+            out[i] = lists__get(format, (i + shift) % 7, field, 'day');
+        }
+        return out;
     }
 
-    function yearsToDays (years) {
-        // years * 365 + absRound(years / 4) -
-        //     absRound(years / 100) + absRound(years / 400);
-        return years * 146097 / 400;
+    function lists__listMonths (format, index) {
+        return listMonthsImpl(format, index, 'months');
     }
 
-    extend(moment.duration.fn = Duration.prototype, {
-
-        _bubble : function () {
-            var milliseconds = this._milliseconds,
-                days = this._days,
-                months = this._months,
-                data = this._data,
-                seconds, minutes, hours, years = 0;
-
-            // The following code bubbles up values, see the tests for
-            // examples of what that means.
-            data.milliseconds = milliseconds % 1000;
+    function lists__listMonthsShort (format, index) {
+        return listMonthsImpl(format, index, 'monthsShort');
+    }
 
-            seconds = absRound(milliseconds / 1000);
-            data.seconds = seconds % 60;
+    function lists__listWeekdays (localeSorted, format, index) {
+        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
+    }
 
-            minutes = absRound(seconds / 60);
-            data.minutes = minutes % 60;
+    function lists__listWeekdaysShort (localeSorted, format, index) {
+        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
+    }
 
-            hours = absRound(minutes / 60);
-            data.hours = hours % 24;
+    function lists__listWeekdaysMin (localeSorted, format, index) {
+        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
+    }
 
-            days += absRound(hours / 24);
+    locale_locales__getSetGlobalLocale('en', {
+        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
+        ordinal : function (number) {
+            var b = number % 10,
+                output = (toInt(number % 100 / 10) === 1) ? 'th' :
+                (b === 1) ? 'st' :
+                (b === 2) ? 'nd' :
+                (b === 3) ? 'rd' : 'th';
+            return number + output;
+        }
+    });
 
-            // Accurately convert days to years, assume start from year 0.
-            years = absRound(daysToYears(days));
-            days -= absRound(yearsToDays(years));
+    // Side effect imports
+    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);
+    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);
 
-            // 30 days to a month
-            // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
-            months += absRound(days / 30);
-            days %= 30;
+    var mathAbs = Math.abs;
 
-            // 12 months -> 1 year
-            years += absRound(months / 12);
-            months %= 12;
+    function duration_abs__abs () {
+        var data           = this._data;
 
-            data.days = days;
-            data.months = months;
-            data.years = years;
-        },
+        this._milliseconds = mathAbs(this._milliseconds);
+        this._days         = mathAbs(this._days);
+        this._months       = mathAbs(this._months);
 
-        abs : function () {
-            this._milliseconds = Math.abs(this._milliseconds);
-            this._days = Math.abs(this._days);
-            this._months = Math.abs(this._months);
+        data.milliseconds  = mathAbs(data.milliseconds);
+        data.seconds       = mathAbs(data.seconds);
+        data.minutes       = mathAbs(data.minutes);
+        data.hours         = mathAbs(data.hours);
+        data.months        = mathAbs(data.months);
+        data.years         = mathAbs(data.years);
 
-            this._data.milliseconds = Math.abs(this._data.milliseconds);
-            this._data.seconds = Math.abs(this._data.seconds);
-            this._data.minutes = Math.abs(this._data.minutes);
-            this._data.hours = Math.abs(this._data.hours);
-            this._data.months = Math.abs(this._data.months);
-            this._data.years = Math.abs(this._data.years);
+        return this;
+    }
 
-            return this;
-        },
+    function duration_add_subtract__addSubtract (duration, input, value, direction) {
+        var other = create__createDuration(input, value);
 
-        weeks : function () {
-            return absRound(this.days() / 7);
-        },
+        duration._milliseconds += direction * other._milliseconds;
+        duration._days         += direction * other._days;
+        duration._months       += direction * other._months;
 
-        valueOf : function () {
-            return this._milliseconds +
-              this._days * 864e5 +
-              (this._months % 12) * 2592e6 +
-              toInt(this._months / 12) * 31536e6;
-        },
+        return duration._bubble();
+    }
 
-        humanize : function (withSuffix) {
-            var output = relativeTime(this, !withSuffix, this.localeData());
+    // supports only 2.0-style add(1, 's') or add(duration)
+    function duration_add_subtract__add (input, value) {
+        return duration_add_subtract__addSubtract(this, input, value, 1);
+    }
 
-            if (withSuffix) {
-                output = this.localeData().pastFuture(+this, output);
-            }
+    // supports only 2.0-style subtract(1, 's') or subtract(duration)
+    function duration_add_subtract__subtract (input, value) {
+        return duration_add_subtract__addSubtract(this, input, value, -1);
+    }
 
-            return this.localeData().postformat(output);
-        },
+    function absCeil (number) {
+        if (number < 0) {
+            return Math.floor(number);
+        } else {
+            return Math.ceil(number);
+        }
+    }
 
-        add : function (input, val) {
-            // supports only 2.0-style add(1, 's') or add(moment)
-            var dur = moment.duration(input, val);
+    function bubble () {
+        var milliseconds = this._milliseconds;
+        var days         = this._days;
+        var months       = this._months;
+        var data         = this._data;
+        var seconds, minutes, hours, years, monthsFromDays;
+
+        // if we have a mix of positive and negative values, bubble down first
+        // check: https://github.com/moment/moment/issues/2166
+        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
+                (milliseconds <= 0 && days <= 0 && months <= 0))) {
+            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
+            days = 0;
+            months = 0;
+        }
 
-            this._milliseconds += dur._milliseconds;
-            this._days += dur._days;
-            this._months += dur._months;
+        // The following code bubbles up values, see the tests for
+        // examples of what that means.
+        data.milliseconds = milliseconds % 1000;
 
-            this._bubble();
+        seconds           = absFloor(milliseconds / 1000);
+        data.seconds      = seconds % 60;
 
-            return this;
-        },
+        minutes           = absFloor(seconds / 60);
+        data.minutes      = minutes % 60;
 
-        subtract : function (input, val) {
-            var dur = moment.duration(input, val);
+        hours             = absFloor(minutes / 60);
+        data.hours        = hours % 24;
 
-            this._milliseconds -= dur._milliseconds;
-            this._days -= dur._days;
-            this._months -= dur._months;
+        days += absFloor(hours / 24);
 
-            this._bubble();
+        // convert days to months
+        monthsFromDays = absFloor(daysToMonths(days));
+        months += monthsFromDays;
+        days -= absCeil(monthsToDays(monthsFromDays));
 
-            return this;
-        },
+        // 12 months -> 1 year
+        years = absFloor(months / 12);
+        months %= 12;
 
-        get : function (units) {
-            units = normalizeUnits(units);
-            return this[units.toLowerCase() + 's']();
-        },
+        data.days   = days;
+        data.months = months;
+        data.years  = years;
 
-        as : function (units) {
-            var days, months;
-            units = normalizeUnits(units);
+        return this;
+    }
 
-            if (units === 'month' || units === 'year') {
-                days = this._days + this._milliseconds / 864e5;
-                months = this._months + daysToYears(days) * 12;
-                return units === 'month' ? months : months / 12;
-            } else {
-                // handle milliseconds separately because of floating point math errors (issue #1867)
-                days = this._days + Math.round(yearsToDays(this._months / 12));
-                switch (units) {
-                    case 'week': return days / 7 + this._milliseconds / 6048e5;
-                    case 'day': return days + this._milliseconds / 864e5;
-                    case 'hour': return days * 24 + this._milliseconds / 36e5;
-                    case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;
-                    case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;
-                    // Math.floor prevents floating point math errors here
-                    case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;
-                    default: throw new Error('Unknown unit ' + units);
-                }
-            }
-        },
+    function daysToMonths (days) {
+        // 400 years have 146097 days (taking into account leap year rules)
+        // 400 years have 12 months === 4800
+        return days * 4800 / 146097;
+    }
 
-        lang : moment.fn.lang,
-        locale : moment.fn.locale,
+    function monthsToDays (months) {
+        // the reverse of daysToMonths
+        return months * 146097 / 4800;
+    }
 
-        toIsoString : deprecate(
-            'toIsoString() is deprecated. Please use toISOString() instead ' +
-            '(notice the capitals)',
-            function () {
-                return this.toISOString();
-            }
-        ),
+    function as (units) {
+        var days;
+        var months;
+        var milliseconds = this._milliseconds;
 
-        toISOString : function () {
-            // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
-            var years = Math.abs(this.years()),
-                months = Math.abs(this.months()),
-                days = Math.abs(this.days()),
-                hours = Math.abs(this.hours()),
-                minutes = Math.abs(this.minutes()),
-                seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+        units = normalizeUnits(units);
 
-            if (!this.asSeconds()) {
-                // this is the same as C#'s (Noda) and python (isodate)...
-                // but not other JS (goog.date)
-                return 'P0D';
+        if (units === 'month' || units === 'year') {
+            days   = this._days   + milliseconds / 864e5;
+            months = this._months + daysToMonths(days);
+            return units === 'month' ? months : months / 12;
+        } else {
+            // handle milliseconds separately because of floating point math errors (issue #1867)
+            days = this._days + Math.round(monthsToDays(this._months));
+            switch (units) {
+                case 'week'   : return days / 7     + milliseconds / 6048e5;
+                case 'day'    : return days         + milliseconds / 864e5;
+                case 'hour'   : return days * 24    + milliseconds / 36e5;
+                case 'minute' : return days * 1440  + milliseconds / 6e4;
+                case 'second' : return days * 86400 + milliseconds / 1000;
+                // Math.floor prevents floating point math errors here
+                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+                default: throw new Error('Unknown unit ' + units);
             }
+        }
+    }
 
-            return (this.asSeconds() < 0 ? '-' : '') +
-                'P' +
-                (years ? years + 'Y' : '') +
-                (months ? months + 'M' : '') +
-                (days ? days + 'D' : '') +
-                ((hours || minutes || seconds) ? 'T' : '') +
-                (hours ? hours + 'H' : '') +
-                (minutes ? minutes + 'M' : '') +
-                (seconds ? seconds + 'S' : '');
-        },
+    // TODO: Use this.as('ms')?
+    function duration_as__valueOf () {
+        return (
+            this._milliseconds +
+            this._days * 864e5 +
+            (this._months % 12) * 2592e6 +
+            toInt(this._months / 12) * 31536e6
+        );
+    }
 
-        localeData : function () {
-            return this._locale;
-        }
-    });
+    function makeAs (alias) {
+        return function () {
+            return this.as(alias);
+        };
+    }
 
-    moment.duration.fn.toString = moment.duration.fn.toISOString;
+    var asMilliseconds = makeAs('ms');
+    var asSeconds      = makeAs('s');
+    var asMinutes      = makeAs('m');
+    var asHours        = makeAs('h');
+    var asDays         = makeAs('d');
+    var asWeeks        = makeAs('w');
+    var asMonths       = makeAs('M');
+    var asYears        = makeAs('y');
+
+    function duration_get__get (units) {
+        units = normalizeUnits(units);
+        return this[units + 's']();
+    }
 
-    function makeDurationGetter(name) {
-        moment.duration.fn[name] = function () {
+    function makeGetter(name) {
+        return function () {
             return this._data[name];
         };
     }
 
-    for (i in unitMillisecondFactors) {
-        if (hasOwnProp(unitMillisecondFactors, i)) {
-            makeDurationGetter(i.toLowerCase());
-        }
+    var milliseconds = makeGetter('milliseconds');
+    var seconds      = makeGetter('seconds');
+    var minutes      = makeGetter('minutes');
+    var hours        = makeGetter('hours');
+    var days         = makeGetter('days');
+    var months       = makeGetter('months');
+    var years        = makeGetter('years');
+
+    function weeks () {
+        return absFloor(this.days() / 7);
     }
 
-    moment.duration.fn.asMilliseconds = function () {
-        return this.as('ms');
-    };
-    moment.duration.fn.asSeconds = function () {
-        return this.as('s');
-    };
-    moment.duration.fn.asMinutes = function () {
-        return this.as('m');
-    };
-    moment.duration.fn.asHours = function () {
-        return this.as('h');
-    };
-    moment.duration.fn.asDays = function () {
-        return this.as('d');
-    };
-    moment.duration.fn.asWeeks = function () {
-        return this.as('weeks');
-    };
-    moment.duration.fn.asMonths = function () {
-        return this.as('M');
-    };
-    moment.duration.fn.asYears = function () {
-        return this.as('y');
+    var round = Math.round;
+    var thresholds = {
+        s: 45,  // seconds to minute
+        m: 45,  // minutes to hour
+        h: 22,  // hours to day
+        d: 26,  // days to month
+        M: 11   // months to year
     };
 
-    /************************************
-        Default Locale
-    ************************************/
+    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+    }
 
+    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {
+        var duration = create__createDuration(posNegDuration).abs();
+        var seconds  = round(duration.as('s'));
+        var minutes  = round(duration.as('m'));
+        var hours    = round(duration.as('h'));
+        var days     = round(duration.as('d'));
+        var months   = round(duration.as('M'));
+        var years    = round(duration.as('y'));
+
+        var a = seconds < thresholds.s && ['s', seconds]  ||
+                minutes <= 1           && ['m']           ||
+                minutes < thresholds.m && ['mm', minutes] ||
+                hours   <= 1           && ['h']           ||
+                hours   < thresholds.h && ['hh', hours]   ||
+                days    <= 1           && ['d']           ||
+                days    < thresholds.d && ['dd', days]    ||
+                months  <= 1           && ['M']           ||
+                months  < thresholds.M && ['MM', months]  ||
+                years   <= 1           && ['y']           || ['yy', years];
+
+        a[2] = withoutSuffix;
+        a[3] = +posNegDuration > 0;
+        a[4] = locale;
+        return substituteTimeAgo.apply(null, a);
+    }
 
-    // Set default locale, other locale will inherit from English.
-    moment.locale('en', {
-        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
-        ordinal : function (number) {
-            var b = number % 10,
-                output = (toInt(number % 100 / 10) === 1) ? 'th' :
-                (b === 1) ? 'st' :
-                (b === 2) ? 'nd' :
-                (b === 3) ? 'rd' : 'th';
-            return number + output;
+    // This function allows you to set the rounding function for relative time strings
+    function duration_humanize__getSetRelativeTimeRounding (roundingFunction) {
+        if (roundingFunction === undefined) {
+            return round;
         }
-    });
+        if (typeof(roundingFunction) === 'function') {
+            round = roundingFunction;
+            return true;
+        }
+        return false;
+    }
 
-    /* EMBED_LOCALES */
+    // This function allows you to set a threshold for relative time strings
+    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {
+        if (thresholds[threshold] === undefined) {
+            return false;
+        }
+        if (limit === undefined) {
+            return thresholds[threshold];
+        }
+        thresholds[threshold] = limit;
+        return true;
+    }
 
-    /************************************
-        Exposing Moment
-    ************************************/
+    function humanize (withSuffix) {
+        var locale = this.localeData();
+        var output = duration_humanize__relativeTime(this, !withSuffix, locale);
 
-    function makeGlobal(shouldDeprecate) {
-        /*global ender:false */
-        if (typeof ender !== 'undefined') {
-            return;
-        }
-        oldGlobalMoment = globalScope.moment;
-        if (shouldDeprecate) {
-            globalScope.moment = deprecate(
-                    'Accessing Moment through the global scope is ' +
-                    'deprecated, and will be removed in an upcoming ' +
-                    'release.',
-                    moment);
-        } else {
-            globalScope.moment = moment;
+        if (withSuffix) {
+            output = locale.pastFuture(+this, output);
         }
+
+        return locale.postformat(output);
     }
 
-    // CommonJS module is defined
-    if (hasModule) {
-        module.exports = moment;
-    } else if (typeof define === 'function' && define.amd) {
-        define('moment', function (require, exports, module) {
-            if (module.config && module.config() && module.config().noGlobal === true) {
-                // release the global variable
-                globalScope.moment = oldGlobalMoment;
-            }
+    var iso_string__abs = Math.abs;
+
+    function iso_string__toISOString() {
+        // for ISO strings we do not use the normal bubbling rules:
+        //  * milliseconds bubble up until they become hours
+        //  * days do not bubble at all
+        //  * months bubble up until they become years
+        // This is because there is no context-free conversion between hours and days
+        // (think of clock changes)
+        // and also not between days and months (28-31 days per month)
+        var seconds = iso_string__abs(this._milliseconds) / 1000;
+        var days         = iso_string__abs(this._days);
+        var months       = iso_string__abs(this._months);
+        var minutes, hours, years;
+
+        // 3600 seconds -> 60 minutes -> 1 hour
+        minutes           = absFloor(seconds / 60);
+        hours             = absFloor(minutes / 60);
+        seconds %= 60;
+        minutes %= 60;
+
+        // 12 months -> 1 year
+        years  = absFloor(months / 12);
+        months %= 12;
+
+
+        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+        var Y = years;
+        var M = months;
+        var D = days;
+        var h = hours;
+        var m = minutes;
+        var s = seconds;
+        var total = this.asSeconds();
+
+        if (!total) {
+            // this is the same as C#'s (Noda) and python (isodate)...
+            // but not other JS (goog.date)
+            return 'P0D';
+        }
 
-            return moment;
-        });
-        makeGlobal(true);
-    } else {
-        makeGlobal();
+        return (total < 0 ? '-' : '') +
+            'P' +
+            (Y ? Y + 'Y' : '') +
+            (M ? M + 'M' : '') +
+            (D ? D + 'D' : '') +
+            ((h || m || s) ? 'T' : '') +
+            (h ? h + 'H' : '') +
+            (m ? m + 'M' : '') +
+            (s ? s + 'S' : '');
     }
-}).call(this);
+
+    var duration_prototype__proto = Duration.prototype;
+
+    duration_prototype__proto.abs            = duration_abs__abs;
+    duration_prototype__proto.add            = duration_add_subtract__add;
+    duration_prototype__proto.subtract       = duration_add_subtract__subtract;
+    duration_prototype__proto.as             = as;
+    duration_prototype__proto.asMilliseconds = asMilliseconds;
+    duration_prototype__proto.asSeconds      = asSeconds;
+    duration_prototype__proto.asMinutes      = asMinutes;
+    duration_prototype__proto.asHours        = asHours;
+    duration_prototype__proto.asDays         = asDays;
+    duration_prototype__proto.asWeeks        = asWeeks;
+    duration_prototype__proto.asMonths       = asMonths;
+    duration_prototype__proto.asYears        = asYears;
+    duration_prototype__proto.valueOf        = duration_as__valueOf;
+    duration_prototype__proto._bubble        = bubble;
+    duration_prototype__proto.get            = duration_get__get;
+    duration_prototype__proto.milliseconds   = milliseconds;
+    duration_prototype__proto.seconds        = seconds;
+    duration_prototype__proto.minutes        = minutes;
+    duration_prototype__proto.hours          = hours;
+    duration_prototype__proto.days           = days;
+    duration_prototype__proto.weeks          = weeks;
+    duration_prototype__proto.months         = months;
+    duration_prototype__proto.years          = years;
+    duration_prototype__proto.humanize       = humanize;
+    duration_prototype__proto.toISOString    = iso_string__toISOString;
+    duration_prototype__proto.toString       = iso_string__toISOString;
+    duration_prototype__proto.toJSON         = iso_string__toISOString;
+    duration_prototype__proto.locale         = locale;
+    duration_prototype__proto.localeData     = localeData;
+
+    // Deprecations
+    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);
+    duration_prototype__proto.lang = lang;
+
+    // Side effect imports
+
+    // FORMATTING
+
+    addFormatToken('X', 0, 0, 'unix');
+    addFormatToken('x', 0, 0, 'valueOf');
+
+    // PARSING
+
+    addRegexToken('x', matchSigned);
+    addRegexToken('X', matchTimestamp);
+    addParseToken('X', function (input, array, config) {
+        config._d = new Date(parseFloat(input, 10) * 1000);
+    });
+    addParseToken('x', function (input, array, config) {
+        config._d = new Date(toInt(input));
+    });
+
+    // Side effect imports
+
+
+    utils_hooks__hooks.version = '2.15.0';
+
+    setHookCallback(local__createLocal);
+
+    utils_hooks__hooks.fn                    = momentPrototype;
+    utils_hooks__hooks.min                   = min;
+    utils_hooks__hooks.max                   = max;
+    utils_hooks__hooks.now                   = now;
+    utils_hooks__hooks.utc                   = create_utc__createUTC;
+    utils_hooks__hooks.unix                  = moment__createUnix;
+    utils_hooks__hooks.months                = lists__listMonths;
+    utils_hooks__hooks.isDate                = isDate;
+    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;
+    utils_hooks__hooks.invalid               = valid__createInvalid;
+    utils_hooks__hooks.duration              = create__createDuration;
+    utils_hooks__hooks.isMoment              = isMoment;
+    utils_hooks__hooks.weekdays              = lists__listWeekdays;
+    utils_hooks__hooks.parseZone             = moment__createInZone;
+    utils_hooks__hooks.localeData            = locale_locales__getLocale;
+    utils_hooks__hooks.isDuration            = isDuration;
+    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;
+    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;
+    utils_hooks__hooks.defineLocale          = defineLocale;
+    utils_hooks__hooks.updateLocale          = updateLocale;
+    utils_hooks__hooks.locales               = locale_locales__listLocales;
+    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;
+    utils_hooks__hooks.normalizeUnits        = normalizeUnits;
+    utils_hooks__hooks.relativeTimeRounding = duration_humanize__getSetRelativeTimeRounding;
+    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;
+    utils_hooks__hooks.calendarFormat        = getCalendarFormat;
+    utils_hooks__hooks.prototype             = momentPrototype;
+
+    var _moment = utils_hooks__hooks;
+
+    return _moment;
+
+}));
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/i18n/bqi.json b/resources/lib/oojs-ui/i18n/bqi.json
new file mode 100644 (file)
index 0000000..a84374a
--- /dev/null
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mogoeilor"
+               ]
+       },
+       "ooui-toolbar-more": "بیشتر",
+       "ooui-toolgroup-expand": "بیشتر",
+       "ooui-toolgroup-collapse": "کمتر",
+       "ooui-dialog-message-accept": "خۈڤإ",
+       "ooui-dialog-message-reject": "أنجومشيڤ کردن",
+       "ooui-dialog-process-retry": "ز نۉ تلاش کونين",
+       "ooui-dialog-process-continue": "ديندا گرهڌن",
+       "ooui-selectfile-button-select": "گولإڤورچين کردن جانیا",
+       "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ",
+       "ooui-selectfile-dragdrop-placeholder": "جانيانأ ڤأنين ايچو"
+}
index 83af863..cbfcab0 100644 (file)
@@ -18,5 +18,9 @@
        "ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
        "ooui-dialog-process-dismiss": "Disteurel",
        "ooui-dialog-process-retry": "Klask en-dro",
-       "ooui-dialog-process-continue": "Kenderc'hel"
+       "ooui-dialog-process-continue": "Kenderc'hel",
+       "ooui-selectfile-button-select": "Diuzañ ur restr",
+       "ooui-selectfile-not-supported": "N'eo ket skoret an diuzañ restroù",
+       "ooui-selectfile-placeholder": "N'eus bet diuzet restr ebet",
+       "ooui-selectfile-dragdrop-placeholder": "Lezel ar restr amañ"
 }
index 92015a4..a68c90f 100644 (file)
@@ -29,7 +29,8 @@
                        "SnowedEarth",
                        "Jdforrester",
                        "Wladek92",
-                       "Harmonia Amanda"
+                       "Harmonia Amanda",
+                       "The RedBurn"
                ]
        },
        "ooui-outline-control-move-down": "Descendre l’élément",
@@ -41,7 +42,7 @@
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
        "ooui-dialog-process-error": "Quelque chose s'est mal passé",
-       "ooui-dialog-process-dismiss": "Rejeter",
+       "ooui-dialog-process-dismiss": "Fermer",
        "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
        "ooui-selectfile-button-select": "Sélectionner un fichier",
diff --git a/resources/lib/oojs-ui/i18n/io.json b/resources/lib/oojs-ui/i18n/io.json
new file mode 100644 (file)
index 0000000..7d7b1b8
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Idojc"
+               ]
+       },
+       "ooui-outline-control-move-down": "Movar elemento adsube",
+       "ooui-outline-control-move-up": "Movar elemento adsupere",
+       "ooui-outline-control-remove": "Forigar elemento",
+       "ooui-toolbar-more": "Plu multa",
+       "ooui-toolgroup-expand": "Plu multa",
+       "ooui-toolgroup-collapse": "Min multa",
+       "ooui-dialog-message-accept": "Aplikar",
+       "ooui-dialog-message-reject": "Anular",
+       "ooui-dialog-process-error": "Ulo faliis",
+       "ooui-dialog-process-dismiss": "Celar",
+       "ooui-dialog-process-retry": "Riprobar",
+       "ooui-dialog-process-continue": "Durar",
+       "ooui-selectfile-button-select": "Selektar dokumento",
+       "ooui-selectfile-not-supported": "Dokumento-selekto ne esas suportata",
+       "ooui-selectfile-placeholder": "Nula dokumento selektesis",
+       "ooui-selectfile-dragdrop-placeholder": "Pozar dokumento hike"
+}
index af97d17..722b3e2 100644 (file)
@@ -3,5 +3,21 @@
                "authors": [
                        "Jagwar"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "Hampidina ilay zavatra",
+       "ooui-outline-control-move-up": "Hampiakatra ilay zavatra",
+       "ooui-outline-control-remove": "Hanala iay zavatra",
+       "ooui-toolbar-more": "Be kokoa",
+       "ooui-toolgroup-expand": "Be kokoa",
+       "ooui-toolgroup-collapse": "Kely kokoa",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Avela",
+       "ooui-dialog-process-error": "Nisy hadisoana nitranga",
+       "ooui-dialog-process-dismiss": "Esorina",
+       "ooui-dialog-process-retry": "Andramana indray",
+       "ooui-dialog-process-continue": "Tohizana",
+       "ooui-selectfile-button-select": "Misafidia rakitra iray",
+       "ooui-selectfile-not-supported": "Tsy zaka ny fisafidiana rakitra",
+       "ooui-selectfile-placeholder": "Tsy misy rakitra voafidy",
+       "ooui-selectfile-dragdrop-placeholder": "Hametraka rakitra eto"
 }
index c8fba3d..e3f3e11 100644 (file)
@@ -7,7 +7,13 @@
        },
        "ooui-outline-control-move-down": "Flytt element ned",
        "ooui-outline-control-move-up": "Flytt element opp",
-       "ooui-toolbar-more": "Fleire",
+       "ooui-toolbar-more": "Meir",
+       "ooui-toolgroup-expand": "Meir",
+       "ooui-toolgroup-collapse": "Færre",
+       "ooui-dialog-message-reject": "Bryt av",
+       "ooui-dialog-process-error": "Noko gjekk gale",
+       "ooui-dialog-process-dismiss": "Lat att",
+       "ooui-dialog-process-continue": "Hald fram",
        "ooui-selectfile-button-select": "Vel ei fil",
        "ooui-selectfile-placeholder": "Inga fil er vald"
 }
index 8bd4be8..386871c 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Saanvel"
+                       "Saanvel",
+                       "Abbas dhothar"
                ]
        },
        "ooui-outline-control-move-down": "شیہ تھلے کرو",
@@ -9,6 +10,7 @@
        "ooui-outline-control-remove": "شیہ مٹاؤ",
        "ooui-toolbar-more": "ہور",
        "ooui-toolgroup-expand": "ہور",
+       "ooui-toolgroup-collapse": "گھٹ",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "مکاؤ",
        "ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
index de52812..9d3b926 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Milicevic01",
                        "Nikola Smolenski",
-                       "Милан Јелисавчић"
+                       "Милан Јелисавчић",
+                       "Zoranzoki21"
                ]
        },
        "ooui-outline-control-move-down": "Премести ставку на доле",
@@ -19,5 +20,7 @@
        "ooui-dialog-process-retry": "Покушај поново",
        "ooui-dialog-process-continue": "Настави",
        "ooui-selectfile-button-select": "Изабери датотеку",
-       "ooui-selectfile-placeholder": "Није изабрана ниједна датотека"
+       "ooui-selectfile-not-supported": "Избор датотеке није подржан",
+       "ooui-selectfile-placeholder": "Није изабрана ниједна датотека",
+       "ooui-selectfile-dragdrop-placeholder": "Додајте датотеку овде"
 }
index f206a72..84048e7 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-dialog-process-dismiss": "צומאַכן",
        "ooui-dialog-process-retry": "פרובירט נאכאמאל",
        "ooui-dialog-process-continue": "פֿארזעצן",
+       "ooui-selectfile-button-select": "קלויבט א טעקע",
        "ooui-selectfile-not-supported": "טעקע אויסווייל נישט געשטיצט",
        "ooui-selectfile-placeholder": "קיין טעקע נישט אויסגעוויילט"
 }
index b93d59e..541462f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:26Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
@@ -41,5 +41,3 @@ OO.ui.ApexTheme.prototype.getDialogTransitionDuration = function () {
 OO.ui.theme = new OO.ui.ApexTheme();
 
 }( OO ) );
-
-//# sourceMappingURL=oojs-ui-apex.js.map
\ No newline at end of file
index 2bee712..0818782 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-element-hidden {
   display: none !important;
   /* stylelint-disable-line declaration-no-important */
@@ -19,6 +21,9 @@
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
   cursor: pointer;
   display: inline-block;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
@@ -38,8 +43,8 @@
   cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -64,7 +69,7 @@
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
   border-color: #aaa;
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-left: -0.5em;
   margin-right: -0.5em;
+  display: inline-block;
+  vertical-align: middle;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-right: 0.3em;
           box-sizing: border-box;
   min-height: 3.125em;
 }
+.oo-ui-floatableElement {
+  position: absolute;
+}
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
   background-size: contain;
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.5;
-}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-top .oo-ui-fieldLayout-help,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline .oo-ui-fieldLayout-help {
   margin-top: -0.3em;
@@ -434,10 +440,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.4;
-}
 .oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
   max-width: 50em;
 }
@@ -474,7 +476,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
+  overflow: auto;
   -webkit-transform: translateZ(0);
           transform: translateZ(0);
 }
@@ -489,7 +491,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   padding: 1.25em;
 }
 .oo-ui-panelLayout-framed {
+  border: 1px solid #ccc;
   border-radius: 0.5em;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
   margin: 1em 0;
@@ -650,8 +654,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  /* @noflip */
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -665,9 +667,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values
-                       /* @noflip */
-  left: 0;
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
   background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -686,7 +686,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget-body {
   clear: both;
-  overflow: hidden;
+}
+.oo-ui-popupWidget-body.oo-ui-clippableElement-clippable {
+  min-height: 1em;
 }
 .oo-ui-popupWidget-popup {
   background-color: #fff;
@@ -736,8 +738,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-head > .oo-ui-labelElement-label {
   margin: 0.75em 1em;
 }
+.oo-ui-popupWidget-body {
+  line-height: 1.4;
+}
 .oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
+  margin: 0.75em 1em;
 }
 .oo-ui-popupButtonWidget {
   position: relative;
@@ -745,13 +750,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 0.9375em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
+  margin-left: 0.9375em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 1.2375em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
+  margin-left: 1.2375em;
 }
 .oo-ui-inputWidget {
   margin-right: 0.5em;
@@ -806,7 +809,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
   border-color: rgba(0, 0, 0, 0.2);
-  outline: none;
+  outline: 0;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
   color: #ccc;
@@ -861,14 +864,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   display: block;
   position: absolute;
   top: 0;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -876,24 +875,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
-  left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
-  right: 0;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
   cursor: text;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -901,6 +897,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: block;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+  position: absolute;
+  top: 0;
+}
 .oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
 .oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
@@ -920,14 +931,41 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
      -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
           transition: border-color 250ms ease, box-shadow 250ms ease;
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
   background-color: transparent;
 }
+.oo-ui-textInputWidget input::-webkit-input-placeholder,
+.oo-ui-textInputWidget textarea::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-ms-input-placeholder,
+.oo-ui-textInputWidget textarea:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::-moz-placeholder,
+.oo-ui-textInputWidget textarea::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-moz-placeholder,
+.oo-ui-textInputWidget textarea:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::placeholder,
+.oo-ui-textInputWidget textarea::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
+  outline: 0;
   border-color: #a7dcff;
   box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
 }
@@ -998,6 +1036,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
   opacity: 0;
 }
+.oo-ui-menuSelectWidget.oo-ui-clippableElement-clippable {
+  min-height: 2.6em;
+}
+.oo-ui-menuSelectWidget-invisible {
+  display: none;
+}
 .oo-ui-menuOptionWidget {
   position: relative;
 }
@@ -1043,9 +1087,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1061,20 +1107,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget-handle:hover {
   border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
-  right: 0;
-  margin: 0.775em;
-}
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   line-height: 2.5em;
   margin: 0 0.5em;
 }
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
   color: #ccc;
   text-shadow: 0 1px 1px #fff;
@@ -1116,9 +1160,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-comboBoxInputWidget-dropdownButton > .oo-ui-buttonElement-button {
   display: block;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
   overflow: hidden;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty .oo-ui-comboBoxInputWidget-dropdownButton {
@@ -1129,8 +1170,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   right: 0;
   top: 0;
-  height: 2.5em;
   width: 2.5em;
+  height: 2.5em;
   padding: 0;
 }
 .oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
index 632c085..f468d17 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-element-hidden {
   display: none !important;
   /* stylelint-disable-line declaration-no-important */
@@ -19,6 +21,9 @@
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
   cursor: pointer;
   display: inline-block;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
@@ -38,8 +43,8 @@
   cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -61,9 +66,6 @@
 .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-iconElement-icon {
-  margin-left: 0;
-}
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   margin-right: 0.25em;
   margin-left: 0.46875em;
   padding-left: 2.4em;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  padding: 0.546875em 1em;
-  min-height: 1.25em;
-  min-width: 1em;
-  border-radius: 2px;
   position: relative;
+  min-height: 2.5em;
+  border-radius: 2px;
+  padding: 0.546875em 1em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  min-width: 3.125em;
+}
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  min-width: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
   line-height: 1.25;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: block;
   position: absolute;
-  top: 0.2em;
+  top: 0;
+  height: 100%;
   left: 0.5625em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
           box-sizing: border-box;
   min-height: 3.125em;
 }
+.oo-ui-floatableElement {
+  position: absolute;
+}
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
   background-size: contain;
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.5;
-}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-top .oo-ui-fieldLayout-help,
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline .oo-ui-fieldLayout-help {
   margin-top: -0.3em;
@@ -575,10 +584,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
   z-index: 1;
 }
-.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
-  padding: 0.5em 0.75em;
-  line-height: 1.4;
-}
 .oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-header {
   max-width: 50em;
 }
@@ -615,7 +620,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
+  overflow: auto;
   -webkit-transform: translateZ(0);
           transform: translateZ(0);
 }
@@ -656,7 +661,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-horizontalLayout > .oo-ui-layout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-optionWidget {
   position: relative;
@@ -808,8 +813,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  /* @noflip */
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -823,9 +826,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
-  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values
-                       /* @noflip */
-  left: 0;
+  /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
   background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -844,7 +845,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget-body {
   clear: both;
-  overflow: hidden;
+}
+.oo-ui-popupWidget-body.oo-ui-clippableElement-clippable {
+  min-height: 1em;
 }
 .oo-ui-popupWidget-popup {
   background-color: #fff;
@@ -871,7 +874,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
   bottom: -10px;
   left: -9px;
-  border-bottom-color: #888;
+  border-bottom-color: #a2a9b1;
   border-width: 10px;
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
@@ -894,8 +897,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-head > .oo-ui-labelElement-label {
   margin: 0.75em 1em;
 }
+.oo-ui-popupWidget-body {
+  line-height: 1.4;
+}
 .oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
+  margin: 0.75em 1em;
 }
 .oo-ui-popupButtonWidget {
   position: relative;
@@ -903,13 +909,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 0.9375em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
+  margin-left: 0.9375em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-  /* @noflip */
-  left: 1.5em;
+.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
+  margin-left: 1.5em;
 }
 .oo-ui-inputWidget {
   margin-right: 0.5em;
@@ -1045,17 +1049,23 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget-php {
+  border-right: 1px solid #a2a9b1;
+  border-radius: 2px;
+  overflow-x: hidden;
+}
 .oo-ui-dropdownInputWidget select {
-  background-color: #fff;
-  height: 2.275em;
-  font-size: inherit;
-  font-family: inherit;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding-left: 1em;
+  padding: 0.5em 1em;
+  font-size: inherit;
+  font-family: inherit;
   vertical-align: middle;
 }
 .oo-ui-dropdownInputWidget option {
@@ -1064,14 +1074,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 1.5em;
   padding: 0.5em 1em;
 }
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
+.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;
+          transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active {
+  color: #000;
+  border-color: #72777d;
+}
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+  border-color: #36c;
   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;
   border-color: #c8ccd1;
-  background-color: #eaecf0;
 }
 .oo-ui-radioInputWidget {
   position: relative;
@@ -1226,14 +1264,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   display: block;
   position: absolute;
   top: 0;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1241,24 +1275,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
-  left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
-  right: 0;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator,
-.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-labelElement-label {
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
   cursor: text;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-textInputWidget-type-search > .oo-ui-indicatorElement-indicator {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1266,6 +1297,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: block;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+  right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+  position: absolute;
+  top: 0;
+}
 .oo-ui-textInputWidget-php > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget-php > .oo-ui-indicatorElement-indicator,
 .oo-ui-textInputWidget-php > .oo-ui-labelElement-label {
@@ -1273,20 +1319,20 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
+  margin: 0;
   font-size: inherit;
   font-family: inherit;
   background-color: #fff;
   color: #000;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
+  padding: 0.625em 0.546875em 0.546875em;
 }
 .oo-ui-textInputWidget input {
-  padding: 0.625em 0.546875em 0.546875em;
   line-height: 1.172em;
 }
 .oo-ui-textInputWidget textarea {
-  padding: 0.46875em 0.546875em 0.546875em;
-  line-height: 1.4;
+  line-height: 1.275;
 }
 .oo-ui-textInputWidget .oo-ui-pendingElement-pending {
   background-color: transparent;
@@ -1297,6 +1343,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
      -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
           transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
@@ -1321,22 +1369,36 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #c8ccd1;
   box-shadow: inset 0 0 0 1px #c8ccd1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-ms-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-ms-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-webkit-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :placeholder-shown {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::placeholder {
   color: #72777d;
+  opacity: 1;
+}
+@media screen and (min-width: 0) {
+  .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+    outline: 1px solid #36c;
+    outline-offset: -2px;
+  }
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
@@ -1351,50 +1413,51 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #d33;
   box-shadow: inset 0 0 0 1px #d33;
 }
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
+  background-color: #eaecf0;
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #c8ccd1;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.51;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-left: 2.65625em;
+  padding-left: 2.875em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  max-height: 2.5em;
-  left: 0.46875em;
+  left: 0;
+  max-height: 2.375em;
+  margin-left: 0.5em;
+  background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
   padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  max-height: 2.5em;
-  right: 0.625em;
+  height: 100%;
+  max-height: 2.375em;
+  margin: 0 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   color: #72777d;
-  right: 0.625em;
-  border: 1px solid transparent;
-  border-width: 1px 0;
-  padding: 0.625em 0 0.546875em;
+  margin-top: 1px;
+  padding: 0.625em 0.546875em 0.546875em;
   line-height: 1.172em;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-  right: 2.1875em;
+  margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-  left: 2.65625em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  background-color: #eaecf0;
-  color: #72777d;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #c8ccd1;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.51;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
-  color: #72777d;
-  text-shadow: 0 1px 1px #fff;
+  margin-left: 2.475em;
 }
 .oo-ui-menuSelectWidget {
   position: absolute;
@@ -1413,6 +1476,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   overflow: hidden;
   opacity: 0;
 }
+.oo-ui-menuSelectWidget.oo-ui-clippableElement-clippable {
+  min-height: 2.6em;
+}
+.oo-ui-menuSelectWidget-invisible {
+  display: none;
+}
 .oo-ui-menuOptionWidget {
   position: relative;
   padding: 0.5em 1em;
@@ -1470,9 +1539,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1488,14 +1559,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 2px;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  margin: 0.775em;
+  margin: 0 0.775em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   margin: 0 1em;
@@ -1577,9 +1646,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-comboBoxInputWidget-dropdownButton > .oo-ui-buttonElement-button {
   display: block;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
   overflow: hidden;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty .oo-ui-comboBoxInputWidget-dropdownButton {
@@ -1590,15 +1656,14 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   right: 0;
   top: 0;
-  height: 2.5em;
   width: 2.5em;
+  height: 2.5em;
   padding: 0;
 }
 .oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
   pointer-events: none;
 }
-.oo-ui-comboBoxInputWidget input,
-.oo-ui-comboBoxInputWidget textarea {
+.oo-ui-comboBoxInputWidget input {
   height: 2.5em;
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
@@ -1608,16 +1673,17 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   width: 2.5em;
 }
 .oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button {
+  min-width: 2.5em;
   min-height: 2.5em;
-  padding: 0.546875em;
+  padding-left: 0;
+  padding-right: 0;
 }
 .oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button,
 .oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button:focus {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty textarea {
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input {
   border-right-width: 1px;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
index 5dc78ab..9eb8716 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:26Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
@@ -1072,6 +1072,73 @@ OO.ui.Element.static.getDimensions = function ( el ) {
        }
 };
 
+/**
+ * Get the number of pixels that an element's content is scrolled to the left.
+ *
+ * Adapted from <https://github.com/othree/jquery.rtl-scroll-type>.
+ * Original code copyright 2012 Wei-Ko Kao, licensed under the MIT License.
+ *
+ * This function smooths out browser inconsistencies (nicely described in the README at
+ * <https://github.com/othree/jquery.rtl-scroll-type>) and produces a result consistent
+ * with Firefox's 'scrollLeft', which seems the sanest.
+ *
+ * @static
+ * @method
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {number} Scroll position from the left.
+ *  If the element's direction is LTR, this is a positive number between `0` (initial scroll position)
+ *  and `el.scrollWidth - el.clientWidth` (furthest possible scroll position).
+ *  If the element's direction is RTL, this is a negative number between `0` (initial scroll position)
+ *  and `-el.scrollWidth + el.clientWidth` (furthest possible scroll position).
+ */
+OO.ui.Element.static.getScrollLeft = ( function () {
+       var rtlScrollType = null;
+
+       function test() {
+               var $definer = $( '<div dir="rtl" style="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll">A</div>' ),
+                       definer = $definer[ 0 ];
+
+               $definer.appendTo( 'body' );
+               if ( definer.scrollLeft > 0 ) {
+                       // Safari, Chrome
+                       rtlScrollType = 'default';
+               } else {
+                       definer.scrollLeft = 1;
+                       if ( definer.scrollLeft === 0 ) {
+                               // Firefox, old Opera
+                               rtlScrollType = 'negative';
+                       } else {
+                               // Internet Explorer, Edge
+                               rtlScrollType = 'reverse';
+                       }
+               }
+               $definer.remove();
+       }
+
+       return function getScrollLeft( el ) {
+               var isRoot = el.window === el ||
+                               el === el.ownerDocument.body ||
+                               el === el.ownerDocument.documentElement,
+                       scrollLeft = isRoot ? $( window ).scrollLeft() : el.scrollLeft,
+                       // All browsers use the correct scroll type ('negative') on the root, so don't
+                       // do any fixups when looking at the root element
+                       direction = isRoot ? 'ltr' : $( el ).css( 'direction' );
+
+               if ( direction === 'rtl' ) {
+                       if ( rtlScrollType === null ) {
+                               test();
+                       }
+                       if ( rtlScrollType === 'reverse' ) {
+                               scrollLeft = -scrollLeft;
+                       } else if ( rtlScrollType === 'default' ) {
+                               scrollLeft = scrollLeft - el.scrollWidth + el.clientWidth;
+                       }
+               }
+
+               return scrollLeft;
+       };
+}() );
+
 /**
  * Get scrollable object parent
  *
@@ -1117,7 +1184,8 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
  */
 OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {
        var i, val,
-               // props = [ 'overflow' ] doesn't work due to https://bugzilla.mozilla.org/show_bug.cgi?id=889091
+               // Browsers do not correctly return the computed value of 'overflow' when 'overflow-x' and
+               // 'overflow-y' have different values, so we need to check the separate properties.
                props = [ 'overflow-x', 'overflow-y' ],
                $parent = $( el ).parent();
 
@@ -1132,6 +1200,11 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                i = props.length;
                while ( i-- ) {
                        val = $parent.css( props[ i ] );
+                       // We assume that elements with 'overflow' (in any direction) set to 'hidden' will never be
+                       // scrolled in that direction, but they can actually be scrolled programatically. The user can
+                       // unintentionally perform a scroll in such case even if the application doesn't scroll
+                       // programatically, e.g. when jumping to an anchor, or when using built-in find functionality.
+                       // This could cause funny issues...
                        if ( val === 'auto' || val === 'scroll' ) {
                                return $parent[ 0 ];
                        }
@@ -2922,17 +2995,6 @@ OO.ui.mixin.LabelElement.prototype.getLabel = function () {
        return this.label;
 };
 
-/**
- * Fit the label.
- *
- * @chainable
- * @deprecated since 0.16.0
- */
-OO.ui.mixin.LabelElement.prototype.fitLabel = function () {
-       OO.ui.warnDeprecation( 'LabelElement#fitLabel: This is a deprecated no-op.' );
-       return this;
-};
-
 /**
  * Set the content of the label.
  *
@@ -3474,6 +3536,7 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
 /* Static Properties */
 
 /**
+ * @static
  * @inheritdoc
  */
 OO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;
@@ -3708,6 +3771,10 @@ OO.mixinClass( OO.ui.IconWidget, OO.ui.mixin.FlaggedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.IconWidget.static.tagName = 'span';
 
 /**
@@ -3761,6 +3828,10 @@ OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.IndicatorWidget.static.tagName = 'span';
 
 /**
@@ -3816,12 +3887,17 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
        // Properties
        this.input = config.input;
 
-       // Events
+       // Initialization
        if ( this.input instanceof OO.ui.InputWidget ) {
-               this.$element.on( 'click', this.onClick.bind( this ) );
+               if ( this.input.getInputId() ) {
+                       this.$element.attr( 'for', this.input.getInputId() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.fieldWidget.focus();
+                               return false;
+                       }.bind( this ) );
+               }
        }
-
-       // Initialization
        this.$element.addClass( 'oo-ui-labelWidget' );
 };
 
@@ -3833,20 +3909,11 @@ OO.mixinClass( OO.ui.LabelWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
-OO.ui.LabelWidget.static.tagName = 'span';
-
-/* Methods */
-
 /**
- * Handles label mouse click events.
- *
- * @private
- * @param {jQuery.Event} e Mouse click event
+ * @static
+ * @inheritdoc
  */
-OO.ui.LabelWidget.prototype.onClick = function () {
-       this.input.simulateLabelClick();
-       return false;
-};
+OO.ui.LabelWidget.static.tagName = 'label';
 
 /**
  * PendingElement is a mixin that is used to create elements that notify users that something is happening
@@ -3864,6 +3931,7 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  *     }
  *     OO.inheritClass( MessageDialog, OO.ui.MessageDialog );
  *
+ *     MessageDialog.static.name = 'myMessageDialog';
  *     MessageDialog.static.actions = [
  *         { action: 'save', label: 'Done', flags: 'primary' },
  *         { label: 'Cancel', flags: 'safe' }
@@ -3980,6 +4048,380 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
        return this;
 };
 
+/**
+ * Element that will stick adjacent to a specified container, even when it is inserted elsewhere
+ * in the document (for example, in an OO.ui.Window's $overlay).
+ *
+ * The elements's position is automatically calculated and maintained when window is resized or the
+ * page is scrolled. If you reposition the container manually, you have to call #position to make
+ * sure the element is still placed correctly.
+ *
+ * As positioning is only possible when both the element and the container are attached to the DOM
+ * and visible, it's only done after you call #togglePositioning. You might want to do this inside
+ * the #toggle method to display a floating popup, for example.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
+ * @cfg {jQuery} [$floatableContainer] Node to position adjacent to
+ * @cfg {string} [verticalPosition='below'] Where to position $floatable vertically:
+ *  'below': Directly below $floatableContainer, aligning f's top edge with fC's bottom edge
+ *  'above': Directly above $floatableContainer, aligning f's bottom edge with fC's top edge
+ *  'top': Align the top edge with $floatableContainer's top edge
+ *  'bottom': Align the bottom edge with $floatableContainer's bottom edge
+ *  'center': Vertically align the center with $floatableContainer's center
+ * @cfg {string} [horizontalPosition='start'] Where to position $floatable horizontally:
+ *  'before': Directly before $floatableContainer, aligning f's end edge with fC's start edge
+ *  'after': Directly after $floatableContainer, algining f's start edge with fC's end edge
+ *  'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge
+ *  'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge
+ *  'center': Horizontally align the center with $floatableContainer's center
+ */
+OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$floatable = null;
+       this.$floatableContainer = null;
+       this.$floatableWindow = null;
+       this.$floatableClosestScrollable = null;
+       this.onFloatableScrollHandler = this.position.bind( this );
+       this.onFloatableWindowResizeHandler = this.position.bind( this );
+
+       // Initialization
+       this.setFloatableContainer( config.$floatableContainer );
+       this.setFloatableElement( config.$floatable || this.$element );
+       this.setVerticalPosition( config.verticalPosition || 'below' );
+       this.setHorizontalPosition( config.horizontalPosition || 'start' );
+};
+
+/* Methods */
+
+/**
+ * Set floatable element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $floatable Element to make floatable
+ */
+OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatable ) {
+       if ( this.$floatable ) {
+               this.$floatable.removeClass( 'oo-ui-floatableElement-floatable' );
+               this.$floatable.css( { left: '', top: '' } );
+       }
+
+       this.$floatable = $floatable.addClass( 'oo-ui-floatableElement-floatable' );
+       this.position();
+};
+
+/**
+ * Set floatable container.
+ *
+ * The element will be positioned relative to the specified container.
+ *
+ * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
+ */
+OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {
+       this.$floatableContainer = $floatableContainer;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
+
+/**
+ * Change how the element is positioned vertically.
+ *
+ * @param {string} position 'below', 'above', 'top', 'bottom' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position ) {
+       if ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for vertical position: ' + position );
+       }
+       this.verticalPosition = position;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
+
+/**
+ * Change how the element is positioned horizontally.
+ *
+ * @param {string} position 'before', 'after', 'start', 'end' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( position ) {
+       if ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for horizontal position: ' + position );
+       }
+       this.horizontalPosition = position;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
+
+/**
+ * Toggle positioning.
+ *
+ * Do not turn positioning on until after the element is attached to the DOM and visible.
+ *
+ * @param {boolean} [positioning] Enable positioning, omit to toggle
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
+       var closestScrollableOfContainer;
+
+       if ( !this.$floatable || !this.$floatableContainer ) {
+               return this;
+       }
+
+       positioning = positioning === undefined ? !this.positioning : !!positioning;
+
+       if ( positioning && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'FloatableElement#togglePositioning: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
+       if ( this.positioning !== positioning ) {
+               this.positioning = positioning;
+
+               this.needsCustomPosition =
+                       this.verticalPostion !== 'below' ||
+                       this.horizontalPosition !== 'start' ||
+                       !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
+
+               closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
+               // If the scrollable is the root, we have to listen to scroll events
+               // on the window because of browser inconsistencies.
+               if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
+                       closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
+               }
+
+               if ( positioning ) {
+                       this.$floatableWindow = $( this.getElementWindow() );
+                       this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
+
+                       this.$floatableClosestScrollable = $( closestScrollableOfContainer );
+                       this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
+
+                       // Initial position after visible
+                       this.position();
+               } else {
+                       if ( this.$floatableWindow ) {
+                               this.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );
+                               this.$floatableWindow = null;
+                       }
+
+                       if ( this.$floatableClosestScrollable ) {
+                               this.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );
+                               this.$floatableClosestScrollable = null;
+                       }
+
+                       this.$floatable.css( { left: '', right: '', top: '' } );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Check whether the bottom edge of the given element is within the viewport of the given container.
+ *
+ * @private
+ * @param {jQuery} $element
+ * @param {jQuery} $container
+ * @return {boolean}
+ */
+OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
+       var elemRect, contRect, topEdgeInBounds, bottomEdgeInBounds, leftEdgeInBounds, rightEdgeInBounds,
+               startEdgeInBounds, endEdgeInBounds,
+               direction = $element.css( 'direction' );
+
+       elemRect = $element[ 0 ].getBoundingClientRect();
+       if ( $container[ 0 ] === window ) {
+               contRect = {
+                       top: 0,
+                       left: 0,
+                       right: document.documentElement.clientWidth,
+                       bottom: document.documentElement.clientHeight
+               };
+       } else {
+               contRect = $container[ 0 ].getBoundingClientRect();
+       }
+
+       topEdgeInBounds = elemRect.top >= contRect.top && elemRect.top <= contRect.bottom;
+       bottomEdgeInBounds = elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom;
+       leftEdgeInBounds = elemRect.left >= contRect.left && elemRect.left <= contRect.right;
+       rightEdgeInBounds = elemRect.right >= contRect.left && elemRect.right <= contRect.right;
+       if ( direction === 'rtl' ) {
+               startEdgeInBounds = rightEdgeInBounds;
+               endEdgeInBounds = leftEdgeInBounds;
+       } else {
+               startEdgeInBounds = leftEdgeInBounds;
+               endEdgeInBounds = rightEdgeInBounds;
+       }
+
+       if ( this.verticalPosition === 'below' && !bottomEdgeInBounds ) {
+               return false;
+       }
+       if ( this.verticalPosition === 'above' && !topEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'before' && !startEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'after' && !endEdgeInBounds ) {
+               return false;
+       }
+
+       // The other positioning values are all about being inside the container,
+       // so in those cases all we care about is that any part of the container is visible.
+       return elemRect.top <= contRect.bottom && elemRect.bottom >= contRect.top &&
+               elemRect.left <= contRect.right && elemRect.right >= contRect.left;
+};
+
+/**
+ * Position the floatable below its container.
+ *
+ * This should only be done when both of them are attached to the DOM and visible.
+ *
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.position = function () {
+       var containerPos, direction, $offsetParent, isBody, scrollableX, scrollableY,
+               horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
+               newPos = { top: '', left: '', bottom: '', right: '' };
+
+       if ( !this.positioning ) {
+               return this;
+       }
+
+       if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
+               this.$floatable.addClass( 'oo-ui-element-hidden' );
+               return;
+       } else {
+               this.$floatable.removeClass( 'oo-ui-element-hidden' );
+       }
+
+       if ( !this.needsCustomPosition ) {
+               return;
+       }
+
+       direction = this.$floatableContainer.css( 'direction' );
+       $offsetParent = this.$floatable.offsetParent();
+       if ( $offsetParent.is( 'html' ) ) {
+               // The innerHeight/Width and clientHeight/Width calculations don't work well on the
+               // <html> element, but they do work on the <body>
+               $offsetParent = $( $offsetParent[ 0 ].ownerDocument.body );
+       }
+       isBody = $offsetParent.is( 'body' );
+       scrollableX = $offsetParent.css( 'overflow-x' ) === 'scroll' || $offsetParent.css( 'overflow-x' ) === 'auto';
+       scrollableY = $offsetParent.css( 'overflow-y' ) === 'scroll' || $offsetParent.css( 'overflow-y' ) === 'auto';
+
+       vertScrollbarWidth = $offsetParent.innerWidth() - $offsetParent.prop( 'clientWidth' );
+       horizScrollbarHeight = $offsetParent.innerHeight() - $offsetParent.prop( 'clientHeight' );
+       // We don't need to compute and add scrollTop and scrollLeft if the scrollable container is the body,
+       // or if it isn't scrollable
+       scrollTop = scrollableY && !isBody ? $offsetParent.scrollTop() : 0;
+       scrollLeft = scrollableX && !isBody ? OO.ui.Element.static.getScrollLeft( $offsetParent[ 0 ] ) : 0;
+
+       // Avoid passing the <body> to getRelativePosition(), because it won't return what we expect
+       // if the <body> has a margin
+       containerPos = isBody ?
+               this.$floatableContainer.offset() :
+               OO.ui.Element.static.getRelativePosition( this.$floatableContainer, $offsetParent );
+       containerPos.bottom = containerPos.top + this.$floatableContainer.outerHeight();
+       containerPos.right = containerPos.left + this.$floatableContainer.outerWidth();
+       containerPos.start = direction === 'rtl' ? containerPos.right : containerPos.left;
+       containerPos.end = direction === 'rtl' ? containerPos.left : containerPos.right;
+
+       if ( this.verticalPosition === 'below' ) {
+               newPos.top = containerPos.bottom;
+       } else if ( this.verticalPosition === 'above' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.top;
+       } else if ( this.verticalPosition === 'top' ) {
+               newPos.top = containerPos.top;
+       } else if ( this.verticalPosition === 'bottom' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.bottom;
+       } else if ( this.verticalPosition === 'center' ) {
+               newPos.top = containerPos.top +
+                       ( this.$floatableContainer.height() - this.$floatable.height() ) / 2;
+       }
+
+       if ( this.horizontalPosition === 'before' ) {
+               newPos.end = containerPos.start;
+       } else if ( this.horizontalPosition === 'after' ) {
+               newPos.start = containerPos.end;
+       } else if ( this.horizontalPosition === 'start' ) {
+               newPos.start = containerPos.start;
+       } else if ( this.horizontalPosition === 'end' ) {
+               newPos.end = containerPos.end;
+       } else if ( this.horizontalPosition === 'center' ) {
+               newPos.left = containerPos.left +
+                       ( this.$floatableContainer.width() - this.$floatable.width() ) / 2;
+       }
+
+       if ( newPos.start !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.start;
+               } else {
+                       newPos.left = newPos.start;
+               }
+               delete newPos.start;
+       }
+       if ( newPos.end !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.left = newPos.end;
+               } else {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.end;
+               }
+               delete newPos.end;
+       }
+
+       // Account for scroll position
+       if ( newPos.top !== '' ) {
+               newPos.top += scrollTop;
+       }
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= scrollTop;
+       }
+       if ( newPos.left !== '' ) {
+               newPos.left += scrollLeft;
+       }
+       if ( newPos.right !== '' ) {
+               newPos.right -= scrollLeft;
+       }
+
+       // Account for scrollbar gutter
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= horizScrollbarHeight;
+       }
+       if ( direction === 'rtl' ) {
+               if ( newPos.left !== '' ) {
+                       newPos.left -= vertScrollbarWidth;
+               }
+       } else {
+               if ( newPos.right !== '' ) {
+                       newPos.right -= vertScrollbarWidth;
+               }
+       }
+
+       this.$floatable.css( newPos );
+
+       // We updated the position, so re-evaluate the clipping state.
+       // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
+       // will not notice the need to update itself.)
+       // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
+       // it not listen to the right events in the right places?
+       if ( this.clip ) {
+               this.clip();
+       }
+
+       return this;
+};
+
 /**
  * Element that can be automatically clipped to visible boundaries.
  *
@@ -4076,6 +4518,11 @@ OO.ui.mixin.ClippableElement.prototype.setClippableContainer = function ( $clipp
 OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
        clipping = clipping === undefined ? !this.clipping : !!clipping;
 
+       if ( clipping && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'ClippableElement#toggleClipping: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        if ( this.clipping !== clipping ) {
                this.clipping = clipping;
                if ( clipping ) {
@@ -4223,8 +4670,11 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        clipHeight = allotedHeight < naturalHeight;
 
        if ( clipWidth ) {
+               // The order matters here. If overflow is not set first, Chrome displays bogus scrollbars. (T157672)
+               // Forcing a reflow is a smaller workaround than calling reconsiderScrollbars() for this case.
+               this.$clippable.css( 'overflowX', 'scroll' );
+               void this.$clippable[ 0 ].offsetHeight; // Force reflow
                this.$clippable.css( {
-                       overflowX: 'scroll',
                        width: Math.max( 0, allotedWidth ),
                        maxWidth: ''
                } );
@@ -4236,8 +4686,11 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
                } );
        }
        if ( clipHeight ) {
+               // The order matters here. If overflow is not set first, Chrome displays bogus scrollbars. (T157672)
+               // Forcing a reflow is a smaller workaround than calling reconsiderScrollbars() for this case.
+               this.$clippable.css( 'overflowY', 'scroll' );
+               void this.$clippable[ 0 ].offsetHeight; // Force reflow
                this.$clippable.css( {
-                       overflowY: 'scroll',
                        height: Math.max( 0, allotedHeight ),
                        maxHeight: ''
                } );
@@ -4265,6 +4718,8 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * By default, each popup has an anchor that points toward its origin.
  * Please see the [OOjs UI documentation on Mediawiki] [1] for more information and examples.
  *
+ * Unlike most widgets, PopupWidget is initially hidden and must be shown by calling #toggle.
+ *
  *     @example
  *     // A popup widget.
  *     var popup = new OO.ui.PopupWidget( {
@@ -4283,6 +4738,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.ClippableElement
+ * @mixins OO.ui.mixin.FloatableElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -4328,6 +4784,7 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
                $clippable: this.$body,
                $clippableContainer: this.$popup
        } ) );
+       OO.ui.mixin.FloatableElement.call( this, config );
 
        // Properties
        this.$anchor = $( '<div>' );
@@ -4392,6 +4849,7 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
 OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
 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 );
 
 /* Methods */
 
@@ -4503,6 +4961,14 @@ OO.ui.PopupWidget.prototype.hasAnchor = function () {
 };
 
 /**
+ * Toggle visibility of the popup. The popup is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the popup while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * 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.
+ *
  * @inheritdoc
  */
 OO.ui.PopupWidget.prototype.toggle = function ( show ) {
@@ -4511,10 +4977,17 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
 
        change = show !== this.isVisible();
 
+       if ( show && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        // Parent method
        OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
 
        if ( change ) {
+               this.togglePositioning( show && !!this.$floatableContainer );
+
                if ( show ) {
                        if ( this.autoClose ) {
                                this.bindMouseDownListener();
@@ -4563,14 +5036,27 @@ OO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {
  */
 OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        var popupOffset, originOffset, containerLeft, containerWidth, containerRight,
-               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth,
-               align = this.align,
+               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth, direction,
+               dirFactor, align,
+               alignMap = {
+                       ltr: {
+                               'force-left': 'backwards',
+                               'force-right': 'forwards'
+                       },
+                       rtl: {
+                               'force-left': 'forwards',
+                               'force-right': 'backwards'
+                       }
+               },
                widget = this;
 
        if ( !this.$container ) {
                // Lazy-initialize $container if not specified in constructor
                this.$container = $( this.getClosestScrollableElementContainer() );
        }
+       direction = this.$container.css( 'direction' );
+       dirFactor = direction === 'rtl' ? -1 : 1;
+       align = alignMap[ direction ][ this.align ] || this.align;
 
        // Set height and width before measuring things, since it might cause our measurements
        // to change (e.g. due to scrollbars appearing or disappearing)
@@ -4579,34 +5065,24 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                height: this.height !== null ? this.height : 'auto'
        } );
 
-       // If we are in RTL, we need to flip the alignment, unless it is center
-       if ( align === 'forwards' || align === 'backwards' ) {
-               if ( this.$container.css( 'direction' ) === 'rtl' ) {
-                       align = ( { forwards: 'force-left', backwards: 'force-right' } )[ this.align ];
-               } else {
-                       align = ( { forwards: 'force-right', backwards: 'force-left' } )[ this.align ];
-               }
-
-       }
-
        // Compute initial popupOffset based on alignment
-       popupOffset = this.width * ( { 'force-left': -1, center: -0.5, 'force-right': 0 } )[ align ];
+       popupOffset = this.width * ( { backwards: -1, center: -0.5, forwards: 0 } )[ align ];
 
        // Figure out if this will cause the popup to go beyond the edge of the container
        originOffset = this.$element.offset().left;
        containerLeft = this.$container.offset().left;
        containerWidth = this.$container.innerWidth();
        containerRight = containerLeft + containerWidth;
-       popupLeft = popupOffset - this.containerPadding;
-       popupRight = popupOffset + this.containerPadding + this.width + this.containerPadding;
+       popupLeft = dirFactor * popupOffset - this.containerPadding;
+       popupRight = dirFactor * popupOffset + this.containerPadding + this.width + this.containerPadding;
        overlapLeft = ( originOffset + popupLeft ) - containerLeft;
        overlapRight = containerRight - ( originOffset + popupRight );
 
        // Adjust offset to make the popup not go beyond the edge, if needed
        if ( overlapRight < 0 ) {
-               popupOffset += overlapRight;
+               popupOffset += dirFactor * overlapRight;
        } else if ( overlapLeft < 0 ) {
-               popupOffset -= overlapLeft;
+               popupOffset -= dirFactor * overlapLeft;
        }
 
        // Adjust offset to avoid anchor being rendered too close to the edge
@@ -4627,7 +5103,7 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
        }
 
        // Position body relative to anchor
-       this.$popup.css( 'margin-left', popupOffset );
+       this.$popup.css( direction === 'rtl' ? 'margin-right' : 'margin-left', popupOffset );
 
        if ( transition ) {
                // Prevent transitioning after transition is complete
@@ -4737,13 +5213,23 @@ OO.ui.mixin.PopupElement.prototype.getPopup = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$overlay] Render the popup into a separate layer. This configuration is useful in cases where
+ *  the expanded popup is larger than its containing `<div>`. The specified overlay layer is usually on top of the
+ *  containing `<div>` and has a larger area. By default, the popup uses relative positioning.
  */
 OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Parent constructor
        OO.ui.PopupButtonWidget.parent.call( this, config );
 
        // Mixin constructors
-       OO.ui.mixin.PopupElement.call( this, config );
+       OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
+               popup: {
+                       $floatableContainer: this.$element
+               }
+       } ) );
+
+       // Properties
+       this.$overlay = config.$overlay || this.$element;
 
        // Events
        this.connect( this, { click: 'onAction' } );
@@ -4751,8 +5237,12 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Initialization
        this.$element
                .addClass( 'oo-ui-popupButtonWidget' )
-               .attr( 'aria-haspopup', 'true' )
-               .append( this.popup.$element );
+               .attr( 'aria-haspopup', 'true' );
+       this.popup.$element
+               .addClass( 'oo-ui-popupButtonWidget-popup' )
+               .toggleClass( 'oo-ui-popupButtonWidget-framed-popup', this.isFramed() )
+               .toggleClass( 'oo-ui-popupButtonWidget-frameless-popup', !this.isFramed() );
+       this.$overlay.append( this.popup.$element );
 };
 
 /* Setup */
@@ -4926,12 +5416,40 @@ OO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
+/**
+ * Whether this option can be selected. See #setSelected.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.selectable = true;
 
+/**
+ * Whether this option can be highlighted. See #setHighlighted.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.highlightable = true;
 
+/**
+ * Whether this option can be pressed. See #setPressed.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.pressable = true;
 
+/**
+ * Whether this option will be scrolled into view when it is selected.
+ *
+ * @static
+ * @inheritable
+ * @property {boolean}
+ */
 OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;
 
 /* Methods */
@@ -5054,6 +5572,19 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
        return this;
 };
 
+/**
+ * Get text to match search strings against.
+ *
+ * The default implementation returns the label text, but subclasses
+ * can override this to provide more complex behavior.
+ *
+ * @return {string|boolean} String to match search string against
+ */
+OO.ui.OptionWidget.prototype.getMatchText = function () {
+       var label = this.getLabel();
+       return typeof label === 'string' ? label : this.$label.text();
+};
+
 /**
  * A SelectWidget is of a generic selection of options. The OOjs UI library contains several types of
  * select widgets, including {@link OO.ui.ButtonSelectWidget button selects},
@@ -5498,7 +6029,7 @@ OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
  * @protected
  * @param {string} s String to match against items
  * @param {boolean} [exact=false] Only accept exact matches
- * @return {Function} function ( OO.ui.OptionItem ) => boolean
+ * @return {Function} function ( OO.ui.OptionWidget ) => boolean
  */
 OO.ui.SelectWidget.prototype.getItemMatcher = function ( s, exact ) {
        var re;
@@ -5513,14 +6044,11 @@ OO.ui.SelectWidget.prototype.getItemMatcher = function ( s, exact ) {
        }
        re = new RegExp( re, 'i' );
        return function ( item ) {
-               var l = item.getLabel();
-               if ( typeof l !== 'string' ) {
-                       l = item.$label.text();
-               }
-               if ( l.normalize ) {
-                       l = l.normalize();
+               var matchText = item.getMatchText();
+               if ( matchText.normalize ) {
+                       matchText = matchText.normalize();
                }
-               return re.test( l );
+               return re.test( matchText );
        };
 };
 
@@ -6004,6 +6532,10 @@ OO.inheritClass( OO.ui.MenuOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;
 
 /**
@@ -6057,8 +6589,16 @@ OO.inheritClass( OO.ui.MenuSectionOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuSectionOptionWidget.static.selectable = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuSectionOptionWidget.static.highlightable = false;
 
 /**
@@ -6079,6 +6619,8 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  * - Down-arrow key: highlight the next menu option
  * - Esc key: hide the menu
  *
+ * Unlike most widgets, MenuSelectWidget is initially hidden and must be shown by calling #toggle.
+ *
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
@@ -6098,6 +6640,7 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
  *  that button, unless the button (or its parent widget) is passed in here.
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
+ * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.
  * @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input
  */
 OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
@@ -6112,6 +6655,7 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
 
        // Properties
        this.autoHide = config.autoHide === undefined || !!config.autoHide;
+       this.hideOnChoose = config.hideOnChoose === undefined || !!config.hideOnChoose;
        this.filterFromInput = !!config.filterFromInput;
        this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
@@ -6192,7 +6736,8 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
  * @protected
  */
 OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
-       var i, item,
+       var i, item, visible,
+               anyVisible = false,
                len = this.items.length,
                showAll = !this.isVisible(),
                filter = showAll ? null : this.getItemMatcher( this.$input.val() );
@@ -6200,10 +6745,14 @@ OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
        for ( i = 0; i < len; i++ ) {
                item = this.items[ i ];
                if ( item instanceof OO.ui.OptionWidget ) {
-                       item.toggle( showAll || filter( item ) );
+                       visible = showAll || filter( item );
+                       anyVisible = anyVisible || visible;
+                       item.toggle( visible );
                }
        }
 
+       this.$element.toggleClass( 'oo-ui-menuSelectWidget-invisible', !anyVisible );
+
        // Reevaluate clipping
        this.clip();
 };
@@ -6260,7 +6809,7 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
 /**
  * Choose an item.
  *
- * When a user chooses an item, the menu is closed.
+ * When a user chooses an item, the menu is closed, unless the hideOnChoose config option is set to false.
  *
  * Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard
  * or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.
@@ -6270,7 +6819,9 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
  */
 OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
        OO.ui.MenuSelectWidget.parent.prototype.chooseItem.call( this, item );
-       this.toggle( false );
+       if ( this.hideOnChoose ) {
+               this.toggle( false );
+       }
        return this;
 };
 
@@ -6314,6 +6865,14 @@ OO.ui.MenuSelectWidget.prototype.clearItems = function () {
 };
 
 /**
+ * Toggle visibility of the menu. The menu is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the menu while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * 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.
+ *
  * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
@@ -6322,6 +6881,11 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
        change = visible !== this.isVisible();
 
+       if ( visible && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'MenuSelectWidget#toggle: Before calling this method, the menu must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        // Parent method
        OO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );
 
@@ -6586,12 +7150,28 @@ OO.inheritClass( OO.ui.RadioOptionWidget, OO.ui.OptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.highlightable = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.scrollIntoViewOnSelect = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.pressable = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioOptionWidget.static.tagName = 'label';
 
 /* Methods */
@@ -6921,6 +7501,10 @@ OO.inheritClass( OO.ui.CheckboxMultioptionWidget, OO.ui.MultioptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.CheckboxMultioptionWidget.static.tagName = 'label';
 
 /* Methods */
@@ -7120,213 +7704,6 @@ OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
        }
 };
 
-/**
- * Element that will stick under a specified container, even when it is inserted elsewhere in the
- * document (for example, in a OO.ui.Window's $overlay).
- *
- * The elements's position is automatically calculated and maintained when window is resized or the
- * page is scrolled. If you reposition the container manually, you have to call #position to make
- * sure the element is still placed correctly.
- *
- * As positioning is only possible when both the element and the container are attached to the DOM
- * and visible, it's only done after you call #togglePositioning. You might want to do this inside
- * the #toggle method to display a floating popup, for example.
- *
- * @abstract
- * @class
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
- * @cfg {jQuery} [$floatableContainer] Node to position below
- */
-OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
-       // Configuration initialization
-       config = config || {};
-
-       // Properties
-       this.$floatable = null;
-       this.$floatableContainer = null;
-       this.$floatableWindow = null;
-       this.$floatableClosestScrollable = null;
-       this.onFloatableScrollHandler = this.position.bind( this );
-       this.onFloatableWindowResizeHandler = this.position.bind( this );
-
-       // Initialization
-       this.setFloatableContainer( config.$floatableContainer );
-       this.setFloatableElement( config.$floatable || this.$element );
-};
-
-/* Methods */
-
-/**
- * Set floatable element.
- *
- * If an element is already set, it will be cleaned up before setting up the new element.
- *
- * @param {jQuery} $floatable Element to make floatable
- */
-OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatable ) {
-       if ( this.$floatable ) {
-               this.$floatable.removeClass( 'oo-ui-floatableElement-floatable' );
-               this.$floatable.css( { left: '', top: '' } );
-       }
-
-       this.$floatable = $floatable.addClass( 'oo-ui-floatableElement-floatable' );
-       this.position();
-};
-
-/**
- * Set floatable container.
- *
- * The element will be always positioned under the specified container.
- *
- * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
- */
-OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {
-       this.$floatableContainer = $floatableContainer;
-       if ( this.$floatable ) {
-               this.position();
-       }
-};
-
-/**
- * Toggle positioning.
- *
- * Do not turn positioning on until after the element is attached to the DOM and visible.
- *
- * @param {boolean} [positioning] Enable positioning, omit to toggle
- * @chainable
- */
-OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
-       var closestScrollableOfContainer, closestScrollableOfFloatable;
-
-       positioning = positioning === undefined ? !this.positioning : !!positioning;
-
-       if ( this.positioning !== positioning ) {
-               this.positioning = positioning;
-
-               closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
-               closestScrollableOfFloatable = OO.ui.Element.static.getClosestScrollableContainer( this.$floatable[ 0 ] );
-               this.needsCustomPosition = closestScrollableOfContainer !== closestScrollableOfFloatable;
-               // If the scrollable is the root, we have to listen to scroll events
-               // on the window because of browser inconsistencies.
-               if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
-                       closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
-               }
-
-               if ( positioning ) {
-                       this.$floatableWindow = $( this.getElementWindow() );
-                       this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
-
-                       this.$floatableClosestScrollable = $( closestScrollableOfContainer );
-                       this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
-
-                       // Initial position after visible
-                       this.position();
-               } else {
-                       if ( this.$floatableWindow ) {
-                               this.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );
-                               this.$floatableWindow = null;
-                       }
-
-                       if ( this.$floatableClosestScrollable ) {
-                               this.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );
-                               this.$floatableClosestScrollable = null;
-                       }
-
-                       this.$floatable.css( { left: '', top: '' } );
-               }
-       }
-
-       return this;
-};
-
-/**
- * Check whether the bottom edge of the given element is within the viewport of the given container.
- *
- * @private
- * @param {jQuery} $element
- * @param {jQuery} $container
- * @return {boolean}
- */
-OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
-       var elemRect, contRect,
-               leftEdgeInBounds = false,
-               bottomEdgeInBounds = false,
-               rightEdgeInBounds = false;
-
-       elemRect = $element[ 0 ].getBoundingClientRect();
-       if ( $container[ 0 ] === window ) {
-               contRect = {
-                       top: 0,
-                       left: 0,
-                       right: document.documentElement.clientWidth,
-                       bottom: document.documentElement.clientHeight
-               };
-       } else {
-               contRect = $container[ 0 ].getBoundingClientRect();
-       }
-
-       // For completeness, if we still cared about topEdgeInBounds, that'd be:
-       // elemRect.top >= contRect.top && elemRect.top <= contRect.bottom
-       if ( elemRect.left >= contRect.left && elemRect.left <= contRect.right ) {
-               leftEdgeInBounds = true;
-       }
-       if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
-               bottomEdgeInBounds = true;
-       }
-       if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
-               rightEdgeInBounds = true;
-       }
-
-       // We only care that any part of the bottom edge is visible
-       return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
-};
-
-/**
- * Position the floatable below its container.
- *
- * This should only be done when both of them are attached to the DOM and visible.
- *
- * @chainable
- */
-OO.ui.mixin.FloatableElement.prototype.position = function () {
-       var pos;
-
-       if ( !this.positioning ) {
-               return this;
-       }
-
-       if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
-               this.$floatable.addClass( 'oo-ui-element-hidden' );
-               return;
-       } else {
-               this.$floatable.removeClass( 'oo-ui-element-hidden' );
-       }
-
-       if ( !this.needsCustomPosition ) {
-               return;
-       }
-
-       pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
-
-       // Position under container
-       pos.top += this.$floatableContainer.height();
-       this.$floatable.css( pos );
-
-       // We updated the position, so re-evaluate the clipping state.
-       // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
-       // will not notice the need to update itself.)
-       // TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does
-       // it not listen to the right events in the right places?
-       if ( this.clip ) {
-               this.clip();
-       }
-
-       return this;
-};
-
 /**
  * FloatingMenuSelectWidget is a menu that will stick under a specified
  * container, even when it is inserted elsewhere in the document (for example,
@@ -7488,6 +7865,10 @@ OO.inheritClass( OO.ui.ProgressBarWidget, OO.ui.Widget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ProgressBarWidget.static.tagName = 'div';
 
 /* Methods */
@@ -7589,6 +7970,10 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
 /* Static Methods */
@@ -7642,6 +8027,25 @@ OO.ui.InputWidget.prototype.getInputElement = function () {
        return $( '<input>' );
 };
 
+/**
+ * Get input element's ID.
+ *
+ * If the element already has an ID then that is returned, otherwise unique ID is
+ * generated, set on the element, and returned.
+ *
+ * @return {string} The ID of the element
+ */
+OO.ui.InputWidget.prototype.getInputId = function () {
+       var id = this.$input.attr( 'id' );
+
+       if ( id === undefined ) {
+               id = OO.ui.generateElementId();
+               this.$input.attr( 'id', id );
+       }
+
+       return id;
+};
+
 /**
  * Handle potentially value-changing events.
  *
@@ -7730,6 +8134,7 @@ OO.ui.InputWidget.prototype.cleanUpValue = function ( value ) {
  * called directly.
  */
 OO.ui.InputWidget.prototype.simulateLabelClick = function () {
+       OO.ui.warnDeprecation( 'InputWidget: simulateLabelClick() is deprecated.' );
        if ( !this.isDisabled() ) {
                if ( this.$input.is( ':checkbox, :radio' ) ) {
                        this.$input.click();
@@ -7861,6 +8266,9 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );
 /**
  * Disable generating `<label>` elements for buttons. One would very rarely need additional label
  * for a button, and it's already a big clickable target, and it causes unexpected rendering.
+ *
+ * @static
+ * @inheritdoc
  */
 OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
 
@@ -8384,6 +8792,10 @@ OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
 
 /* Static Methods */
@@ -8507,7 +8919,7 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: …, disabled: … }`
  */
 OO.ui.CheckboxMultiselectInputWidget = function OoUiCheckboxMultiselectInputWidget( config ) {
        // Configuration initialization
@@ -8539,6 +8951,10 @@ OO.inheritClass( OO.ui.CheckboxMultiselectInputWidget, OO.ui.InputWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.CheckboxMultiselectInputWidget.static.supportsSimpleLabel = false;
 
 /* Static Methods */
@@ -8632,7 +9048,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setDisabled = function ( state )
 /**
  * Set the options available for this input.
  *
- * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`
+ * @param {Object[]} options Array of menu options in the format `{ data: …, label: …, disabled: … }`
  * @chainable
  */
 OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options ) {
@@ -8642,12 +9058,14 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
        this.checkboxMultiselectWidget
                .clearItems()
                .addItems( options.map( function ( opt ) {
-                       var optValue, item;
+                       var optValue, item, optDisabled;
                        optValue =
                                OO.ui.CheckboxMultiselectInputWidget.parent.prototype.cleanUpValue.call( widget, opt.data );
+                       optDisabled = opt.disabled !== undefined ? opt.disabled : false;
                        item = new OO.ui.CheckboxMultioptionWidget( {
                                data: optValue,
-                               label: opt.label !== undefined ? opt.label : optValue
+                               label: opt.label !== undefined ? opt.label : optValue,
+                               disabled: optDisabled
                        } );
                        // Set the 'name' and 'value' for form submission
                        item.checkbox.$input.attr( 'name', widget.inputName );
@@ -9436,6 +9854,15 @@ OO.ui.TextInputWidget.prototype.getValidity = function () {
                }
        }
 
+       // Check browser validity and reject if it is invalid
+       if (
+               this.$input[ 0 ].checkValidity !== undefined &&
+               this.$input[ 0 ].checkValidity() === false
+       ) {
+               return rejectOrResolve( false );
+       }
+
+       // Run our checks if the browser thinks the field is valid
        if ( this.validate instanceof Function ) {
                result = this.validate( this.getValue() );
                if ( result && $.isFunction( result.promise ) ) {
@@ -9926,12 +10353,11 @@ OO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
  *
  * @throws {Error} An error is thrown if no widget is specified
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
-       var hasInputWidget, $div;
-
        // Allow passing positional parameters inside the config object
        if ( OO.isPlainObject( fieldWidget ) && config === undefined ) {
                config = fieldWidget;
@@ -9943,8 +10369,6 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                throw new Error( 'Widget not found' );
        }
 
-       hasInputWidget = fieldWidget.constructor.static.supportsSimpleLabel;
-
        // Configuration initialization
        config = $.extend( { align: 'left' }, config );
 
@@ -9952,7 +10376,9 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        OO.ui.FieldLayout.parent.call( this, config );
 
        // Mixin constructors
-       OO.ui.mixin.LabelElement.call( this, config );
+       OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
+               $label: $( '<label>' )
+       } ) );
        OO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );
 
        // Properties
@@ -9962,36 +10388,42 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.$field = $( '<div>' );
        this.$messages = $( '<ul>' );
        this.$header = $( '<div>' );
-       this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
+       this.$body = $( '<div>' );
        this.align = null;
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
+                       popup: {
+                               padded: true
+                       },
                        classes: [ 'oo-ui-fieldLayout-help' ],
                        framed: false,
                        icon: 'info'
                } );
-
-               $div = $( '<div>' );
                if ( config.help instanceof OO.ui.HtmlSnippet ) {
-                       $div.html( config.help.toString() );
+                       this.popupButtonWidget.getPopup().$body.html( config.help.toString() );
                } else {
-                       $div.text( config.help );
+                       this.popupButtonWidget.getPopup().$body.text( config.help );
                }
-               this.popupButtonWidget.getPopup().$body.append(
-                       $div.addClass( 'oo-ui-fieldLayout-help-content' )
-               );
                this.$help = this.popupButtonWidget.$element;
        } else {
                this.$help = $( [] );
        }
 
        // Events
-       if ( hasInputWidget ) {
-               this.$label.on( 'click', this.onLabelClick.bind( this ) );
-       }
        this.fieldWidget.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
+       if ( fieldWidget.constructor.static.supportsSimpleLabel ) {
+               if ( this.fieldWidget.getInputId() ) {
+                       this.$label.attr( 'for', this.fieldWidget.getInputId() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.fieldWidget.focus();
+                               return false;
+                       }.bind( this ) );
+               }
+       }
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
                .toggleClass( 'oo-ui-fieldLayout-disabled', this.fieldWidget.isDisabled() )
@@ -10026,17 +10458,6 @@ OO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) {
        this.$element.toggleClass( 'oo-ui-fieldLayout-disabled', value );
 };
 
-/**
- * Handle label mouse click events.
- *
- * @private
- * @param {jQuery.Event} e Mouse click event
- */
-OO.ui.FieldLayout.prototype.onLabelClick = function () {
-       this.fieldWidget.simulateLabelClick();
-       return false;
-};
-
 /**
  * Get the widget contained by the field.
  *
@@ -10281,10 +10702,9 @@ OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
  */
 OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
-       var $div;
-
        // Configuration initialization
        config = config || {};
 
@@ -10300,20 +10720,19 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        this.$header = $( '<div>' );
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
+                       popup: {
+                               padded: true
+                       },
                        classes: [ 'oo-ui-fieldsetLayout-help' ],
                        framed: false,
                        icon: 'info'
                } );
-
-               $div = $( '<div>' );
                if ( config.help instanceof OO.ui.HtmlSnippet ) {
-                       $div.html( config.help.toString() );
+                       this.popupButtonWidget.getPopup().$body.html( config.help.toString() );
                } else {
-                       $div.text( config.help );
+                       this.popupButtonWidget.getPopup().$body.text( config.help );
                }
-               this.popupButtonWidget.getPopup().$body.append(
-                       $div.addClass( 'oo-ui-fieldsetLayout-help-content' )
-               );
                this.$help = this.popupButtonWidget.$element;
        } else {
                this.$help = $( [] );
@@ -10341,6 +10760,10 @@ OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.mixin.GroupElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.FieldsetLayout.static.tagName = 'fieldset';
 
 /**
@@ -10454,6 +10877,10 @@ OO.mixinClass( OO.ui.FormLayout, OO.ui.mixin.GroupElement );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.FormLayout.static.tagName = 'form';
 
 /* Methods */
@@ -10586,5 +11013,3 @@ OO.inheritClass( OO.ui.HorizontalLayout, OO.ui.Layout );
 OO.mixinClass( OO.ui.HorizontalLayout, OO.ui.mixin.GroupElement );
 
 }( OO ) );
-
-//# sourceMappingURL=oojs-ui-core.js.map
\ No newline at end of file
index 32daabd..b39010c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:26Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
@@ -82,5 +82,3 @@ OO.ui.MediaWikiTheme.prototype.getDialogTransitionDuration = function () {
 OO.ui.theme = new OO.ui.MediaWikiTheme();
 
 }( OO ) );
-
-//# sourceMappingURL=oojs-ui-mediawiki.js.map
\ No newline at end of file
index d781e68..4d7f9d7 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2.5em;
   margin: 0 -1px;
   border: 1px solid #ccc;
   background-color: #fff;
   box-shadow: 0 0.3125em 1.25em rgba(0, 0, 0, 0.25);
 }
+.oo-ui-toolbar-position-top .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2.5em;
+}
+.oo-ui-toolbar-position-bottom .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  bottom: 2.5em;
+}
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   padding: 0.3125em 0 0.3125em 0.3125em;
 }
   position: relative;
 }
 .oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
+.oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
      -moz-user-select: none;
       -ms-user-select: all;
           user-select: all;
 }
-.oo-ui-toolbar-shadow {
-  background-position: left top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
 .oo-ui-toolbar-bar {
-  border-bottom: 1px solid #ccc;
   background-color: #f8fbfd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #F1F7FB));
   background-image: -webkit-linear-gradient(top, #fff 0, #F1F7FB 100%);
   background-image:         linear-gradient(to bottom, #fff 0, #F1F7FB 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#fff1f7fb' )";
 }
+.oo-ui-toolbar-position-top > .oo-ui-toolbar-bar {
+  border-bottom: 1px solid #ccc;
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolbar-position-bottom > .oo-ui-toolbar-bar {
+  border-top: 1px solid #ccc;
+  box-shadow: 0 -2px 2px 0 rgba(0, 0, 0, 0.1);
+}
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
   border: 0;
   background: none;
+  box-shadow: none;
 }
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-framed,
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-framed:last-child {
   margin: 0 1em;
   line-height: 3.40625em;
 }
-.oo-ui-toolbar-shadow {
-  background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-  bottom: -9px;
-  height: 9px;
-  opacity: 0.5;
-  -webkit-transition: opacity 500ms ease;
-     -moz-transition: opacity 500ms ease;
-          transition: opacity 500ms ease;
-}
index 9860240..59de29b 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
      -moz-transition: background-color 100ms;
@@ -37,9 +39,6 @@
   height: 2.5em;
   width: 1.875em;
 }
-.oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.1;
-}
 .oo-ui-toolGroup {
   display: inline-block;
   vertical-align: middle;
   left: 0;
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 3.125em;
   margin: 0 -1px;
   border: 1px solid #c8ccd1;
   background-color: #fff;
   box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
   min-width: 16em;
 }
+.oo-ui-toolbar-position-top .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 3.125em;
+}
+.oo-ui-toolbar-position-bottom .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  bottom: 3.125em;
+}
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   padding: 0.4em 0.625em;
   -webkit-box-sizing: border-box;
   width: 1.875em;
   min-width: 1.875em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-  line-height: 2;
-}
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
   padding-left: 0.5em;
   color: #222;
   position: relative;
 }
 .oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
+.oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
      -moz-user-select: none;
       -ms-user-select: all;
           user-select: all;
 }
-.oo-ui-toolbar-shadow {
-  background-position: left top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
 .oo-ui-toolbar-bar {
   background-color: #fff;
   color: #222;
+}
+.oo-ui-toolbar-position-top > .oo-ui-toolbar-bar {
   border-bottom: 1px solid #c8ccd1;
   box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
-  font-weight: 500;
+}
+.oo-ui-toolbar-position-bottom > .oo-ui-toolbar-bar {
+  border-top: 1px solid #c8ccd1;
+  box-shadow: 0 -1px 1px 0 rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border-bottom: 0;
+  border: 0;
   background-color: transparent;
   box-shadow: none;
 }
index 0b8a7f6..777debf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:26Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
  * @cfg {boolean} [actions] Add an actions section to the toolbar. Actions are commands that are included
  *  in the toolbar, but are not configured as tools. By default, actions are displayed on the right side of
  *  the toolbar.
- * @cfg {boolean} [shadow] Add a shadow below the toolbar.
+ * @cfg {string} [position='top'] Whether the toolbar is positioned above ('top') or below ('bottom') content.
  */
 OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        // Allow passing positional parameters inside the config object
@@ -317,6 +317,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        this.toolGroupFactory = toolGroupFactory;
        this.groups = [];
        this.tools = {};
+       this.position = config.position || 'top';
        this.$bar = $( '<div>' );
        this.$actions = $( '<div>' );
        this.initialized = false;
@@ -336,10 +337,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
        this.$bar
                .addClass( 'oo-ui-toolbar-bar' )
                .append( this.$group, '<div style="clear:both"></div>' );
-       if ( config.shadow ) {
-               this.$bar.append( '<div class="oo-ui-toolbar-shadow"></div>' );
-       }
-       this.$element.addClass( 'oo-ui-toolbar' ).append( this.$bar );
+       this.$element.addClass( 'oo-ui-toolbar oo-ui-toolbar-position-' + this.position ).append( this.$bar );
 };
 
 /* Setup */
@@ -795,10 +793,10 @@ OO.ui.Tool.prototype.setActive = function ( state ) {
        this.active = !!state;
        if ( this.active ) {
                this.$element.addClass( 'oo-ui-tool-active' );
-               this.setFlags( 'progressive' );
+               this.setFlags( { progressive: true } );
        } else {
                this.$element.removeClass( 'oo-ui-tool-active' );
-               this.clearFlags();
+               this.setFlags( { progressive: false } );
        }
 };
 
@@ -993,6 +991,14 @@ OO.ui.ToolGroup.static.accelTooltips = false;
  */
 OO.ui.ToolGroup.static.autoDisable = true;
 
+/**
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.ToolGroup.static.name = null;
+
 /* Methods */
 
 /**
@@ -1741,10 +1747,22 @@ OO.inheritClass( OO.ui.BarToolGroup, OO.ui.ToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.BarToolGroup.static.titleTooltips = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.BarToolGroup.static.accelTooltips = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.BarToolGroup.static.name = 'bar';
 
 /**
@@ -1775,7 +1793,9 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        }
 
        // Configuration initialization
-       config = config || {};
+       config = $.extend( {
+               indicator: toolbar.position === 'bottom' ? 'up' : 'down'
+       }, config );
 
        // Parent constructor
        OO.ui.PopupToolGroup.parent.call( this, toolbar, config );
@@ -2010,7 +2030,6 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
  *             // Configurations for list toolgroup.
  *             type: 'list',
  *             label: 'ListToolGroup',
- *             indicator: 'down',
  *             icon: 'ellipsis',
  *             title: 'This is the title, displayed when user moves the mouse over the list toolgroup',
  *             header: 'This is the header',
@@ -2081,6 +2100,10 @@ OO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ListToolGroup.static.name = 'list';
 
 /* Methods */
@@ -2240,7 +2263,6 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
  *             type: 'menu',
  *             header: 'This is the (optional) header',
  *             title: 'This is the (optional) title',
- *             indicator: 'down',
  *             include: [ 'settings', 'stuff' ]
  *         }
  *     ] );
@@ -2303,6 +2325,10 @@ OO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MenuToolGroup.static.name = 'menu';
 
 /* Methods */
@@ -2329,5 +2355,3 @@ OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
 };
 
 }( OO ) );
-
-//# sourceMappingURL=oojs-ui-toolbars.js.map
\ No newline at end of file
index ec581c1..a1064bb 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
   cursor: move;
@@ -33,7 +35,7 @@
   display: inline-block;
 }
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
   border-width: 1px 0 1px 1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-  top: 0;
   left: 0;
-  height: 2.3em;
   margin-left: 0.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
   background-color: #a7dcff;
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
 .oo-ui-outlineControlsWidget {
   height: 3em;
   background-color: #fff;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
 .oo-ui-capsuleMultiselectWidget-group {
   display: inline;
 }
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup > .oo-ui-popupWidget-body > * {
+  display: block;
+}
+.oo-ui-capsuleMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
 .oo-ui-capsuleMultiselectWidget-handle {
   background-color: #fff;
   cursor: text;
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
-}
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
   border: 0;
   line-height: 1.675em;
   background-color: transparent;
   color: #000;
   vertical-align: middle;
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
-  outline: none;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
+  outline: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
 }
 .oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
   border-color: rgba(0, 0, 0, 0.2);
 .oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
   opacity: 0.2;
 }
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup {
+  border: 0;
+}
 .oo-ui-capsuleItemWidget {
   position: relative;
   display: inline-block;
   cursor: text;
 }
 .oo-ui-capsuleItemWidget:focus {
-  outline: none;
+  outline: 0;
   border-color: #087ecc;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
 }
-.oo-ui-numberInputWidget-buttoned .oo-ui-buttonElement-button {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
 .oo-ui-numberInputWidget-field {
   display: table;
   table-layout: fixed;
index aced25b..495cbfe 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
   cursor: move;
 .oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
   display: inline-block;
 }
+.oo-ui-draggableElement-handle:focus {
+  border-radius: 2px;
+  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+  outline: 0;
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  height: 2.3em;
   margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
   right: 2em;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eaf3ff;
-}
 .oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border: 1px solid #a2a9b1;
+  border-radius: 2px;
   vertical-align: middle;
   overflow: hidden;
-  border-radius: 2px;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
   border-radius: 2px;
   white-space: normal;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eee;
+  background-color: #fff;
   border-style: dashed;
+  -webkit-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+     -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+          transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+}
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
+  border-color: #72777d;
+}
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaf3ff;
+  color: #36c;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
   left: 4em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
 .oo-ui-outlineControlsWidget {
   height: 3em;
   background-color: #fff;
   text-align: left;
   white-space: nowrap;
   overflow: hidden;
-  background-color: #ddd;
+  background-color: #eaecf0;
 }
 .oo-ui-tabOptionWidget {
   display: inline-block;
   vertical-align: bottom;
-  padding: 0.35em 1em;
+  color: #222;
   margin: 0.5em 0 0 0.75em;
   border: 1px solid transparent;
   border-bottom: 0;
   border-top-left-radius: 2px;
   border-top-right-radius: 2px;
-  color: #222;
+  padding: 0.35em 1em;
   font-weight: bold;
+  -webkit-transition: background-color 100ms, color 100ms;
+     -moz-transition: background-color 100ms, color 100ms;
+          transition: background-color 100ms, color 100ms;
 }
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
   background-color: rgba(255, 255, 255, 0.3);
 .oo-ui-selectWidget-depressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
 .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected:hover {
   background-color: #fff;
-  color: #333;
+  color: #000;
 }
 .oo-ui-capsuleMultiselectWidget {
   display: inline-block;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
 .oo-ui-capsuleMultiselectWidget-group {
   display: inline;
 }
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup > .oo-ui-popupWidget-body > * {
+  display: block;
+}
+.oo-ui-capsuleMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
 .oo-ui-capsuleMultiselectWidget-handle {
   min-height: 2.4em;
   margin-right: 0.5em;
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
+  border: 0;
+  line-height: 1.675;
+  margin: 0 0 0 0.2em;
+  padding: 0;
+  font-size: inherit;
+  font-family: inherit;
+  background-color: transparent;
+  color: #000;
+  vertical-align: middle;
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-ms-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-webkit-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :placeholder-shown {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
   color: #72777d;
-}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
-  border: 0;
-  line-height: 1.675;
-  margin: 0 0 0 0.2em;
-  padding: 0;
-  font-size: inherit;
-  font-family: inherit;
-  background-color: transparent;
-  color: #000;
-  vertical-align: middle;
+  opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
   outline: 0;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
-}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
-}
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
-.oo-ui-capsuleMultiselectWidget .oo-ui-popupWidget {
-  width: 100%;
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
+.oo-ui-capsuleMultiselectWidget-popup {
   margin-top: -1px;
 }
-.oo-ui-capsuleMultiselectWidget .oo-ui-popupWidget-popup {
-  min-width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  border-width: 0 1px;
-  border-radius: 0 0 2px 2px;
+.oo-ui-capsuleMultiselectWidget-popup > .oo-ui-popupWidget-popup {
+  border: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
   background-color: #fff;
   display: inline-block;
   cursor: default;
   white-space: nowrap;
-  width: auto;
-  max-width: 100%;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  vertical-align: middle;
+  width: auto;
+  max-width: 100%;
   height: 1.7em;
-  line-height: 1.7;
-  background-color: #eee;
-  color: #222;
   margin: 0.1em;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   padding: 0 0.4em;
+  line-height: 1.7;
+  vertical-align: middle;
 }
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   overflow: hidden;
   cursor: text;
 }
-.oo-ui-capsuleItemWidget:focus {
-  outline: 0;
-  border-color: #36c;
-  box-shadow: inset 0 0 0 1px #36c;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
-  background-color: #eaecf0;
-  color: #72777d;
-  border-color: #c8ccd1;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
-  display: none;
-}
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+  background-color: #f8f9fa;
+  color: #222;
   padding-right: 1.5375em;
+  -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
   display: block;
   bottom: 0;
   height: auto;
 }
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
+  background-color: #eaecf0;
+  color: #72777d;
+  border-color: #c8ccd1;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+  display: none;
+}
 .oo-ui-searchWidget-query {
   position: absolute;
   top: 0;
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
 }
-.oo-ui-numberInputWidget-buttoned .oo-ui-buttonElement-button {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
 .oo-ui-numberInputWidget-field {
   display: table;
   table-layout: fixed;
 }
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonElement-button {
   display: block;
+  min-width: 2.5em;
   min-height: 2.5em;
   padding-left: 0;
   padding-right: 0;
index 4bf461f..b89262d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:26Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
@@ -241,6 +241,7 @@ OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( con
        }
        this.$element
                .addClass( 'oo-ui-draggableGroupElement' )
+               .attr( 'role', 'listbox' )
                .append( this.$status )
                .toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );
 };
@@ -1779,11 +1780,9 @@ OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page )
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        var layout = this;
        if ( !this.scrolling && page ) {
-               page.scrollElementIntoView( {
-                       complete: function () {
-                               if ( layout.autoFocus && !OO.ui.isMobile() ) {
-                                       layout.focus();
-                               }
+               page.scrollElementIntoView().done( function () {
+                       if ( layout.autoFocus && !OO.ui.isMobile() ) {
+                               layout.focus();
                        }
                } );
        }
@@ -2290,11 +2289,9 @@ OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
 OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
        var layout = this;
        if ( card ) {
-               card.scrollElementIntoView( {
-                       complete: function () {
-                               if ( layout.autoFocus && !OO.ui.isMobile() ) {
-                                       layout.focus();
-                               }
+               card.scrollElementIntoView().done( function () {
+                       if ( layout.autoFocus && !OO.ui.isMobile() ) {
+                               layout.focus();
                        }
                } );
        }
@@ -3061,12 +3058,30 @@ OO.inheritClass( OO.ui.OutlineOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.OutlineOptionWidget.static.highlightable = true;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.OutlineOptionWidget.static.scrollIntoViewOnSelect = true;
 
+/**
+ * @static
+ * @inheritable
+ * @property {string}
+ */
 OO.ui.OutlineOptionWidget.static.levelClass = 'oo-ui-outlineOptionWidget-level-';
 
+/**
+ * @static
+ * @inheritable
+ * @property {number}
+ */
 OO.ui.OutlineOptionWidget.static.levels = 3;
 
 /* Methods */
@@ -3108,9 +3123,9 @@ OO.ui.OutlineOptionWidget.prototype.getLevel = function () {
 OO.ui.OutlineOptionWidget.prototype.setPressed = function ( state ) {
        OO.ui.OutlineOptionWidget.parent.prototype.setPressed.call( this, state );
        if ( this.pressed ) {
-               this.setFlags( 'progressive' );
+               this.setFlags( { progressive: true } );
        } else if ( !this.selected ) {
-               this.clearFlags();
+               this.setFlags( { progressive: false } );
        }
        return this;
 };
@@ -3149,9 +3164,9 @@ OO.ui.OutlineOptionWidget.prototype.setRemovable = function ( removable ) {
 OO.ui.OutlineOptionWidget.prototype.setSelected = function ( state ) {
        OO.ui.OutlineOptionWidget.parent.prototype.setSelected.call( this, state );
        if ( this.selected ) {
-               this.setFlags( 'progressive' );
+               this.setFlags( { progressive: true } );
        } else {
-               this.clearFlags();
+               this.setFlags( { progressive: false } );
        }
        return this;
 };
@@ -3262,9 +3277,18 @@ OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TitledElement );
 
 /* Static Properties */
 
-// Allow button mouse down events to pass through so they can be handled by the parent select widget
+/**
+ * Allow button mouse down events to pass through so they can be handled by the parent select widget
+ *
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ButtonOptionWidget.static.cancelButtonMouseDownEvents = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.ButtonOptionWidget.static.highlightable = false;
 
 /* Methods */
@@ -3375,6 +3399,10 @@ OO.inheritClass( OO.ui.TabOptionWidget, OO.ui.OptionWidget );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.TabOptionWidget.static.highlightable = false;
 
 /**
@@ -3615,7 +3643,11 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
                        align: 'forwards',
                        anchor: false
                } );
-               OO.ui.mixin.PopupElement.call( this, config );
+               OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
+                       popup: {
+                               $floatableContainer: this.$element
+                       }
+               } ) );
                $tabFocus = $( '<span>' );
                OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: $tabFocus } ) );
        } else {
@@ -3695,12 +3727,16 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        this.$element.addClass( 'oo-ui-capsuleMultiselectWidget' )
                .append( this.$handle );
        if ( this.popup ) {
+               this.popup.$element.addClass( 'oo-ui-capsuleMultiselectWidget-popup' );
                this.$content.append( $tabFocus );
                this.$overlay.append( this.popup.$element );
        } else {
                this.$content.append( this.$input );
                this.$overlay.append( this.menu.$element );
        }
+       if ( $tabFocus ) {
+               $tabFocus.addClass( 'oo-ui-capsuleMultiselectWidget-focusTrap' );
+       }
 
        // Input size needs to be calculated after everything else is rendered
        setTimeout( function () {
@@ -3721,6 +3757,10 @@ OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.TabIndexedElement );
 OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IconElement );
 
+/* Static Properties */
+
+OO.ui.CapsuleMultiselectWidget.static.supportsSimpleLabel = true;
+
 /* Events */
 
 /**
@@ -3756,6 +3796,26 @@ OO.ui.CapsuleMultiselectWidget.prototype.createItemWidget = function ( data, lab
        return new OO.ui.CapsuleItemWidget( { data: data, label: label } );
 };
 
+/**
+ * Get the widget's input's id, or generate one, if it has an input.
+ *
+ * @return {string}
+ */
+OO.ui.CapsuleMultiselectWidget.prototype.getInputId = function () {
+       var id;
+       if ( !this.$input ) {
+               return false;
+       }
+
+       id = this.$input.attr( 'id' );
+       if ( id === undefined ) {
+               id = OO.ui.generateElementId();
+               this.$input.attr( 'id', id );
+       }
+
+       return id;
+};
+
 /**
  * Get the data of the items in the capsule
  *
@@ -4305,7 +4365,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.setDisabled = function ( disabled ) {
 OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        if ( !this.isDisabled() ) {
                if ( this.popup ) {
-                       this.popup.setSize( this.$handle.width() );
+                       this.popup.setSize( this.$handle.outerWidth() );
                        this.popup.toggle( true );
                        OO.ui.findFocusable( this.popup.$element ).focus();
                } else {
@@ -5345,5 +5405,3 @@ OO.ui.NumberInputWidget.prototype.setDisabled = function ( disabled ) {
 };
 
 }( OO ) );
-
-//# sourceMappingURL=oojs-ui-widgets.js.map
\ No newline at end of file
index 2fc4cc8..b546dd1 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 }
index c643c28..701c058 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:32Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-window {
   background: transparent;
 }
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active {
   background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
   background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
   background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
   font-weight: bold;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
index ab83a55..ad3c226 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.18.4-fix (d4045dee45)
+ * OOjs UI v0.19.4
  * 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-01-19T20:22:26Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
@@ -203,6 +203,7 @@ OO.ui.ActionWidget.prototype.toggle = function () {
  *     }
  *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
  *     MyProcessDialog.static.title = 'An action set in a process dialog';
+ *     MyProcessDialog.static.name = 'myProcessDialog';
  *     // An action set that uses modes ('edit' and 'help' mode, in this example).
  *     MyProcessDialog.static.actions = [
  *         { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'constructive' ] },
@@ -1442,6 +1443,41 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
  * See the [OOjs ui documentation on MediaWiki] [2] for examples.
  * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers
  *
+ * This function can be called in two manners:
+ *
+ * 1. `.addWindows( [ windowA, windowB, ... ] )` (where `windowA`, `windowB` are OO.ui.Window objects)
+ *
+ *    This syntax registers windows under the symbolic names defined in their `.static.name`
+ *    properties. For example, if `windowA.constructor.static.name` is `'nameA'`, calling
+ *    `.openWindow( 'nameA' )` afterwards will open the window `windowA`. This syntax requires the
+ *    static name to be set, otherwise an exception will be thrown.
+ *
+ *    This is the recommended way, as it allows for an easier switch to using a window factory.
+ *
+ * 2. `.addWindows( { nameA: windowA, nameB: windowB, ... } )`
+ *
+ *    This syntax registers windows under the explicitly given symbolic names. In this example,
+ *    calling `.openWindow( 'nameA' )` afterwards will open the window `windowA`, regardless of what
+ *    its `.static.name` is set to. The static name is not required to be set.
+ *
+ *    This should only be used if you need to override the default symbolic names.
+ *
+ * Example:
+ *
+ *     var windowManager = new OO.ui.WindowManager();
+ *     $( 'body' ).append( windowManager.$element );
+ *
+ *     // Add a window under the default name: see OO.ui.MessageDialog.static.name
+ *     windowManager.addWindows( [ new OO.ui.MessageDialog() ] );
+ *     // Add a window under an explicit name
+ *     windowManager.addWindows( { myMessageDialog: new OO.ui.MessageDialog() } );
+ *
+ *     // Open window by default name
+ *     windowManager.openWindow( 'message' );
+ *     // Open window by explicitly given name
+ *     windowManager.openWindow( 'myMessageDialog' );
+ *
+ *
  * @param {Object.<string,OO.ui.Window>|OO.ui.Window[]} windows An array of window objects specified
  *  by reference, symbolic name, or explicitly defined symbolic names.
  * @throws {Error} An error is thrown if a window is added by symbolic name, but has neither an
@@ -1455,11 +1491,8 @@ OO.ui.WindowManager.prototype.addWindows = function ( windows ) {
                list = {};
                for ( i = 0, len = windows.length; i < len; i++ ) {
                        name = windows[ i ].constructor.static.name;
-                       if ( typeof name !== 'string' ) {
-                               throw new Error( 'Cannot add window' );
-                       }
                        if ( !name ) {
-                               OO.ui.warnDeprecation( 'OO.ui.WindowManager#addWindows: Windows must have a `name` static property defined.' );
+                               throw new Error( 'Windows must have a `name` static property defined.' );
                        }
                        list[ name ] = windows[ i ];
                }
@@ -2320,6 +2353,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
  *         MyDialog.parent.call( this, config );
  *     }
  *     OO.inheritClass( MyDialog, OO.ui.Dialog );
+ *     MyDialog.static.name = 'myDialog';
  *     MyDialog.prototype.initialize = function () {
  *         MyDialog.parent.prototype.initialize.call( this );
  *         this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
@@ -2365,7 +2399,6 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        // Events
        this.actions.connect( this, {
                click: 'onActionClick',
-               resize: 'onActionResize',
                change: 'onActionsChange'
        } );
 
@@ -2449,7 +2482,7 @@ OO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {
                this.executeAction( '' );
                e.preventDefault();
                e.stopPropagation();
-       } else if ( e.which === OO.ui.Keys.ENTER && e.ctrlKey ) {
+       } else if ( e.which === OO.ui.Keys.ENTER && ( e.ctrlKey || e.metaKey ) ) {
                actions = this.actions.get( { flags: 'primary', visible: true, disabled: false } );
                if ( actions.length > 0 ) {
                        this.executeAction( actions[ 0 ].getAction() );
@@ -2459,16 +2492,6 @@ OO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {
        }
 };
 
-/**
- * Handle action resized events.
- *
- * @private
- * @param {OO.ui.ActionWidget} action Action that was resized
- */
-OO.ui.Dialog.prototype.onActionResize = function () {
-       // Override in subclass
-};
-
 /**
  * Handle action click events.
  *
@@ -2698,11 +2721,22 @@ OO.inheritClass( OO.ui.MessageDialog, OO.ui.Dialog );
 
 /* Static Properties */
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MessageDialog.static.name = 'message';
 
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MessageDialog.static.size = 'small';
 
-// @deprecated since v0.18.4 as default; TODO: Remove
+/**
+ * @static
+ * @deprecated since v0.18.4 as default; TODO: Remove
+ */
 OO.ui.MessageDialog.static.verbose = true;
 
 /**
@@ -2729,8 +2763,12 @@ OO.ui.MessageDialog.static.title = null;
  */
 OO.ui.MessageDialog.static.message = null;
 
-// Note that OO.ui.alert() and OO.ui.confirm() rely on these.
+/**
+ * @static
+ * @inheritdoc
+ */
 OO.ui.MessageDialog.static.actions = [
+       // Note that OO.ui.alert() and OO.ui.confirm() rely on these.
        { action: 'accept', label: OO.ui.deferMsg( 'ooui-dialog-message-accept' ), flags: 'primary' },
        { action: 'reject', label: OO.ui.deferMsg( 'ooui-dialog-message-reject' ), flags: 'safe' }
 ];
@@ -2751,14 +2789,6 @@ OO.ui.MessageDialog.prototype.setManager = function ( manager ) {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.MessageDialog.prototype.onActionResize = function ( action ) {
-       this.fitActions();
-       return OO.ui.MessageDialog.parent.prototype.onActionResize.call( this, action );
-};
-
 /**
  * Handle window resized events.
  *
@@ -3018,6 +3048,7 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
  *     }
  *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );
  *
+ *     MyProcessDialog.static.name = 'myProcessDialog';
  *     MyProcessDialog.static.title = 'Process dialog';
  *     MyProcessDialog.static.actions = [
  *         { action: 'save', label: 'Done', flags: 'primary' },
@@ -3096,16 +3127,6 @@ OO.ui.ProcessDialog.prototype.onRetryButtonClick = function () {
        this.executeAction( this.currentAction );
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.ProcessDialog.prototype.onActionResize = function ( action ) {
-       if ( this.actions.isSpecial( action ) ) {
-               this.fitLabel();
-       }
-       return OO.ui.ProcessDialog.parent.prototype.onActionResize.call( this, action );
-};
-
 /**
  * @inheritdoc
  */
@@ -3374,9 +3395,7 @@ OO.ui.getWindowManager = function () {
        if ( !OO.ui.windowManager ) {
                OO.ui.windowManager = new OO.ui.WindowManager();
                $( 'body' ).append( OO.ui.windowManager.$element );
-               OO.ui.windowManager.addWindows( {
-                       messageDialog: new OO.ui.MessageDialog()
-               } );
+               OO.ui.windowManager.addWindows( [ new OO.ui.MessageDialog() ] );
        }
        return OO.ui.windowManager;
 };
@@ -3398,7 +3417,7 @@ OO.ui.getWindowManager = function () {
  * @return {jQuery.Promise} Promise resolved when the user closes the dialog
  */
 OO.ui.alert = function ( text, options ) {
-       return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
+       return OO.ui.getWindowManager().openWindow( 'message', $.extend( {
                message: text,
                actions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]
        }, options ) ).then( function ( opened ) {
@@ -3434,7 +3453,7 @@ OO.ui.alert = function ( text, options ) {
  *  `false`.
  */
 OO.ui.confirm = function ( text, options ) {
-       return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
+       return OO.ui.getWindowManager().openWindow( 'message', $.extend( {
                message: text
        }, options ) ).then( function ( opened ) {
                return opened.then( function ( closing ) {
@@ -3464,7 +3483,7 @@ OO.ui.confirm = function ( text, options ) {
  *
  * @param {jQuery|string} text Message text to display
  * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
- * @cfg {Object} [textInput] Additional options for text input widget, see OO.ui.TextInputWidget
+ * @param {Object} [options.textInput] Additional options for text input widget, see OO.ui.TextInputWidget
  * @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to
  *  confirm, the promise will resolve with the value of the text input widget; otherwise, it will
  *  resolve to `null`.
@@ -3479,7 +3498,7 @@ OO.ui.prompt = function ( text, options ) {
 
        // TODO: This is a little hacky, and could be done by extending MessageDialog instead.
 
-       return manager.openWindow( 'messageDialog', $.extend( {
+       return manager.openWindow( 'message', $.extend( {
                message: textField.$element
        }, options ) ).then( function ( opened ) {
                // After ready
@@ -3496,5 +3515,3 @@ OO.ui.prompt = function ( text, options ) {
 };
 
 }( OO ) );
-
-//# sourceMappingURL=oojs-ui-windows.js.map
\ No newline at end of file
index ec755a1..ea2e2ec 100644 (file)
@@ -56,6 +56,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index 449cb77..d68e70c 100644 (file)
                } },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "feedback": { "file": {
+                       "ltr": "images/icons/feedback-ltr.svg",
+                       "rtl": "images/icons/feedback-rtl.svg"
+               } },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
index b5dff27..15c0251 100644 (file)
                        "rtl": "images/icons/unLock-rtl.svg"
                } },
                "star": { "file": "images/icons/star.svg" },
+               "halfStar": { "file": {
+                       "ltr": "images/icons/halfStar-ltr.svg",
+                       "rtl": "images/icons/halfStar-rtl.svg"
+               } },
                "unStar": { "file": "images/icons/unStar.svg" },
                "trash": { "file": "images/icons/trash.svg" },
                "unTrash": { "file": {
index 4d8c673..a140a5a 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index bf39564..8098166 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 729b8c2..bc3ef4e 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 762e641..792b4aa 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index d6378bf..079a62c 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +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="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
index 0738205..09df1d3 100644 (file)
@@ -1,6 +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"><style>* { fill: #FFFFFF }</style>
+<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>
-</svg>
+</g></svg>
index 322fc31..c11e11e 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+<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>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?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="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
index 62c82c0..eb5f963 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/eye.png and b/resources/lib/oojs-ui/themes/apex/images/icons/eye.png differ
index 343e9cf..cec85d0 100644 (file)
@@ -1,5 +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="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
 </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
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png 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
new file mode 100644 (file)
index 0000000..d32e478
--- /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"><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-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /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="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"/>
+</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
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png 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
new file mode 100644 (file)
index 0000000..14be7ff
--- /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"><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/feedback-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /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="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"/>
+</svg>
index 40d01b4..d533779 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index d960a65..f99e338 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png
new file mode 100644 (file)
index 0000000..d52a908
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-ltr.svg
new file mode 100644 (file)
index 0000000..cfb17d8
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png
new file mode 100644 (file)
index 0000000..4991b65
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/halfStar-rtl.svg
new file mode 100644 (file)
index 0000000..c649b50
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</svg>
index fc78226..ab9e536 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 131bbdb..454f6a9 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 906ee6e..6b7fd63 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 238ca48..d137db6 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 8248804..792025b 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 8b10f25..14f148a 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 412cd92..e3ce38b 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 5058629..971ac48 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 18e4118..f7a92e0 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index e357be6..ef51a66 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 08c2c36..1442004 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index d431703..0d1cd83 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 3a09864..578f12b 100644 (file)
@@ -1,5 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 7f7ef3a..f533999 100644 (file)
@@ -1,5 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 7559366..0e19566 100644 (file)
@@ -1,5 +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"><style>* { fill: #FFFFFF }</style>
+<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)"/>
-</svg>
+</g></svg>
index 7545aeb..a6d466a 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
index 812ee38..61a2866 100644 (file)
@@ -1,4 +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"><style>* { fill: #FFFFFF }</style>
+<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"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png b/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png
deleted file mode 100644 (file)
index eeb20b0..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png and /dev/null differ
index 21efb82..7cbbced 100644 (file)
@@ -76,6 +76,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index e040ffb..3436446 100644 (file)
                } },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "feedback": {
+                       "file": {
+                               "ltr": "images/icons/feedback-ltr.svg",
+                               "rtl": "images/icons/feedback-rtl.svg"
+                       },
+                       "variants": [ "progressive" ]
+               },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
index 9cc0f32..6a47267 100644 (file)
                        "rtl": "images/icons/unLock-rtl.svg"
                }, "variants": [ "destructive" ] },
                "star": { "file": "images/icons/star.svg", "variants": [ "constructive", "progressive" ] },
+               "halfStar": { "file": {
+                       "ltr": "images/icons/halfStar-ltr.svg",
+                       "rtl": "images/icons/halfStar-rtl.svg"
+               }, "variants": [ "constructive", "progressive" ] },
                "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive", "progressive" ] },
                "trash": { "file": "images/icons/trash.svg" },
                "unTrash": { "file": {
index 94b9b7b..60c74f5 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
-</svg>
+</g></svg>
index 55f0013..dfbbc82 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
-</svg>
+</g></svg>
index 94b9b7b..60c74f5 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
-</svg>
+</g></svg>
index 8e5d7ac..feb4dd4 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-1c.4.2.9.395 1.4.594l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.092 2.1-2.08-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
-</svg>
+</g></svg>
index b8d38f5..6bb1b10 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 13.44v-2.88l-1.8-.3c-.1-.397-.3-.794-.6-1.39l1.1-1.49-2.1-2.088-1.5 1.093c-.5-.298-1-.497-1.4-.596L13.5 4h-2.9l-.3 1.79c-.5.098-.9.297-1.4.595L7.4 5.292 5.3 7.38l1 1.49c-.3.496-.4.894-.6 1.39l-1.7.2v2.882l1.8.298c.1.497.3.894.6 1.39l-1 1.492 2.1 2.087 1.5-1c.4.2.9.395 1.4.594l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.092 2.1-2.08-1.1-1.49c.3-.496.5-.993.6-1.39l1.5-.3zm-8 1.492c-1.7 0-3-1.292-3-2.982 0-1.69 1.3-2.98 3-2.98s3 1.29 3 2.98-1.3 2.982-3 2.982z"/>
-</svg>
+</g></svg>
index d72ac35..0f64141 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
         <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
-</svg>
+</g></svg>
index ddbb983..78c22cd 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
         <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
-</svg>
+</g></svg>
index c5c5687..6e96e13 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ff5d00 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ff5d00">
     <g id="alert">
         <path id="point" d="M11 16h2v2h-2z"/>
         <path id="stroke" d="M13.516 10h-3L11 15h2z"/>
         <path id="triangle" d="M12.017 5.974L19.537 19H4.497l7.52-13.026m0-2.474c-.545 0-1.09.357-1.5 1.07L2.53 18.403C1.705 19.833 2.38 21 4.03 21H20c1.65 0 2.325-1.17 1.5-2.6L13.517 4.575c-.413-.715-.956-1.072-1.5-1.072z"/>
     </g>
-</svg>
+</g></svg>
index dc3a39a..b6db392 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H9c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm-5.5 9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0-12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-center"/>
-</svg>
+</g></svg>
index a88b9fe..e69f542 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H9c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm-5.5 9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0-12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-center"/>
-</svg>
+</g></svg>
index 770e354..5232a48 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H4c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm9.5 0h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm-10-9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0 12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-float-left"/>
-</svg>
+</g></svg>
index ff0257f..7e03b95 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1H4c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zm9.5 0h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm0 3h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1zm-10-9h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1zm0 12h17a.5.5 0 0 1 0 1h-17a.5.5 0 0 1 0-1z" id="align-float-left"/>
-</svg>
+</g></svg>
index 014fb7e..3395516 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 9h-6c-.554 0-1 .446-1 1v5c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-5c0-.554-.446-1-1-1zm-9.5 0h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm10-9h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1zm0 12h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1z" id="align-float-right"/>
-</svg>
+</g></svg>
index 37ec2b5..f7f45e2 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 9h-6c-.554 0-1 .446-1 1v5c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-5c0-.554-.446-1-1-1zm-9.5 0h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm0 3h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1zm10-9h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1zm0 12h-17a.5.5 0 0 0 0 1h17a.5.5 0 0 0 0-1z" id="align-float-right"/>
-</svg>
+</g></svg>
index 9e18fd2..7a6c6a4 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13.3 6.3l6.3 5.7-6.3 5.7v-3.8H12c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9V6.3z"/>
-</svg>
+</g></svg>
index ee78b93..c17ebc7 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13.3 6.3l6.3 5.7-6.3 5.7v-3.8H12c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9V6.3z"/>
-</svg>
+</g></svg>
index 5bbad61..b05aec3 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10.7 6.3L4.4 12l6.3 5.7v-3.8H12c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9V6.3z"/>
-</svg>
+</g></svg>
index d9ad31e..cc7b2aa 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10.7 6.3L4.4 12l6.3 5.7v-3.8H12c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9V6.3z"/>
-</svg>
+</g></svg>
index 7ec8b03..cfde7f5 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 12H6c-1.7 0-3 1.3-3 3h13v3l5-4.5L16 9v3z"/>
-</svg>
+</g></svg>
index 1317492..020e740 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 12H6c-1.7 0-3 1.3-3 3h13v3l5-4.5L16 9v3z"/>
-</svg>
+</g></svg>
index 38c0f88..b701b61 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 12h10c1.7 0 3 1.3 3 3H8v3l-5-4.5L8 9v3z"/>
-</svg>
+</g></svg>
index e56da3c..476c443 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 12h10c1.7 0 3 1.3 3 3H8v3l-5-4.5L8 9v3z"/>
-</svg>
+</g></svg>
index 5caf7dd..3285cc7 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 10h4V5h-4v5zm-5 2h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zM5 3h13v16H8c-1.7 0-3-1.3-3-3V3z"/>
-</svg>
+</g></svg>
index cd35d36..61dda31 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 10h4V5h-4v5zm-5 2h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zM5 3h13v16H8c-1.7 0-3-1.3-3-3V3z"/>
-</svg>
+</g></svg>
index 19a1d72..b92172a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 10H7V5h4v5zm5 2H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zm6-2H5v16h10c1.7 0 3-1.3 3-3V3z"/>
-</svg>
+</g></svg>
index b04ecae..d0e6a7a 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 10H7V5h4v5zm5 2H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zm6-2H5v16h10c1.7 0 3-1.3 3-3V3z"/>
-</svg>
+</g></svg>
index 1f30f59..9557c56 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 11l-6 7-4-4-1 1 5 5 7-8z"/>
     <path d="M17 14V3H4v13c0 1.7 1.3 3 3 3h5l-3-3H6v-1h2.6l1-1H6v-1h9v1h-2l1 1h2l1-1zM6 5h4v1H6V5zm0 2h4v1H6V7zm0 2h4v1H6V9zm9 3H6v-1h9v1zm-4-2V5h4v5h-4z"/>
-</svg>
+</g></svg>
index b554100..5802afd 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 11l-6 7-4-4-1 1 5 5 7-8z"/>
     <path d="M17 14V3H4v13c0 1.7 1.3 3 3 3h5l-3-3H6v-1h2.6l1-1H6v-1h9v1h-2l1 1h2l1-1zM6 5h4v1H6V5zm0 2h4v1H6V7zm0 2h4v1H6V9zm9 3H6v-1h9v1zm-4-2V5h4v5h-4z"/>
-</svg>
+</g></svg>
index f4dc6e9..fba5a32 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 11l6 7 4-4 1 1-5 5-7-8z"/>
     <path d="M9 14V3h13v13c0 1.7-1.3 3-3 3h-5l3-3h3v-1h-2.6l-1-1H20v-1h-9v1h2l-1 1h-2l-1-1zm11-9h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm-9 3h9v-1h-9v1zm4-2V5h-4v5h4z"/>
-</svg>
+</g></svg>
index 7a47a0e..0215593 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 11l6 7 4-4 1 1-5 5-7-8z"/>
     <path d="M9 14V3h13v13c0 1.7-1.3 3-3 3h-5l3-3h3v-1h-2.6l-1-1H20v-1h-9v1h2l-1 1h-2l-1-1zm11-9h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm-9 3h9v-1h-9v1zm4-2V5h-4v5h4z"/>
-</svg>
+</g></svg>
index 8b566ba..f68467f 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="article-redirect">
         <path id="arrow" d="M18.1 14.2L23 18l-4.9 4.8v-2.2c-1.7 0-2.9-.2-4.3-1.2-1.2-.8-2.5-2.6-2.3-4.1 1.4 1 2.9 1.5 4.4 1.5.7 0 1.4-.1 2.1-.3l.1-2.3"/>
         <path id="page" d="M5 3v13c0 1.7 1.3 3 3 3h3.375c-.157-.205-.3-.43-.438-.656-.42-.688-.77-1.483-.843-2.344H7v-1h3.125l.125-1H7v-1h3.375l.03-.188.283.188H16v1h-3.906l.22.156c.523.375 1.065.64 1.592.844H16v.406c.208-.013.418-.07.625-.094.068-1.294.125-3.874.125-3.874l1.25.968V3H5zm2 2h4v1H7V5zm5 0h4v5h-4V5zM7 7h4v1H7V7zm0 2h4v1H7V9zm0 2h9v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 49c1975..28e7a46 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="article-redirect">
         <path id="arrow" d="M18.1 14.2L23 18l-4.9 4.8v-2.2c-1.7 0-2.9-.2-4.3-1.2-1.2-.8-2.5-2.6-2.3-4.1 1.4 1 2.9 1.5 4.4 1.5.7 0 1.4-.1 2.1-.3l.1-2.3"/>
         <path id="page" d="M5 3v13c0 1.7 1.3 3 3 3h3.375c-.157-.205-.3-.43-.438-.656-.42-.688-.77-1.483-.843-2.344H7v-1h3.125l.125-1H7v-1h3.375l.03-.188.283.188H16v1h-3.906l.22.156c.523.375 1.065.64 1.592.844H16v.406c.208-.013.418-.07.625-.094.068-1.294.125-3.874.125-3.874l1.25.968V3H5zm2 2h4v1H7V5zm5 0h4v5h-4V5zM7 7h4v1H7V7zm0 2h4v1H7V9zm0 2h9v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 9bce7f2..d70b35f 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="article-redirect">
         <path id="arrow" d="M5.9 14.2L1 18l4.9 4.8v-2.2c1.7 0 2.9-.2 4.3-1.2 1.2-.8 2.5-2.6 2.3-4.1-1.4 1-2.9 1.5-4.4 1.5-.7 0-1.4-.1-2.1-.3l-.1-2.3"/>
         <path id="page" d="M19 3v13c0 1.7-1.3 3-3 3h-3.375c.157-.205.3-.43.438-.656.42-.688.77-1.483.843-2.344H17v-1h-3.125l-.125-1H17v-1h-3.375l-.03-.188-.283.188H8v1h3.906l-.22.156a7.097 7.097 0 0 1-1.592.844H8v.406c-.208-.013-.418-.07-.625-.094a178.903 178.903 0 0 1-.125-3.874L6 12.405V3zm-2 2h-4v1h4zm-5 0H8v5h4zm5 2h-4v1h4zm0 2h-4v1h4zm0 2H8v1h9z"/>
     </g>
-</svg>
+</g></svg>
index 98a0d4c..d49b9bd 100644 (file)
@@ -1,7 +1,7 @@
 <?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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="article-redirect">
         <path id="arrow" d="M5.9 14.2L1 18l4.9 4.8v-2.2c1.7 0 2.9-.2 4.3-1.2 1.2-.8 2.5-2.6 2.3-4.1-1.4 1-2.9 1.5-4.4 1.5-.7 0-1.4-.1-2.1-.3l-.1-2.3"/>
         <path id="page" d="M19 3v13c0 1.7-1.3 3-3 3h-3.375c.157-.205.3-.43.438-.656.42-.688.77-1.483.843-2.344H17v-1h-3.125l-.125-1H17v-1h-3.375l-.03-.188-.283.188H8v1h3.906l-.22.156a7.097 7.097 0 0 1-1.592.844H8v.406c-.208-.013-.418-.07-.625-.094a178.903 178.903 0 0 1-.125-3.874L6 12.405V3zm-2 2h-4v1h4zm-5 0H8v5h4zm5 2h-4v1h4zm0 2h-4v1h4zm0 2H8v1h9z"/>
     </g>
-</svg>
+</g></svg>
index 1febaf2..c4dbcde 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19.1 18.5c.6-.7.9-1.5.9-2.5 0-2.2-1.8-4-4-4s-4 1.8-4 4 1.8 4 4 4c.7 0 1.3-.1 1.8-.4l2.7 2.7 1.1-1.1-2.5-2.7zm-3.1-.3c-1.2 0-2.2-1-2.2-2.3 0-1.2 1-2.2 2.2-2.2 1.2 0 2.3 1 2.3 2.2-.1 1.3-1.1 2.3-2.3 2.3zM11.8 13c.3-.4.6-.7 1-1H7v-1h9s1.2 0 2 .6V3H5v13c0 1.7 1.3 3 3 3h3.8c-.6-.8-1-1.9-1-3H7v-1h3.9l.3-1H7v-1h4.8zm.2-8h4v5h-4V5zM7 5h4v1H7V5zm0 2h4v1H7V7zm0 2h4v1H7V9z"/>
-</svg>
+</g></svg>
index 394203a..2d71a62 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19.1 18.5c.6-.7.9-1.5.9-2.5 0-2.2-1.8-4-4-4s-4 1.8-4 4 1.8 4 4 4c.7 0 1.3-.1 1.8-.4l2.7 2.7 1.1-1.1-2.5-2.7zm-3.1-.3c-1.2 0-2.2-1-2.2-2.3 0-1.2 1-2.2 2.2-2.2 1.2 0 2.3 1 2.3 2.2-.1 1.3-1.1 2.3-2.3 2.3zM11.8 13c.3-.4.6-.7 1-1H7v-1h9s1.2 0 2 .6V3H5v13c0 1.7 1.3 3 3 3h3.8c-.6-.8-1-1.9-1-3H7v-1h3.9l.3-1H7v-1h4.8zm.2-8h4v5h-4V5zM7 5h4v1H7V5zm0 2h4v1H7V7zm0 2h4v1H7V9z"/>
-</svg>
+</g></svg>
index be69d2a..ffd4285 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7.5 18.5c-.6-.7-.9-1.5-.9-2.5 0-2.2 1.8-4 4-4s4 1.8 4 4-1.8 4-4 4c-.7 0-1.3-.1-1.8-.4l-2.7 2.7L5 21.2l2.5-2.7zm3.1-.3c1.2 0 2.2-1 2.2-2.3 0-1.2-1-2.2-2.2-2.2-1.2 0-2.3 1-2.3 2.2.1 1.3 1.1 2.3 2.3 2.3zm4.2-5.2c-.3-.4-.6-.7-1-1h5.8v-1h-9s-1.2 0-2 .6V3h13v13c0 1.7-1.3 3-3 3h-3.8c.6-.8 1-1.9 1-3h3.8v-1h-3.9l-.3-1h4.2v-1h-4.8zm-.2-8h-4v5h4V5zm5 0h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9z"/>
-</svg>
+</g></svg>
index 47768e9..48ae222 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7.5 18.5c-.6-.7-.9-1.5-.9-2.5 0-2.2 1.8-4 4-4s4 1.8 4 4-1.8 4-4 4c-.7 0-1.3-.1-1.8-.4l-2.7 2.7L5 21.2l2.5-2.7zm3.1-.3c1.2 0 2.2-1 2.2-2.3 0-1.2-1-2.2-2.2-2.2-1.2 0-2.3 1-2.3 2.2.1 1.3 1.1 2.3 2.3 2.3zm4.2-5.2c-.3-.4-.6-.7-1-1h5.8v-1h-9s-1.2 0-2 .6V3h13v13c0 1.7-1.3 3-3 3h-3.8c.6-.8 1-1.9 1-3h3.8v-1h-3.9l-.3-1h4.2v-1h-4.8zm-.2-8h-4v5h4V5zm5 0h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9z"/>
-</svg>
+</g></svg>
index 2ac7914..884e55c 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 678916b..599aa69 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index e45e450..64b9181 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index e4ca34b..18799af 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 8e7de03..2ced027 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><g fill="#fff">
     <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
-</svg>
+</g></svg>
index c062052..0f02b30 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><g fill="#36c">
     <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
-</svg>
+</g></svg>
index 91304a1..faa925c 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><g fill="#fff">
     <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
-</svg>
+</g></svg>
index 6185c05..5e234a0 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><g fill="#36c">
     <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
-</svg>
+</g></svg>
index 3762e49..61caba7 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
-</svg>
+</g></svg>
index 7a6b31c..157430b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
-</svg>
+</g></svg>
index 6f76157..49416aa 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
-</svg>
+</g></svg>
index 0a3d93d..d064356 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
-</svg>
+</g></svg>
index 886a34c..b854834 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
-</svg>
+</g></svg>
index 2b0d7df..a9cdb3c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
-</svg>
+</g></svg>
index 0f5bf22..eca628f 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 84be0ce..ba896ef 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index b5ce7e7..60d7fd4 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 9H4l2.5-3z"/>
-</svg>
+</g></svg>
index e1f33d8..863fe92 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 9H4l2.5-3z"/>
-</svg>
+</g></svg>
index 8ed760b..b2fbe9e 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 9h5l-2.5-3z"/>
-</svg>
+</g></svg>
index 34ec7c0..46c5048 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 9h5l-2.5-3z"/>
-</svg>
+</g></svg>
index f01a779..b703094 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <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-8zm5 9H7v-2h10v2z"/>
-</svg>
+</g></svg>
index 2807149..97f21c3 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<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-8zm5 9H7v-2h10v2z"/>
-</svg>
+</g></svg>
index abcc7e0..e3648cf 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<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-8zm5 9H7v-2h10v2z"/>
-</svg>
+</g></svg>
index f14a008..b02b5c7 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 18h3L14 6h-3L6 18h3l1.25-3h4.5L16 18zm-4.917-5L12.5 9.6l1.417 3.4h-2.834z" id="bold-a"/>
-</svg>
+</g></svg>
index 6bf90f6..4f051bf 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 18h3L14 6h-3L6 18h3l1.25-3h4.5L16 18zm-4.917-5L12.5 9.6l1.417 3.4h-2.834z" id="bold-a"/>
-</svg>
+</g></svg>
index ed986c8..ab901fb 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-arab-ain">
         <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.12-.25.34-.66.65l-.09.06c-1.233.93-2.42 1.394-3.56 1.394-1.14 0-2.043-.33-2.71-.99-.65-.66-.973-1.56-.973-2.7.006-1.353.567-2.572 1.685-3.657v-.044l-.606-.55a.952.952 0 0 1-.222-.63c0-.49.24-1.11.72-1.863.65-1.045 1.302-1.565 1.957-1.56.886.005 1.618.42 2.194 1.246.325.48-.03.55-1.064.22-.843-.33-1.528-.05-2.055.826l.016.074 1.125.866.05.005c1.405-.497 2.42-.74 3.044-.725-.06.116-.14.36-.244.732a27.75 27.75 0 0 1-.304.982l-.125.372-.386.05c-1.743.24-2.992.716-3.745 1.43-.465.463-.7.972-.704 1.524"/>
     </g>
-</svg>
+</g></svg>
index 081c571..d905f22 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-arab-ain">
         <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.12-.25.34-.66.65l-.09.06c-1.233.93-2.42 1.394-3.56 1.394-1.14 0-2.043-.33-2.71-.99-.65-.66-.973-1.56-.973-2.7.006-1.353.567-2.572 1.685-3.657v-.044l-.606-.55a.952.952 0 0 1-.222-.63c0-.49.24-1.11.72-1.863.65-1.045 1.302-1.565 1.957-1.56.886.005 1.618.42 2.194 1.246.325.48-.03.55-1.064.22-.843-.33-1.528-.05-2.055.826l.016.074 1.125.866.05.005c1.405-.497 2.42-.74 3.044-.725-.06.116-.14.36-.244.732a27.75 27.75 0 0 1-.304.982l-.125.372-.386.05c-1.743.24-2.992.716-3.745 1.43-.465.463-.7.972-.704 1.524"/>
     </g>
-</svg>
+</g></svg>
index d8ecaa0..e02613e 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-arab-dad">
         <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.478 0-.99.205-1.54.616l-.505.38.006.024c1.085.066 1.935.1 2.55.1h.315c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006M10.38 14.6c-.016-.905-.33-1.87-.937-2.9l1.294-1.73.118.15c.267.337.504.925.713 1.767l.064.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.383.003.85.194 1.394.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.064l-.142.43c-.254.67-.463 1.112-.625 1.323-.724.937-1.785 1.405-3.182 1.405-1.71-.006-2.56-.92-2.56-2.74.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
-</svg>
+</g></svg>
index c314577..bbf7a38 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-arab-dad">
         <path id="arab-dad" d="M16.41 8.232l-1.675-.665L15.43 6l1.687.64-.707 1.592m.775 3.078c-.51-.286-1-.427-1.476-.423-.478 0-.99.205-1.54.616l-.505.38.006.024c1.085.066 1.935.1 2.55.1h.315c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006M10.38 14.6c-.016-.905-.33-1.87-.937-2.9l1.294-1.73.118.15c.267.337.504.925.713 1.767l.064.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.383.003.85.194 1.394.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.193.31-.474.555-.845.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.064l-.142.43c-.254.67-.463 1.112-.625 1.323-.724.937-1.785 1.405-3.182 1.405-1.71-.006-2.56-.92-2.56-2.74.003-.94.278-1.814.824-2.618.15-.216.298-.367.444-.454.225-.133.288-.09.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
     </g>
-</svg>
+</g></svg>
index c8467bb..1d9ea40 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-armn-to">
         <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.28a1.43 1.43 0 0 0 .273-.517c.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078a.905.905 0 0 0-.383.258c-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.21.18.39.29.53.12.13.25.23.39.29.14.05.276.07.406.07m-2.97-7.84a2.67 2.67 0 0 0-.975.45 2.1 2.1 0 0 0-.672.813c-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04a4.227 4.227 0 0 1 1.234-1.467c.52-.39 1.13-.685 1.83-.883a8.114 8.114 0 0 1 2.225-.297c.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.34.49.73.64 1.17.15.43.226 1.09.226 1.61h1.36v2.04h-1.36v1.6c0 .58-.102 1.09-.31 1.54-.21.44-.49.81-.844 1.11-.35.302-.834.53-1.297.687-.465.15-.954.226-1.47.226-.51 0-.997-.08-1.46-.235a3.46 3.46 0 0 1-1.22-.703 3.452 3.452 0 0 1-.836-1.174c-.203-.472-.304-1.027-.304-1.662s.1-1.18.32-1.64c.21-.46.49-.684.85-.976.35-.297.76-.513 1.22-.648.452-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36a2.26 2.26 0 0 0-.77-.767 3.234 3.234 0 0 0-.986-.427c-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
-</svg>
+</g></svg>
index 10b5fdc..4bb91c9 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-armn-to">
         <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.28a1.43 1.43 0 0 0 .273-.517c.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078a.905.905 0 0 0-.383.258c-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.21.18.39.29.53.12.13.25.23.39.29.14.05.276.07.406.07m-2.97-7.84a2.67 2.67 0 0 0-.975.45 2.1 2.1 0 0 0-.672.813c-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04a4.227 4.227 0 0 1 1.234-1.467c.52-.39 1.13-.685 1.83-.883a8.114 8.114 0 0 1 2.225-.297c.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.34.49.73.64 1.17.15.43.226 1.09.226 1.61h1.36v2.04h-1.36v1.6c0 .58-.102 1.09-.31 1.54-.21.44-.49.81-.844 1.11-.35.302-.834.53-1.297.687-.465.15-.954.226-1.47.226-.51 0-.997-.08-1.46-.235a3.46 3.46 0 0 1-1.22-.703 3.452 3.452 0 0 1-.836-1.174c-.203-.472-.304-1.027-.304-1.662s.1-1.18.32-1.64c.21-.46.49-.684.85-.976.35-.297.76-.513 1.22-.648.452-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36a2.26 2.26 0 0 0-.77-.767 3.234 3.234 0 0 0-.986-.427c-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
     </g>
-</svg>
+</g></svg>
index 49236c3..0a03c2e 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-b">
         <path id="b" d="M7 18h6c2 0 4-1 4-3 0-1.064.01-1.975-1.99-3 2-.975 1.99-1.935 1.99-3 0-2-2-3-4-3H7v12zm7-8c0 1 0 1-2 1h-2V8h2c2 0 2 0 2 1v1zm-2 6h-2v-3h2c2 0 2 0 2 1v1s0 1-2 1z"/>
     </g>
-</svg>
+</g></svg>
index 4980f22..adf665e 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-b">
         <path id="b" d="M7 18h6c2 0 4-1 4-3 0-1.064.01-1.975-1.99-3 2-.975 1.99-1.935 1.99-3 0-2-2-3-4-3H7v12zm7-8c0 1 0 1-2 1h-2V8h2c2 0 2 0 2 1v1zm-2 6h-2v-3h2c2 0 2 0 2 1v1s0 1-2 1z"/>
     </g>
-</svg>
+</g></svg>
index 8cbe378..cd67107 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-cyrl-be">
         <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.4-.255-1.07-.397-2.02-.397H10v3"/>
     </g>
-</svg>
+</g></svg>
index 9476ae8..22c3bf5 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-cyrl-be">
         <path id="cyrl-be" d="M7 6h9v2h-6v3h2.65c.892 0 1.632.11 2.22.327.587.218 1.087.622 1.5 1.21.42.59.63 1.188.63 1.98 0 .812-.21 1.397-.63 1.976-.418.578-.897.974-1.436 1.187-.533.213-1.295.32-2.286.32h-5.65m4.768-2c.75 0 1.28-.05 1.584-.12.305-.077.57-.247.792-.51.23-.26.343-.472.343-.854 0-.557-.2-.868-.596-1.12-.4-.255-1.07-.397-2.02-.397H10v3"/>
     </g>
-</svg>
+</g></svg>
index dc7b0df..42ba193 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-cyrl-te">
         <path id="te" d="M11 18V8H7V6h11v2h-4v10"/>
     </g>
-</svg>
+</g></svg>
index 6554299..73a76a3 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-cyrl-te">
         <path id="te" d="M11 18V8H7V6h11v2h-4v10"/>
     </g>
-</svg>
+</g></svg>
index 32980c1..4643345 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-cyrl-zhe">
         <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.112-.337.3-.452.55-.115.25-.286.76-.512 1.533-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.455.603 1.103.944 1.943L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09A.726.726 0 0 0 13 12.78V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772a6.357 6.357 0 0 1-.392-1.04c-.222-.76-.39-1.26-.505-1.52-.11-.25-.26-.44-.45-.57-.18-.12-.49-.18-.912-.18H6V6l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
-</svg>
+</g></svg>
index a6694e7..3b7fee9 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-cyrl-zhe">
         <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.18.705-.447.168-.266.4-.873.698-1.82.39-1.242.79-2.034 1.197-2.375.403-.336 1.075-.504 2.014-.504L18 6v1.78l-.386-.008c-.4 0-.69.062-.878.187-.186.112-.337.3-.452.55-.115.25-.286.76-.512 1.533-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.455.603 1.103.944 1.943L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09A.726.726 0 0 0 13 12.78V18h-2v-5.22c-.226 0-.382.077-.546.23-.164.15-.368.517-.612 1.097l-.246.56-.113.253L8.313 18H6l1.33-3.267c.327-.808.635-1.447.923-1.92.293-.476.663-.793 1.11-.95-.355-.244-.603-.5-.745-.772a6.357 6.357 0 0 1-.392-1.04c-.222-.76-.39-1.26-.505-1.52-.11-.25-.26-.44-.45-.57-.18-.12-.49-.18-.912-.18H6V6l.386.008c.953 0 1.63.17 2.034.512.4.347.79 1.136 1.177 2.366.3.954.534 1.564.698 1.83.168.26.377.405.705.438V6.002"/>
     </g>
-</svg>
+</g></svg>
index a2fbced..5cf18ff 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-f">
         <path id="f" d="M16 8V6H8v12h3v-5h4v-2h-4V8z"/>
     </g>
-</svg>
+</g></svg>
index cbd80ed..cce2c59 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-f">
         <path id="f" d="M16 8V6H8v12h3v-5h4v-2h-4V8z"/>
     </g>
-</svg>
+</g></svg>
index 5aeb9a4..2741c4f 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-g">
         <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26A7.994 7.994 0 0 1 11.97 18c-1.23 0-2.303-.253-3.217-.76a4.908 4.908 0 0 1-2.062-2.185A7.008 7.008 0 0 1 6 11.96c0-1.208.26-2.282.77-3.222.518-.94 1.27-1.66 2.26-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435a2.433 2.433 0 0 0-.94-1.346c-.454-.34-1.022-.5-1.707-.5-1.038 0-1.864.32-2.48.97-.61.65-.914 1.61-.914 2.89 0 1.375.31 2.41.93 3.1.62.687 1.434 1.03 2.44 1.03.497 0 .995-.095 1.49-.285.505-.196 1.334-.57 1.69-.846v-.868"/>
     </g>
-</svg>
+</g></svg>
index 77d543f..9e85e63 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-g">
         <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26A7.994 7.994 0 0 1 11.97 18c-1.23 0-2.303-.253-3.217-.76a4.908 4.908 0 0 1-2.062-2.185A7.008 7.008 0 0 1 6 11.96c0-1.208.26-2.282.77-3.222.518-.94 1.27-1.66 2.26-2.16.754-.386 1.693-.58 2.816-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435a2.433 2.433 0 0 0-.94-1.346c-.454-.34-1.022-.5-1.707-.5-1.038 0-1.864.32-2.48.97-.61.65-.914 1.61-.914 2.89 0 1.375.31 2.41.93 3.1.62.687 1.434 1.03 2.44 1.03.497 0 .995-.095 1.49-.285.505-.196 1.334-.57 1.69-.846v-.868"/>
     </g>
-</svg>
+</g></svg>
index b8ba06f..c6eea49 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-geor-man">
         <path id="geor-man" d="M13.832 14.06c0-1.714-.394-2.572-1.182-2.572-.868 0-1.302.78-1.302 2.338-.01 1.624.42 2.436 1.295 2.436.793 0 1.19-.734 1.19-2.2m2.167 0C16 16.686 14.884 18 12.65 18 10.218 18 9 16.614 9 13.84c0-2.737 1.217-4.105 3.65-4.105.842 0 1.183.63 1.183.63v-1.58c0-.788-.45-1.183-1.347-1.183-.572 0-.858.374-.858 1.123h-2.34C9.29 6.908 10.35 6 12.462 6 14.83 6 16.01 6.946 16 8.84"/>
     </g>
-</svg>
+</g></svg>
index 04dc619..bca4a1a 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-geor-man">
         <path id="geor-man" d="M13.832 14.06c0-1.714-.394-2.572-1.182-2.572-.868 0-1.302.78-1.302 2.338-.01 1.624.42 2.436 1.295 2.436.793 0 1.19-.734 1.19-2.2m2.167 0C16 16.686 14.884 18 12.65 18 10.218 18 9 16.614 9 13.84c0-2.737 1.217-4.105 3.65-4.105.842 0 1.183.63 1.183.63v-1.58c0-.788-.45-1.183-1.347-1.183-.572 0-.858.374-.858 1.123h-2.34C9.29 6.908 10.35 6 12.462 6 14.83 6 16.01 6.946 16 8.84"/>
     </g>
-</svg>
+</g></svg>
index 8d92de4..a5516ed 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-l">
         <path id="l" d="M8 18V6h3v10h5v2"/>
     </g>
-</svg>
+</g></svg>
index 7aa3a8e..44178b7 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-l">
         <path id="l" d="M8 18V6h3v10h5v2"/>
     </g>
-</svg>
+</g></svg>
index 023f0ad..528efe8 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-n">
         <path id="n" d="M7 18V6h3l4 8V6h3v12h-3l-4-8v8H7"/>
     </g>
-</svg>
+</g></svg>
index 0ed4acd..d686921 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-n">
         <path id="n" d="M7 18V6h3l4 8V6h3v12h-3l-4-8v8H7"/>
     </g>
-</svg>
+</g></svg>
index 2b8c035..c1549dc 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="bold-v">
         <path id="v" d="M10.5 18L6 6h3l3 8 3-8h3l-4.5 12"/>
     </g>
-</svg>
+</g></svg>
index a6d9a25..a94a50c 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="bold-v">
         <path id="v" d="M10.5 18L6 6h3l3 8 3-8h3l-4.5 12"/>
     </g>
-</svg>
+</g></svg>
index 061ad41..83265e4 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 7c-1.7 0-3 1.3-3 3 0-1.7-1.3-3-3-3H3v13h6c1.7 0 3 1 3 2 0-1 1.3-2 3-2h6V7h-6zm5 12h-5c-1.7 0-2 .4-2 .4v-8.9C13 9.1 14.1 8 15.5 8H20v11z"/>
-</svg>
+</g></svg>
index 626a020..89fff50 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 7c-1.7 0-3 1.3-3 3 0-1.7-1.3-3-3-3H3v13h6c1.7 0 3 1 3 2 0-1 1.3-2 3-2h6V7h-6zm5 12h-5c-1.7 0-2 .4-2 .4v-8.9C13 9.1 14.1 8 15.5 8H20v11z"/>
-</svg>
+</g></svg>
index f9be70f..256ee41 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 7c1.7 0 3 1.3 3 3 0-1.7 1.3-3 3-3h6v13h-6c-1.7 0-3 1-3 2 0-1-1.3-2-3-2H3V7h6zM4 19h5c1.7 0 2 .4 2 .4v-8.9C11 9.1 9.9 8 8.5 8H4v11z"/>
-</svg>
+</g></svg>
index 948472d..150fd95 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 7c1.7 0 3 1.3 3 3 0-1.7 1.3-3 3-3h6v13h-6c-1.7 0-3 1-3 2 0-1-1.3-2-3-2H3V7h6zM4 19h5c1.7 0 2 .4 2 .4v-8.9C11 9.1 9.9 8 8.5 8H4v11z"/>
-</svg>
+</g></svg>
index 44a7710..e511a8a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index d321cea..9f1c2b4 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index c2cf8c7..f949201 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 9c752a8..4967af9 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 28fac21..8f41c1a 100644 (file)
@@ -1,5 +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"><style>* { fill: #ffffff }</style>
+<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.9-.3.3-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4.3.3.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-.4-.3-.3-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9.3-.3.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8 0-.3.1-.6.3-.8zM12 8c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3m0-1c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z"/>
     <path d="M12 8c1.7 0 3 1.3 3 3s-1.3 3-3 3-3-1.3-3-3 1.3-3 3-3m0-1c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z"/>
-</svg>
+</g></svg>
index 1f61e46..3ee311a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 14a79cb..d3dd3fe 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 1290997..98238cf 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 80839ad..e2ad0ab 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index d65c8fe..f933a1e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zM5 9h3v2H5V9zm4 0h3v2H9V9zm4 0h3v2h-3V9zm4 0h3v2h-3V9zM5 12h3v2H5v-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2zM5 15h3v2H7c-1.195 0-2-.805-2-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2z"/>
-</svg>
+</g></svg>
index f28c0ad..97d6a58 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm4 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zM5 9h3v2H5V9zm4 0h3v2H9V9zm4 0h3v2h-3V9zm4 0h3v2h-3V9zM5 12h3v2H5v-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2zM5 15h3v2H7c-1.195 0-2-.805-2-2zm4 0h3v2H9v-2zm4 0h3v2h-3v-2zm4 0h3v2h-3v-2z"/>
-</svg>
+</g></svg>
index 4d1fd8b..dccd818 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zM7 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm13 3h-3v2h3V9zm-4 0h-3v2h3V9zm-4 0H9v2h3V9zM8 9H5v2h3V9zm12 3h-3v2h3v-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2zm12 3h-3v2h1c1.195 0 2-.805 2-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2z"/>
-</svg>
+</g></svg>
index 0e530c0..3757322 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-4 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zM7 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm13 3h-3v2h3V9zm-4 0h-3v2h3V9zm-4 0H9v2h3V9zM8 9H5v2h3V9zm12 3h-3v2h3v-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2zm12 3h-3v2h1c1.195 0 2-.805 2-2zm-4 0h-3v2h3v-2zm-4 0H9v2h3v-2zm-4 0H5v2h3v-2z"/>
-</svg>
+</g></svg>
index 3391d4e..c0f8dc0 100644 (file)
@@ -1,6 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <g id="cancel">
         <path id="circle-with-strike" d="M12 5.022a6.98 6.98 0 0 0-.003 13.956 6.98 6.98 0 0 0-.002-13.956zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93A5.113 5.113 0 0 1 6.884 12zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93a5.112 5.112 0 0 1 5.114 5.113c0 1.092-.364 3.542-.93 2.93z"/>
     </g>
-</svg>
+</g></svg>
index 80de8e0..893486d 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="cancel">
         <path id="circle-with-strike" d="M12 5.022a6.98 6.98 0 0 0-.003 13.956 6.98 6.98 0 0 0-.002-13.956zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93A5.113 5.113 0 0 1 6.884 12zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93a5.112 5.112 0 0 1 5.114 5.113c0 1.092-.364 3.542-.93 2.93z"/>
     </g>
-</svg>
+</g></svg>
index c36387f..18698eb 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="cancel">
         <path id="circle-with-strike" d="M12 5.022a6.98 6.98 0 0 0-.003 13.956 6.98 6.98 0 0 0-.002-13.956zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93A5.113 5.113 0 0 1 6.884 12zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93a5.112 5.112 0 0 1 5.114 5.113c0 1.092-.364 3.542-.93 2.93z"/>
     </g>
-</svg>
+</g></svg>
index 228a503..f4e15cf 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 13.1l8.9 8.9c.8-.8.8-2 0-2.8l-6.1-6.1 6-6.1c.8-.8.8-2 0-2.8L7 13.1z"/>
-</svg>
+</g></svg>
index 4b2594b..0558da7 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 13.1l8.9 8.9c.8-.8.8-2 0-2.8l-6.1-6.1 6-6.1c.8-.8.8-2 0-2.8L7 13.1z"/>
-</svg>
+</g></svg>
index a24bc6c..6a74d9b 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16.5 13.1L7.6 22c-.8-.8-.8-2 0-2.8l6.1-6.1-6-6.1c-.8-.8-.8-2 0-2.8l8.8 8.9z"/>
-</svg>
+</g></svg>
index 0b5cb95..3274959 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16.5 13.1L7.6 22c-.8-.8-.8-2 0-2.8l6.1-6.1-6-6.1c-.8-.8-.8-2 0-2.8l8.8 8.9z"/>
-</svg>
+</g></svg>
index cf819c3..4d4bf6e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 16l8.9-8.9c-.8-.8-2-.8-2.8 0L12 13.2l-6.1-6c-.8-.8-2-.8-2.8 0L12 16z"/>
-</svg>
+</g></svg>
index 4239e3b..e651488 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 16l8.9-8.9c-.8-.8-2-.8-2.8 0L12 13.2l-6.1-6c-.8-.8-2-.8-2.8 0L12 16z"/>
-</svg>
+</g></svg>
index 625df49..9686715 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 6.5l8.9 8.9c-.8.8-2 .8-2.8 0L12 9.3l-6.1 6c-.8.8-2 .8-2.8 0L12 6.5z"/>
-</svg>
+</g></svg>
index d87a183..6f1b02d 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 6.5l8.9 8.9c-.8.8-2 .8-2.8 0L12 9.3l-6.1 6c-.8.8-2 .8-2.8 0L12 6.5z"/>
-</svg>
+</g></svg>
index 96c111e..e5590a3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
-    <g id="regular-expression">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
-</svg>
+</g></svg>
index a81eb4c..ff6e102 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
-    <g id="regular-expression">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
-</svg>
+</g></svg>
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +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="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
index 63b425a..4cea8a3 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index 059f0bd..3609a7b 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index b7a1be0..7f3299a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index 63b425a..4cea8a3 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
-</svg>
+</g></svg>
index 82e64cd..2c20c6e 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <circle cx="12" cy="12" r="6"/>
-</svg>
+</g></svg>
index 96d39e8..88a64fe 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <circle cx="12" cy="12" r="6"/>
-</svg>
+</g></svg>
index 82e64cd..2c20c6e 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <circle cx="12" cy="12" r="6"/>
-</svg>
+</g></svg>
index 4c6db6f..9e2795e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 12h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zm5-2h2v16H8c-1.7 0-3-1.3-3-3V3h8v7l1.5-2 1.5 2V3z"/>
-</svg>
+</g></svg>
index e4b3aaf..677ee81 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 12h9v-1H7v1zm0 2h9v-1H7v1zm0 2h9v-1H7v1zm4-9H7v1h4V7zm0 2H7v1h4V9zm0-4H7v1h4V5zm5-2h2v16H8c-1.7 0-3-1.3-3-3V3h8v7l1.5-2 1.5 2V3z"/>
-</svg>
+</g></svg>
index 86781cf..131a271 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 12H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zM7 3H5v16h10c1.7 0 3-1.3 3-3V3h-8v7L8.5 8 7 10V3z"/>
-</svg>
+</g></svg>
index c51cfc9..b19d640 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 12H7v-1h9v1zm0 2H7v-1h9v1zm0 2H7v-1h9v1zm-4-9h4v1h-4V7zm0 2h4v1h-4V9zm0-4h4v1h-4V5zM7 3H5v16h10c1.7 0 3-1.3 3-3V3h-8v7L8.5 8 7 10V3z"/>
-</svg>
+</g></svg>
index bbe321a..b43d794 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index 1cc7c1d..2fa1f2f 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
-</svg>
+</g></svg>
index 9ad3926..8376288 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 12l-4-3V8h2v5l1.7 1.2c1.3.9 1 1.9.3 2.8z"/>
-</svg>
+</g></svg>
index a1a307b..4c8accd 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 12l-4-3V8h2v5l1.7 1.2c1.3.9 1 1.9.3 2.8z"/>
-</svg>
+</g></svg>
index 0ea5a9a..6de3e30 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="close">
         <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
     </g>
-</svg>
+</g></svg>
index dd053f1..122340e 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="close">
         <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
     </g>
-</svg>
+</g></svg>
index 848a0e3..67dc06c 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="close">
         <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
     </g>
-</svg>
+</g></svg>
index 6d53d36..c6494de 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="close">
         <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
     </g>
-</svg>
+</g></svg>
index 224f1e7..e9179bf 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="code">
         <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.48.808-.59.335-.11.872-.25 1.835-.25H10v1h-.752c-.457 0-.77.19-.936.406-.167.216-.312.446-.312 1.07v1.856c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.31.238.76.238 1.49v1.86c0 .62.145.85.312 1.06.166.22.48.41.936.41H10v1H8.973c-.963 0-1.5-.133-1.835-.248a1.578 1.578 0 0 1-.808-.59 1.68 1.68 0 0 1-.257-.626C6.023 16.283 6 15.9 6 15.386V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index d4f3de8..ce0e492 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="code">
         <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1V7.614c0-.514.024-.896.073-1.142.054-.252.14-.463.257-.633.204-.28.473-.48.808-.59.335-.11.872-.25 1.835-.25H10v1h-.752c-.457 0-.77.19-.936.406-.167.216-.312.446-.312 1.07v1.856c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.31.238.76.238 1.49v1.86c0 .62.145.85.312 1.06.166.22.48.41.936.41H10v1H8.973c-.963 0-1.5-.133-1.835-.248a1.578 1.578 0 0 1-.808-.59 1.68 1.68 0 0 1-.257-.626C6.023 16.283 6 15.9 6 15.386V13c0-1 0-1-1-1H4z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index 9cd2f78..7b7305a 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="collapse">
         <path id="arrow" d="M6.697 15.714L12 10.412l5.303 5.302 1.414-1.414L12 7.583 5.283 14.3z"/>
     </g>
-</svg>
+</g></svg>
index b0253f2..29157ae 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="collapse">
         <path id="arrow" d="M6.697 15.714L12 10.412l5.303 5.302 1.414-1.414L12 7.583 5.283 14.3z"/>
     </g>
-</svg>
+</g></svg>
index 2ddc29c..e6f6bb1 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="comment">
         <path id="speech-bubble" d="M15 6H9a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3v3l3-3h3a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3z"/>
     </g>
-</svg>
+</g></svg>
index 31087f3..63bdad9 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="comment">
         <path id="speech-bubble" d="M15 6H9a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3v3l3-3h3a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3z"/>
     </g>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png
new file mode 100644 (file)
index 0000000..7bb19e3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg
new file mode 100644 (file)
index 0000000..b19dd0d
--- /dev/null
@@ -0,0 +1,7 @@
+<?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">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png
new file mode 100644 (file)
index 0000000..eb76fd0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg
new file mode 100644 (file)
index 0000000..fed1164
--- /dev/null
@@ -0,0 +1,7 @@
+<?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">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?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="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
index cffcd94..a9ef321 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 5H4v12c0 1.6 1.3 3 3 3h12V8c0-1.7-1.4-3-3-3zM7.5 17c-.8 0-1.5-.7-1.5-1.5S6.7 14 7.5 14s1.5.7 1.5 1.5S8.3 17 7.5 17zm0-6C6.7 11 6 10.3 6 9.5S6.7 8 7.5 8 9 8.7 9 9.5 8.3 11 7.5 11zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm0-6c-.8 0-1.5-.7-1.5-1.5S14.7 8 15.5 8s1.5.7 1.5 1.5-.7 1.5-1.5 1.5z"/>
-</svg>
+</g></svg>
index 55ee4a5..a63bf03 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 5H4v12c0 1.6 1.3 3 3 3h12V8c0-1.7-1.4-3-3-3zM7.5 17c-.8 0-1.5-.7-1.5-1.5S6.7 14 7.5 14s1.5.7 1.5 1.5S8.3 17 7.5 17zm0-6C6.7 11 6 10.3 6 9.5S6.7 8 7.5 8 9 8.7 9 9.5 8.3 11 7.5 11zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm4 3c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm0-6c-.8 0-1.5-.7-1.5-1.5S14.7 8 15.5 8s1.5.7 1.5 1.5-.7 1.5-1.5 1.5z"/>
-</svg>
+</g></svg>
index ab88fb0..344e2fb 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 5h12v12c0 1.6-1.3 3-3 3H4V8c0-1.7 1.4-3 3-3zm8.5 12c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm0-6c.8 0 1.5-.7 1.5-1.5S16.3 8 15.5 8 14 8.7 14 9.5s.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5S8.3 14 7.5 14 6 14.7 6 15.5 6.7 17 7.5 17zm0-6c.8 0 1.5-.7 1.5-1.5S8.3 8 7.5 8 6 8.7 6 9.5 6.7 11 7.5 11z"/>
-</svg>
+</g></svg>
index 9e3a64e..fd4f13b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 5h12v12c0 1.6-1.3 3-3 3H4V8c0-1.7 1.4-3 3-3zm8.5 12c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm0-6c.8 0 1.5-.7 1.5-1.5S16.3 8 15.5 8 14 8.7 14 9.5s.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5s-.7-1.5-1.5-1.5-1.5.7-1.5 1.5.7 1.5 1.5 1.5zm-4 3c.8 0 1.5-.7 1.5-1.5S8.3 14 7.5 14 6 14.7 6 15.5 6.7 17 7.5 17zm0-6c.8 0 1.5-.7 1.5-1.5S8.3 8 7.5 8 6 8.7 6 9.5 6.7 11 7.5 11z"/>
-</svg>
+</g></svg>
index 53fc581..9c64f50 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 18l8-10H4z"/>
-</svg>
+</g></svg>
index 6fe38de..aaa6ec9 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 18l8-10H4z"/>
-</svg>
+</g></svg>
index 9c7573e..312b19e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 11h-3V4c-1.7 0-3 1.3-3 3v4H7l4.5 5 4.5-5zm1 2v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index 98a86bb..8d69423 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 11h-3V4c-1.7 0-3 1.3-3 3v4H7l4.5 5 4.5-5zm1 2v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index a89fd52..141ca5c 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 11h3V4c1.7 0 3 1.3 3 3v4h3l-4.5 5L7 11zm-1 2v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index c5cbee5..4767dc1 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 11h3V4c1.7 0 3 1.3 3 3v4h3l-4.5 5L7 11zm-1 2v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index 1e9b853..138f8e8 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 2L5 14l-1 5 5-1L21 6c0-2-2-4-4-4zM7.2 15.5c-.3-.3-.7-.6-1-.8C8.5 12.4 17.5 3.3 17.5 3.3c.4.1.7.3 1 .7L7.2 15.5z"/>
-</svg>
+</g></svg>
index c7e6f15..40446e9 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 2L5 14l-1 5 5-1L21 6c0-2-2-4-4-4zM7.2 15.5c-.3-.3-.7-.6-1-.8C8.5 12.4 17.5 3.3 17.5 3.3c.4.1.7.3 1 .7L7.2 15.5z"/>
-</svg>
+</g></svg>
index 36f6d48..0b9a4af 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 2l12 12 1 5-5-1L4 6c0-2 2-4 4-4zm9.8 13.5c.3-.3.7-.6 1-.8C16.5 12.4 7.5 3.3 7.5 3.3c-.4.1-.7.3-1 .7l11.3 11.5z"/>
-</svg>
+</g></svg>
index a77a027..8c0b879 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 2l12 12 1 5-5-1L4 6c0-2 2-4 4-4zm9.8 13.5c.3-.3.7-.6 1-.8C16.5 12.4 7.5 3.3 7.5 3.3c-.4.1-.7.3-1 .7l11.3 11.5z"/>
-</svg>
+</g></svg>
index 00a7670..82b39cd 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z"/>
-</svg>
+</g></svg>
index 335b9a5..618debe 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-1.5 0h-3V3s0-1.5 1.5-1.5c1.48.06 1.5 1.5 1.5 1.5zM13 9.6l-6.8 6.9c-.3-.3-.7-.6-1-.8 1.4-1.4 5-5 7.8-7.9V6l-9 9-1 5 5-1 8-8h-3z"/>
-</svg>
+</g></svg>
index 3d6c9f1..9b9f765 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z"/>
-</svg>
+</g></svg>
index 96ad98d..ad87acc 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 4V3s0-3 3-3 3 3 3 3v1h1v6H3V4zm1.5 0h3V3s0-1.5-1.5-1.5C5.52 1.56 5.5 3 5.5 3zM12 9.6l6.8 6.9c.3-.3.7-.6 1-.8-1.4-1.4-5-5-7.8-7.9V6l9 9 1 5-5-1-8-8h3z"/>
-</svg>
+</g></svg>
index 8b6022d..a34235e 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14.9 2.8c.9 0 1.8.2 2.7.6.9.4 1.6.9 1.9 1.6-2.8.1-5 1.1-6.6 3.1l1.3 2-6.7-.3L8 3l1.7 2c1.8-1.5 3.5-2.2 5.2-2.2z"/>
     <path d="M15.2 11.1l-2.6-.1-5.4 5.5c-.3-.3-.7-.6-1-.8.9-.9 2.8-2.8 4.7-4.8H9.1L5 15l-1 5 5-1 7.8-7.8-1.6-.1zM20.6 6c-1.7 0-3.2.5-4.4 1.4l-.9.9.8 1.3.9 1.4 4-4c0-.3-.1-.7-.2-1h-.2z"/>
-</svg>
+</g></svg>
index d231819..c7d9bbe 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14.9 2.8c.9 0 1.8.2 2.7.6.9.4 1.6.9 1.9 1.6-2.8.1-5 1.1-6.6 3.1l1.3 2-6.7-.3L8 3l1.7 2c1.8-1.5 3.5-2.2 5.2-2.2z"/>
     <path d="M15.2 11.1l-2.6-.1-5.4 5.5c-.3-.3-.7-.6-1-.8.9-.9 2.8-2.8 4.7-4.8H9.1L5 15l-1 5 5-1 7.8-7.8-1.6-.1zM20.6 6c-1.7 0-3.2.5-4.4 1.4l-.9.9.8 1.3.9 1.4 4-4c0-.3-.1-.7-.2-1h-.2z"/>
-</svg>
+</g></svg>
index ff45759..1aea7a8 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10.1 2.8c-.9 0-1.8.2-2.7.6-.9.4-1.6.9-1.9 1.6 2.8.1 5 1.1 6.6 3.1l-1.3 2 6.7-.3L17 3l-1.7 2c-1.8-1.5-3.5-2.2-5.2-2.2z"/>
     <path d="M9.8 11.1l2.6-.1 5.4 5.5c.3-.3.7-.6 1-.8-.9-.9-2.8-2.8-4.7-4.8h1.8L20 15l1 5-5-1-7.8-7.8 1.6-.1zM4.4 6c1.7 0 3.2.5 4.4 1.4l.9.9-.8 1.3L8 11 4 7c0-.3.1-.7.2-1h.2z"/>
-</svg>
+</g></svg>
index fbb984b..a743341 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10.1 2.8c-.9 0-1.8.2-2.7.6-.9.4-1.6.9-1.9 1.6 2.8.1 5 1.1 6.6 3.1l-1.3 2 6.7-.3L17 3l-1.7 2c-1.8-1.5-3.5-2.2-5.2-2.2z"/>
     <path d="M9.8 11.1l2.6-.1 5.4 5.5c.3-.3.7-.6 1-.8-.9-.9-2.8-2.8-4.7-4.8h1.8L20 15l1 5-5-1-7.8-7.8 1.6-.1zM4.4 6c1.7 0 3.2.5 4.4 1.4l.9.9-.8 1.3L8 11 4 7c0-.3.1-.7.2-1h.2z"/>
-</svg>
+</g></svg>
index a2a651d..e5b0d24 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM14 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM20 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4z"/>
-</svg>
+</g></svg>
index a56ec14..0675f6e 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM14 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4zM20 13c0 .6-.2 1-.6 1.4-.4.4-.9.6-1.4.6-.6 0-1-.2-1.4-.6-.4-.4-.6-.9-.6-1.4s.2-1 .6-1.4c.4-.4.9-.6 1.4-.6s1 .2 1.4.6c.4.4.6.9.6 1.4z"/>
-</svg>
+</g></svg>
index 7c034f0..a8260ae 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="expand">
         <path id="arrow" d="M17.303 8.283L12 13.586 6.697 8.283 5.283 9.697 12 16.414l6.717-6.717z"/>
     </g>
-</svg>
+</g></svg>
index 13d3b24..e7f6aa5 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="expand">
         <path id="arrow" d="M17.303 8.283L12 13.586 6.697 8.283 5.283 9.697 12 16.414l6.717-6.717z"/>
     </g>
-</svg>
+</g></svg>
index af20a07..e9ddf2c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="external">
         <path id="box" d="M4 4h6v2H6v12h12v-4h2v6H4z"/>
         <path id="arrow" d="M12.42 4H20v7.58l-2.84-2.846L12.892 13 11 11.106l4.264-4.266z"/>
     </g>
-</svg>
+</g></svg>
index 6688713..dcc2962 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="external">
         <path id="box" d="M4 4h6v2H6v12h12v-4h2v6H4z"/>
         <path id="arrow" d="M12.42 4H20v7.58l-2.84-2.846L12.892 13 11 11.106l4.264-4.266z"/>
     </g>
-</svg>
+</g></svg>
index 754374a..59cd0aa 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="external">
         <path id="box" d="M20 4h-6v2h4v12H6v-4H4v6h16z"/>
         <path id="arrow" d="M11.58 4H4v7.58l2.84-2.846L11.108 13 13 11.106 8.736 6.84z"/>
     </g>
-</svg>
+</g></svg>
index 440fbd2..8d0cd25 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="external">
         <path id="box" d="M20 4h-6v2h4v12H6v-4H4v6h16z"/>
         <path id="arrow" d="M11.58 4H4v7.58l2.84-2.846L11.108 13 13 11.106 8.736 6.84z"/>
     </g>
-</svg>
+</g></svg>
index b456478..4e11ebc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-invert.png differ
index 3a63516..158860e 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
-    <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
+</g></svg>
index 383c78e..94524c0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye-progressive.png differ
index a9b1dde..ae45685 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
-    <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
+</g></svg>
index 62c82c0..eb5f963 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/eye.png differ
index 343e9cf..cec85d0 100644 (file)
@@ -1,5 +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="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
-    <circle cx="12" cy="14" r="2"/>
+    <path id="sclera" d="M12 6C7 6 1 12 1 12s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+    <circle id="pupil" r="2" cy="12" cx="12"/>
 </svg>
index e070981..7e1567d 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19.4 12.7c.7-.8 1.2-1.7 1.4-2.7h-1.6c-.9 2.5-3.9 4.4-7.7 4.6h-.1c-3.7-.2-6.8-2.1-7.7-4.6H2.2c.2 1 .8 1.9 1.4 2.7l-2 2 .7.7 2-2c.8.6 1.7 1.2 2.7 1.7l-1 2.8.9.3 1-2.8c1 .3 2 .6 3.1.6v3h1v-3c1.1-.1 2.2-.3 3.1-.6l1 2.8.9-.3-1-2.8c1-.4 1.9-1 2.6-1.7l2 2 .7-.7-1.9-2z"/>
-</svg>
+</g></svg>
index 4515bdb..5d0d44d 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19.4 12.7c.7-.8 1.2-1.7 1.4-2.7h-1.6c-.9 2.5-3.9 4.4-7.7 4.6h-.1c-3.7-.2-6.8-2.1-7.7-4.6H2.2c.2 1 .8 1.9 1.4 2.7l-2 2 .7.7 2-2c.8.6 1.7 1.2 2.7 1.7l-1 2.8.9.3 1-2.8c1 .3 2 .6 3.1.6v3h1v-3c1.1-.1 2.2-.3 3.1-.6l1 2.8.9-.3-1-2.8c1-.4 1.9-1 2.6-1.7l2 2 .7-.7-1.9-2z"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg
new file mode 100644 (file)
index 0000000..8ed4be9
--- /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"><g fill="#fff">
+    <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/mediawiki/images/icons/feedback-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png
new file mode 100644 (file)
index 0000000..28405a8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..49425d0
--- /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"><g fill="#36c">
+    <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/mediawiki/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /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="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"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f4e7932
--- /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"><g fill="#fff">
+    <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/mediawiki/images/icons/feedback-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png
new file mode 100644 (file)
index 0000000..27bcc2d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..413ea34
--- /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"><g fill="#36c">
+    <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/mediawiki/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /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="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"/>
+</svg>
index 5df95e9..928e954 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="find">
         <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.37c.19.19.534.15.78-.096s.315-.59.126-.78l-2.37-2.377-.185-.094a3.545 3.545 0 0 0 .655-2.03c0-1.92-1.55-3.47-3.47-3.47zm0 1.656a1.8 1.8 0 0 1 1.813 1.813 1.83 1.83 0 0 1-1.82 1.84c-1.01 0-1.844-.83-1.844-1.847s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53a4.443 4.443 0 0 1 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
-</svg>
+</g></svg>
index b13bef8..65fc298 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="find">
         <path id="magnifying-glass" d="M13.656 11c-1.92 0-3.5 1.548-3.5 3.47 0 1.92 1.58 3.5 3.5 3.5.75 0 1.432-.253 2-.657l.094.156 2.375 2.37c.19.19.534.15.78-.096s.315-.59.126-.78l-2.37-2.377-.185-.094a3.545 3.545 0 0 0 .655-2.03c0-1.92-1.55-3.47-3.47-3.47zm0 1.656a1.8 1.8 0 0 1 1.813 1.813 1.83 1.83 0 0 1-1.82 1.84c-1.01 0-1.844-.83-1.844-1.847s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53a4.443 4.443 0 0 1 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
-</svg>
+</g></svg>
index 6277016..612c1dc 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="find">
         <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.37c-.19.19-.534.15-.78-.096s-.315-.59-.126-.78l2.37-2.377.185-.094a3.545 3.545 0 0 1-.655-2.03c0-1.92 1.55-3.47 3.47-3.47zm0 1.656A1.8 1.8 0 0 0 9.53 14.47c0 1.01.806 1.84 1.818 1.84 1.01 0 1.844-.83 1.844-1.845s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53a4.443 4.443 0 0 0-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
-</svg>
+</g></svg>
index 6e21dcc..f18e0ad 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="find">
         <path id="magnifying-glass" d="M11.344 11c1.92 0 3.5 1.548 3.5 3.47 0 1.92-1.58 3.5-3.5 3.5-.75 0-1.432-.253-2-.657l-.094.156-2.375 2.37c-.19.19-.534.15-.78-.096s-.315-.59-.126-.78l2.37-2.377.185-.094a3.545 3.545 0 0 1-.655-2.03c0-1.92 1.55-3.47 3.47-3.47zm0 1.656A1.8 1.8 0 0 0 9.53 14.47c0 1.01.806 1.84 1.818 1.84 1.01 0 1.844-.83 1.844-1.845s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53a4.443 4.443 0 0 0-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
-</svg>
+</g></svg>
index 659d524..f6c2213 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 6.5V5c-1.4-1.5-5.2-1.2-6 0V4H7v15h1v-7c.8-.8 3.4-.9 5-.5V13c1.2 1.5 4.3 1.2 5 0V6c-.7.7-2.7.9-4 .5z"/>
-</svg>
+</g></svg>
index 0d94ea8..c1f681a 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 6.5V5c-1.4-1.5-5.2-1.2-6 0V4H7v15h1v-7c.8-.8 3.4-.9 5-.5V13c1.2 1.5 4.3 1.2 5 0V6c-.7.7-2.7.9-4 .5z"/>
-</svg>
+</g></svg>
index bc0df6c..ce147ec 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
        <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index 1c0e572..661f234 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
        <path d="M10.3 7.5V6c1.4-1.5 5.2-1.2 6 0V5h1v15h-1v-7c-.8-.8-3.4-.9-5-.5V14c-1.2 1.5-4.3 1.2-5 0V7c.7.7 2.7.9 4 .5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index 641d37b..4c6d402 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M2 5v15h20V5H2zm15 11H8c-.6 0-1-.4-1-1V9h3l2 1h5v6z"/>
-</svg>
+</g></svg>
index af577c6..e1f8be3 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M2 5v15h20V5H2zm15 11H8c-.6 0-1-.4-1-1V9h3l2 1h5v6z"/>
-</svg>
+</g></svg>
index 1f27fdb..d2bfb08 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M22 5v15H2V5h20zM7 16h9c.6 0 1-.4 1-1V9h-3l-2 1H7v6z"/>
-</svg>
+</g></svg>
index 30e27f9..ba0eb3b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M22 5v15H2V5h20zM7 16h9c.6 0 1-.4 1-1V9h-3l-2 1H7v6z"/>
-</svg>
+</g></svg>
index 3012dd9..588bef0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
     <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
-</svg>
+</g></svg>
index 53adc94..a9a0aa0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
     <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
     <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
-</svg>
+</g></svg>
index 82156c4..cffafb7 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
-</svg>
+</g></svg>
index 646c6c2..9ef43f0 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
-</svg>
+</g></svg>
index 94f0385..64a71fa 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z"/>
-</svg>
+</g></svg>
index 0e016df..b44b385 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z"/>
-</svg>
+</g></svg>
index 95b83c2..82f466e 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M11.4 5.4V2.2c.3 0 .6.1.9.4.3.3.4.5.4.8v2h-1.3zm-5.2-.5c.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-.4-.3-.3-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9.3-.3.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8 0-.3.1-.6.3-.8zM12 7c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4zm-3 4c0-1.7 1.3-3 3-3v6c-1.7 0-3-1.3-3-3z"/>
-</svg>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png
new file mode 100644 (file)
index 0000000..57dfe53
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-constructive.svg
new file mode 100644 (file)
index 0000000..dbdacc6
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png
new file mode 100644 (file)
index 0000000..f28e35d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-invert.svg
new file mode 100644 (file)
index 0000000..febf500
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png
new file mode 100644 (file)
index 0000000..57dfe53
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..dbdacc6
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png
new file mode 100644 (file)
index 0000000..d52a908
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-ltr.svg
new file mode 100644 (file)
index 0000000..cfb17d8
--- /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="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+    <path d="M10.1 11l-3.9.5L9 14.3l-.6 3.9 3.6-1.7-.1-9z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png
new file mode 100644 (file)
index 0000000..d24672a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-constructive.svg
new file mode 100644 (file)
index 0000000..2f45816
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png
new file mode 100644 (file)
index 0000000..c9429ae
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-invert.svg
new file mode 100644 (file)
index 0000000..11b99df
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png
new file mode 100644 (file)
index 0000000..d24672a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..2f45816
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png
new file mode 100644 (file)
index 0000000..4991b65
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/halfStar-rtl.svg
new file mode 100644 (file)
index 0000000..c649b50
--- /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="M12 7.4L10.3 11l-4 .5L9 14.3l-.5 3.9 3.5-1.7 3.6 1.7-.6-3.9 2.8-2.8-3.9-.5L12 7.4M12 4l2.8 5.6 6.2.9-4.5 4.4 1.1 6.1-5.6-3-5.5 3 1-6.2L3 10.4l6.3-.9L12 4z"/>
+    <path d="M12.1 7.5l1.8 3.5 3.9.5-2.8 2.8.6 3.9-3.6-1.7z"/>
+</svg>
index 817b768..1607feb 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 6fbe267..816e672 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 385bb7b..7e0a658 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="help">
         <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.92 9.916 9.92 5.48 0 9.92-4.44 9.92-9.913 0-5.477-4.44-9.915-9.913-9.915zm.002 18a8.084 8.084 0 1 1 0-16.168 8.084 8.084 0 0 1 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M11 16h2v2h-2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 863d202..8a2e3ca 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="help">
         <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.92 9.916 9.92 5.48 0 9.92-4.44 9.92-9.913 0-5.477-4.44-9.915-9.913-9.915zm.002 18a8.084 8.084 0 1 1 0-16.168 8.084 8.084 0 0 1 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M11 16h2v2h-2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 9c6c365..2d78cb8 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="help">
         <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.92-9.916 9.92-5.48 0-9.92-4.44-9.92-9.913 0-5.477 4.44-9.915 9.913-9.915zm-.002 18a8.084 8.084 0 1 0 0-16.168 8.084 8.084 0 0 0 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M13 16h-2v2h2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 9dd7edf..878c72c 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="help">
         <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.92-9.916 9.92-5.48 0-9.92-4.44-9.92-9.913 0-5.477 4.44-9.915 9.913-9.915zm-.002 18a8.084 8.084 0 1 0 0-16.168 8.084 8.084 0 0 0 0 16.168z"/>
         <g id="question-mark">
@@ -7,4 +7,4 @@
             <path id="bottom" d="M13 16h-2v2h2z"/>
         </g>
     </g>
-</svg>
+</g></svg>
index 900a565..fa0a150 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
         <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12a9.86 9.86 0 0 0 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616A7.982 7.982 0 0 1 4.004 12a8.084 8.084 0 0 1 16.167.004 8.08 8.08 0 0 1-8.08 8.085 7.975 7.975 0 0 1-3.21-.68L8.05 21.04a9.81 9.81 0 0 0 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
-</svg>
+</g></svg>
index 29f0c89..bd26dfb 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="history">
         <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.56 1.702-6.56s-4.35 5.364-4.877 6.7c-.463 1.168 1.46 2.21 2.346 1.678 1.9.55 4.834 1.244 4.834 1.244z"/>
         <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12a9.86 9.86 0 0 0 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616A7.982 7.982 0 0 1 4.004 12a8.084 8.084 0 0 1 16.167.004 8.08 8.08 0 0 1-8.08 8.085 7.975 7.975 0 0 1-3.21-.68L8.05 21.04a9.81 9.81 0 0 0 4.045.874C17.563 21.914 22 17.476 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
-</svg>
+</g></svg>
index 784b183..04354ce 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="image">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-11v13H4V6z"/>
     </g>
-</svg>
+</g></svg>
index ed5c051..252099f 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="image">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-11v13H4V6z"/>
     </g>
-</svg>
+</g></svg>
index 226690e..875fe66 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="image">
         <path id="mountains" d="M6 17l3-3 2 1 3-3 4 5zM4 6v13h16V6z"/>
     </g>
-</svg>
+</g></svg>
index e506ea5..d015e8b 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="image">
         <path id="mountains" d="M6 17l3-3 2 1 3-3 4 5zM4 6v13h16V6z"/>
     </g>
-</svg>
+</g></svg>
index 3a883bc..78c40b3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M16 17l-3-3-2 1-3-3-4 5zm-1-8v4h3v6H2V6h9v3z"/>
         <path id="add" d="M22 6h-4V2h-2v4h-4v2h4v4h2V8h4z"/>
     </g>
-</svg>
+</g></svg>
index 47878dc..b898956 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M16 17l-3-3-2 1-3-3-4 5zm-1-8v4h3v6H2V6h9v3z"/>
         <path id="add" d="M22 6h-4V2h-2v4h-4v2h4v4h2V8h4z"/>
     </g>
-</svg>
+</g></svg>
index e1afd33..e76b43f 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M8 17l3-3 2 1 3-3 4 5zm1-8v4H6v6h16V6h-9v3z"/>
         <path id="add" d="M2 6h4V2h2v4h4v2H8v4H6V8H2z"/>
     </g>
-</svg>
+</g></svg>
index 089da6a..61e2ed4 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M8 17l3-3 2 1 3-3 4 5zm1-8v4H6v6h16V6h-9v3z"/>
         <path id="add" d="M2 6h4V2h2v4h4v2H8v4H6V8H2z"/>
     </g>
-</svg>
+</g></svg>
index e0022a5..c2d3d8a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M2 4v14h2V6h15V4H2zm3 3v13h16V7H5zm6 6l3 3 2-1 3 3H7l4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index d0bc4ad..4029c27 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M2 4v14h2V6h15V4H2zm3 3v13h16V7H5zm6 6l3 3 2-1 3 3H7l4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index 8769498..b32a86a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 4v14h-2V6H4V4h17zm-3 3v13H2V7h16zm-6 6l-3 3-2-1-3 3h12l-4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index ccba6ea..21f4a80 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 4v14h-2V6H4V4h17zm-3 3v13H2V7h16zm-6 6l-3 3-2-1-3 3h12l-4-5z" id="imageGallery"/>
-</svg>
+</g></svg>
index 74f8e58..b726d4b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-5v7H4V6h8v6z"/>
         <path id="lock" d="M18.5 5h-3V4s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM20 5V4s0-3-3-3-3 3-3 3v1h-1v6h8V5z"/>
     </g>
-</svg>
+</g></svg>
index 635dd52..e726c03 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-5v7H4V6h8v6z"/>
         <path id="lock" d="M18.5 5h-3V4s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM20 5V4s0-3-3-3-3 3-3 3v1h-1v6h8V5z"/>
     </g>
-</svg>
+</g></svg>
index faf34b9..c92cd7f 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="imageAdd">
         <path id="mountains" d="M7 17l3-3 2 1 3-3 4 5zm-2-5v7h16V6h-8v6z"/>
         <path id="lock" d="M6.5 5h3V4s0-1.5-1.5-1.5C6.5 2.56 6.5 4 6.5 4zM5 5V4s0-3 3-3 3 3 3 3v1h1v6H4V5z"/>
     </g>
-</svg>
+</g></svg>
index dd65b62..8381443 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="imageAdd">
         <path id="mountains" d="M7 17l3-3 2 1 3-3 4 5zm-2-5v7h16V6h-8v6z"/>
         <path id="lock" d="M6.5 5h3V4s0-1.5-1.5-1.5C6.5 2.56 6.5 4 6.5 4zM5 5V4s0-3 3-3 3 3 3 3v1h1v6H4V5z"/>
     </g>
-</svg>
+</g></svg>
index 589187a..04768db 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 8v8l5-4-5-4z"/>
-</svg>
+</g></svg>
index f5e9b04..2734879 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 8v8l5-4-5-4z"/>
-</svg>
+</g></svg>
index 544bbb3..c70f991 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zM21 8v8l-5-4 5-4z"/>
-</svg>
+</g></svg>
index 1509cd5..992ed82 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zM21 8v8l-5-4 5-4z"/>
-</svg>
+</g></svg>
index c80da91..f3519f3 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="info">
         <path id="circled-i" d="M11.5 17a5.5 5.5 0 1 1 0-11 5.5 5.5 0 0 1 0 11zm0-12a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm.5 5v4h1v1h-3v-1h1v-3h-1v-1zm-1-2h1v1h-1z"/>
     </g>
-</svg>
+</g></svg>
index 648386e..1e2ecf8 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="info">
         <path id="circled-i" d="M11.5 17a5.5 5.5 0 1 1 0-11 5.5 5.5 0 0 1 0 11zm0-12a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm.5 5v4h1v1h-3v-1h1v-3h-1v-1zm-1-2h1v1h-1z"/>
     </g>
-</svg>
+</g></svg>
index f274352..7a52242 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-a">
         <path id="a" d="M14.667 6h-1.372l-7 12H8l2.333-4h4L15 18h1.667l-2-12zm-3.75 7l2.527-4.333.723 4.333h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index 3ac0de6..2431aeb 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-a">
         <path id="a" d="M14.667 6h-1.372l-7 12H8l2.333-4h4L15 18h1.667l-2-12zm-3.75 7l2.527-4.333.723 4.333h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index 20bca5e..4d68c38 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-arab-keheh-jeem">
         <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.87 1.125a1.26 1.26 0 0 0 .065.78c.19.406.54.575.844.814l.093-.12.53.627c.14.165.345.514.47.94.138.462.08.724 0 1.124h-3.44c-.34 0-.592.007-.766-.02-.34-.053-.256-.21-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.046-.698-.185-1.094-.155-.36.026-.77.24-1.03.72-.25.447-.436.838-.66 1.28l.75-.47c.23-.14.486-.226.72-.218.158.004.276.053.407.093-.234.204-.51.4-.72.56-.3.26-.704.69-.908 1-.403.617-.694 1.086-.875 1.78-.18.69.003 1.34.468 1.75.426.38.846.52 1.28.566.65.064 1.206.092 2-.19.658-.23 1.022-.552 1.5-.97-.882.11-1.816.09-2.53.033-.87-.07-1.268-.386-1.47-.596-.27-.283-.306-.64-.155-1.22a1.44 1.44 0 0 1 .25-.53c.17-.228.363-.435.593-.656.45-.436 1.01-.737 1.46-.94-.042.207-.104.444-.052.69.05.23.25.38.44.47.26.12.506.152.69.153 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.343-.845.13-.5.094-1.062-.094-1.625a4.812 4.812 0 0 0-.72-1.406c-.336-.444-.675-.83-1-1.22 1.256-.815 2.715-1.24 3.97-1.688.12-.452.222-.926.31-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.1.813.336-.303.627-.674.876-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
-</svg>
+</g></svg>
index eb04c40..8c23b30 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-arab-keheh-jeem">
         <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.3-.77.712-.87 1.125a1.26 1.26 0 0 0 .065.78c.19.406.54.575.844.814l.093-.12.53.627c.14.165.345.514.47.94.138.462.08.724 0 1.124h-3.44c-.34 0-.592.007-.766-.02-.34-.053-.256-.21-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.046-.698-.185-1.094-.155-.36.026-.77.24-1.03.72-.25.447-.436.838-.66 1.28l.75-.47c.23-.14.486-.226.72-.218.158.004.276.053.407.093-.234.204-.51.4-.72.56-.3.26-.704.69-.908 1-.403.617-.694 1.086-.875 1.78-.18.69.003 1.34.468 1.75.426.38.846.52 1.28.566.65.064 1.206.092 2-.19.658-.23 1.022-.552 1.5-.97-.882.11-1.816.09-2.53.033-.87-.07-1.268-.386-1.47-.596-.27-.283-.306-.64-.155-1.22a1.44 1.44 0 0 1 .25-.53c.17-.228.363-.435.593-.656.45-.436 1.01-.737 1.46-.94-.042.207-.104.444-.052.69.05.23.25.38.44.47.26.12.506.152.69.153 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.343-.845.13-.5.094-1.062-.094-1.625a4.812 4.812 0 0 0-.72-1.406c-.336-.444-.675-.83-1-1.22 1.256-.815 2.715-1.24 3.97-1.688.12-.452.222-.926.31-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.1.813.336-.303.627-.674.876-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
-</svg>
+</g></svg>
index ecc636f..799a785 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-arab-meem">
         <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627a8.31 8.31 0 0 1-1.082 1.833c-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.692-.98a24.1 24.1 0 0 1 .94-1.09c.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.765-.293l.065-.128c.01-.11-.01-.24-.052-.394a2.403 2.403 0 0 0-.232-.522c-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.378.125-.05-.247 1.555-1.71 2.705-2.566 3.45-2.566.38 0 .67.13.86.394.134.195.25.6.343 1.21l.202 1.2c.105.586.24.895.408.925"/>
     </g>
-</svg>
+</g></svg>
index 5742238..b22bd45 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-arab-meem">
         <path id="arab-meem" d="M16 9.73l-.93 2.19h-4.663c-.48 0-.857.12-1.135.366l-.06.11c-.185 2.016-.503 3.558-.956 4.627a8.31 8.31 0 0 1-1.082 1.833c-.177.226-.22.186-.126-.12l.142-.503.17-.67.234-.87.002-.008.202-1.045.258-1.41.353-1.907c.19-.312.42-.638.692-.98a24.1 24.1 0 0 1 .94-1.09c.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.765-.293l.065-.128c.01-.11-.01-.24-.052-.394a2.403 2.403 0 0 0-.232-.522c-.22-.428-.438-.64-.654-.64-.294 0-.915.268-1.864.805-.36.208-.378.125-.05-.247 1.555-1.71 2.705-2.566 3.45-2.566.38 0 .67.13.86.394.134.195.25.6.343 1.21l.202 1.2c.105.586.24.895.408.925"/>
     </g>
-</svg>
+</g></svg>
index 38c45d5..6b56e37 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-armn-sha">
         <path id="armn-sha" d="M11.564 7.678a3.073 3.073 0 0 0-.93-.268c-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.33 1.67-2.625-1.165a1.867 1.867 0 0 0-.433-.134 2.45 2.45 0 0 0-.576-.06 4.88 4.88 0 0 0-1.663.28c-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283a5.48 5.48 0 0 0-.63 1.71c-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.044-.08 1.48-.236a3.488 3.488 0 0 0 1.135-.66c.325-.29.59-.634.795-1.034.21-.4.363-.84.458-1.322l.11-.56h1.6l-.12.59a5.925 5.925 0 0 1-.676 1.844 5.19 5.19 0 0 1-1.214 1.423c-.488.395-1.053.7-1.694.923a6.573 6.573 0 0 1-2.106.324c-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.437-.573-.97-.678-1.608-.105-.64-.078-1.366.08-2.186.125-.66.346-1.274.66-1.836A6.332 6.332 0 0 1 8.792 9.54a5.955 5.955 0 0 1 1.496-1.072 5.87 5.87 0 0 1 1.732-.57l-.465-.23"/>
     </g>
-</svg>
+</g></svg>
index c2d580e..50ee046 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-armn-sha">
         <path id="armn-sha" d="M11.564 7.678a3.073 3.073 0 0 0-.93-.268c-.35-.047-.75-.07-1.197-.07h-1.11L8.587 6h1.723c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.33 1.67-2.625-1.165a1.867 1.867 0 0 0-.433-.134 2.45 2.45 0 0 0-.576-.06 4.88 4.88 0 0 0-1.663.28c-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283a5.48 5.48 0 0 0-.63 1.71c-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.044-.08 1.48-.236a3.488 3.488 0 0 0 1.135-.66c.325-.29.59-.634.795-1.034.21-.4.363-.84.458-1.322l.11-.56h1.6l-.12.59a5.925 5.925 0 0 1-.676 1.844 5.19 5.19 0 0 1-1.214 1.423c-.488.395-1.053.7-1.694.923a6.573 6.573 0 0 1-2.106.324c-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.437-.573-.97-.678-1.608-.105-.64-.078-1.366.08-2.186.125-.66.346-1.274.66-1.836A6.332 6.332 0 0 1 8.792 9.54a5.955 5.955 0 0 1 1.496-1.072 5.87 5.87 0 0 1 1.732-.57l-.465-.23"/>
     </g>
-</svg>
+</g></svg>
index 882af04..01afe88 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-c">
         <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04a4.835 4.835 0 0 1-3.015 1.03c-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.63-1.78-.63-1.368 0-2.475.63-3.32 1.89-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.78 0 1.48-.26 2.1-.785.63-.52 1.08-1.26 1.37-2.216"/>
     </g>
-</svg>
+</g></svg>
index 29da4c6..03aa494 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-c">
         <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04a4.835 4.835 0 0 1-3.015 1.03c-1.36 0-2.438-.43-3.237-1.29C7.4 15.85 7 14.618 7 13.012c0-2.09.606-3.817 1.817-5.184C9.897 6.61 11.237 6 12.84 6c1.186 0 2.145.33 2.878.99.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.84-.453-1.464-.916-1.876-.458-.42-1.05-.63-1.78-.63-1.368 0-2.475.63-3.32 1.89-.733 1.087-1.1 2.377-1.1 3.87 0 1.194.283 2.104.848 2.732.565.628 1.3.942 2.206.942.78 0 1.48-.26 2.1-.785.63-.52 1.08-1.26 1.37-2.216"/>
     </g>
-</svg>
+</g></svg>
index 1c305e3..dcd0d94 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-d">
         <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.642.17 1.192.472 1.65.91.454.43.8.97 1.03 1.62.23.65.344 1.378.344 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.946 1.072-1.455 1.416-.504.33-1.1.582-1.794.75-.525.122-1.17.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24a3.26 3.26 0 0 0 1.05-.436 4.19 4.19 0 0 0 1.04-.975 6.652 6.652 0 0 0 .975-1.825c.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.522-.755-.87-1.27-1.04-.38-.124-.974-.186-1.78-.186H11L9.095 16.64"/>
     </g>
-</svg>
+</g></svg>
index e995e48..ff61b37 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-d">
         <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.642.17 1.192.472 1.65.91.454.43.8.97 1.03 1.62.23.65.344 1.378.344 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.946 1.072-1.455 1.416-.504.33-1.1.582-1.794.75-.525.122-1.17.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24a3.26 3.26 0 0 0 1.05-.436 4.19 4.19 0 0 0 1.04-.975 6.652 6.652 0 0 0 .975-1.825c.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.522-.755-.87-1.27-1.04-.38-.124-.974-.186-1.78-.186H11L9.095 16.64"/>
     </g>
-</svg>
+</g></svg>
index 21d3dc7..f91db71 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-e">
         <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
-</svg>
+</g></svg>
index 351d968..c5ca7b1 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-e">
         <path id="e" d="M7 18L9.474 6H18l-.282 1.367H10.77L10.02 11h6.09l-.28 1.367H9.74l-.88 4.273h7.44L16.018 18H7"/>
     </g>
-</svg>
+</g></svg>
index 5b57252..fea68a5 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-geor-kan">
         <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.62c-.055.26-.083.497-.083.71 0 .97.52 1.46 1.564 1.46 1.31 0 2.108-.724 2.39-2.17l.058-.33a3.17 3.17 0 0 0 .066-.615c0-.927-.546-1.39-1.64-1.39H10.87l.247-1.26h1.118c1.203-.004 1.91-.55 2.12-1.64.04-.18.057-.355.057-.52 0-1.144-.9-1.715-2.696-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
-</svg>
+</g></svg>
index a9ee28c..bacc38c 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-geor-kan">
         <path id="geor-kan" d="M15.057 14.663C14.617 16.888 13.223 18 10.88 18 8.96 18 8 17.213 8 15.64c0-.298.036-.624.108-.977.083-.43.245-.836.488-1.217l1.24.605-.206.62c-.055.26-.083.497-.083.71 0 .97.52 1.46 1.564 1.46 1.31 0 2.108-.724 2.39-2.17l.058-.33a3.17 3.17 0 0 0 .066-.615c0-.927-.546-1.39-1.64-1.39H10.87l.247-1.26h1.118c1.203-.004 1.91-.55 2.12-1.64.04-.18.057-.355.057-.52 0-1.144-.9-1.715-2.696-1.715L11.94 6C14.646 6 16 6.877 16 8.627c0 .248-.027.516-.082.803-.204 1.092-1.05 1.824-2.54 2.194l-.033.166c1.23.2 1.845.823 1.845 1.872 0 .21-.025.433-.074.67l-.058.332"/>
     </g>
-</svg>
+</g></svg>
index ddb927e..3919051 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-i">
         <path id="i" d="M12.5 18l.25-.995h-1.5l2.508-10.037h1.5L15.5 6h-5l-.242.968h1.5l-2.51 10.037h-1.5L7.5 18z"/>
     </g>
-</svg>
+</g></svg>
index 0ae89f9..f71f6f7 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-i">
         <path id="i" d="M12.5 18l.25-.995h-1.5l2.508-10.037h1.5L15.5 6h-5l-.242.968h1.5l-2.51 10.037h-1.5L7.5 18z"/>
     </g>
-</svg>
+</g></svg>
index 2bdddd5..b6e87b4 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-k">
         <path id="k" d="M12.018 10.652L17 6h-2l-5.31 5.234L11 6H9.5l-3 12H8l1.173-4.693 1.54-1.438C11 16 14 18 14 18h2s-4-2-3.982-7.348z"/>
     </g>
-</svg>
+</g></svg>
index 778b92c..7494e8f 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-k">
         <path id="k" d="M12.018 10.652L17 6h-2l-5.31 5.234L11 6H9.5l-3 12H8l1.173-4.693 1.54-1.438C11 16 14 18 14 18h2s-4-2-3.982-7.348z"/>
     </g>
-</svg>
+</g></svg>
index 1d48f72..ed2fe67 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="italic-s">
         <path id="s" d="M16.474 6.59l-.302 1.525a7.36 7.36 0 0 0-1.557-.628 5.432 5.432 0 0 0-1.487-.217c-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.65.302.86.207.19.733.4 1.58.63l.937.23c1.06.274 1.795.622 2.208 1.046.413.42.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.3-1.867-.55l.31-1.61a7.613 7.613 0 0 0 1.72.805c.58.18 1.155.27 1.73.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.354-1.054-.233-.242-.737-.46-1.512-.657l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.368-.584-.88-.584-1.535 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.555 0 1.1.05 1.644.146.542.1 1.085.245 1.627.442"/>
     </g>
-</svg>
+</g></svg>
index 901d0e7..0eeeb50 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="italic-s">
         <path id="s" d="M16.474 6.59l-.302 1.525a7.36 7.36 0 0 0-1.557-.628 5.432 5.432 0 0 0-1.487-.217c-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.65.302.86.207.19.733.4 1.58.63l.937.23c1.06.274 1.795.622 2.208 1.046.413.42.62 1.007.62 1.766 0 1.167-.46 2.117-1.38 2.85-.913.734-2.12 1.1-3.617 1.1-.615 0-1.232-.06-1.852-.185-.62-.12-1.242-.3-1.867-.55l.31-1.61a7.613 7.613 0 0 0 1.72.805c.58.18 1.155.27 1.73.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.354-1.054-.233-.242-.737-.46-1.512-.657l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.368-.584-.88-.584-1.535 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.555 0 1.1.05 1.644.146.542.1 1.085.245 1.627.442"/>
     </g>
-</svg>
+</g></svg>
index d9eb01e..e04818f 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
-</svg>
+</g></svg>
index 5375d92..0232e22 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
-</svg>
+</g></svg>
index bd7ba07..3487511 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
-</svg>
+</g></svg>
index e93ed43..f2eb554 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
-</svg>
+</g></svg>
index fa77f37..4b00ee7 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 7ba0a1a..e079ac6 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 2a03797..1777cec 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 308c9c0..d070568 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index b206787..2230bf5 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index b17e024..25f22c7 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index d1799f9..df9d39d 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 48fb71c..1cff12c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 4a36a34..9b8523f 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="A">
         <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
         <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
-</svg>
+</g></svg>
index 4a3893b..1adc6aa 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="A">
         <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
         <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
-</svg>
+</g></svg>
index 152a252..3ceea08 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="A">
         <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
         <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
-</svg>
+</g></svg>
index 3b11ea9..050fe1e 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="A">
         <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
     </g>
@@ -7,4 +7,4 @@
         <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
         <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
-</svg>
+</g></svg>
index f6e3d8e..491adb5 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
-</svg>
+</g></svg>
index 264811b..b91b35c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl-invert.png differ
index f6e3d8e..4842411 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
-    <path d="M20.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
+    <path d="M3.4 20h8.1v-.8c-.4 0-.8-.1-1.3-.2s-.8-.2-.8-.4v-.2c0-.1 0-.2.1-.3l1.3-3.1h5.1c.1.3.2.6.4 1 .1.4.3.7.4 1 .1.4.2.7.2.8v.4c0 .2-.2.4-.5.6-.3.2-.9.3-1.7.3v.9h6.1v-.8c-.2 0-.5-.1-.8-.1-.3-.1-.5-.1-.7-.2-.3-.2-.5-.4-.7-.6-.2-.3-.4-.6-.5-.9-.8-2-1.6-3.9-2.4-5.9-.8-2-1.7-4.1-2.7-6.5h-2.1c-1.4 3.3-2.4 6-3.2 7.9-.8 1.9-1.4 3.6-2 4.8l-.3.6c-.1.2-.3.3-.6.5-.2.1-.4.2-.7.3-.3.1-.5.1-.7.1v.8zm7.8-6l2.1-5.3 2.1 5.3h-4.2z"/>
+</g></svg>
index 4b6d298..77d7796 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.png differ
index 4b01d74..6ac62dc 100644 (file)
@@ -1,4 +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.8 20h-8.1v-.8c.4 0 .8-.1 1.3-.2s.8-.2.8-.4v-.2c0-.1 0-.2-.1-.3L13.4 15H8.3c-.1.3-.2.6-.4 1-.1.4-.3.7-.4 1-.1.4-.2.7-.2.8v.4c0 .2.2.4.5.6.3.2.9.3 1.7.3v.9H3.4v-.8c.2 0 .5-.1.8-.1.3-.1.5-.1.7-.2.3-.2.5-.4.7-.6.2-.3.4-.6.5-.9.8-2 1.6-3.9 2.4-5.9.8-2 1.7-4.1 2.7-6.5h2.1c1.4 3.3 2.4 6 3.2 7.9.8 1.9 1.4 3.6 2 4.8l.3.6c.1.2.3.3.6.5.2.1.4.2.7.3.3.1.5.1.7.1v.8zM13 14l-2.1-5.3L8.8 14H13z"/>
+    <path d="M3.4 20h8.1v-.8c-.4 0-.8-.1-1.3-.2s-.8-.2-.8-.4v-.2c0-.1 0-.2.1-.3l1.3-3.1h5.1c.1.3.2.6.4 1 .1.4.3.7.4 1 .1.4.2.7.2.8v.4c0 .2-.2.4-.5.6-.3.2-.9.3-1.7.3v.9h6.1v-.8c-.2 0-.5-.1-.8-.1-.3-.1-.5-.1-.7-.2-.3-.2-.5-.4-.7-.6-.2-.3-.4-.6-.5-.9-.8-2-1.6-3.9-2.4-5.9-.8-2-1.7-4.1-2.7-6.5h-2.1c-1.4 3.3-2.4 6-3.2 7.9-.8 1.9-1.4 3.6-2 4.8l-.3.6c-.1.2-.3.3-.6.5-.2.1-.4.2-.7.3-.3.1-.5.1-.7.1v.8zm7.8-6l2.1-5.3 2.1 5.3h-4.2z"/>
 </svg>
index c75fed3..a12fc5a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="layout-ltr">
         <path id="text" d="M5 19V5h6v8h8v6H5z"/>
         <path id="float" d="M13 5v6h6V5h-6zm5 5h-4V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index a2bd2eb..8243e34 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="layout-ltr">
         <path id="text" d="M5 19V5h6v8h8v6H5z"/>
         <path id="float" d="M13 5v6h6V5h-6zm5 5h-4V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index 9229671..165c996 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="layout-rtl">
         <path id="text" d="M5 19v-6h8V5h6v14H5z"/>
         <path id="float" d="M5 5v6h6V5H5zm1 1h4v4H6V6z"/>
     </g>
-</svg>
+</g></svg>
index eaad0a0..db1081c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="layout-rtl">
         <path id="text" d="M5 19v-6h8V5h6v14H5z"/>
         <path id="float" d="M5 5v6h6V5H5zm1 1h4v4H6V6z"/>
     </g>
-</svg>
+</g></svg>
index d5a69c0..7c36535 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15.387 4.33c-2.1 0-3.6 1.9-5.1 3.3.2 0 .5-.1.8-.1.5 0 1 .1 1.5.3.8-.8 1.6-1.7 2.8-1.7.6 0 1.3.3 1.8.7 1 1 1 2.6 0 3.6l-2.6 2.6c-.4.4-1.2.7-1.8.7-1.4 0-2.1-.9-2.6-2l-1.3 1.3c.8 1.5 2 2.6 3.8 2.6 1.2 0 2.3-.5 3-1.3l2.6-2.6c.9-.9 1.5-2 1.5-3.3-.2-2.2-2.2-4.1-4.4-4.1zm-4.3 12.1l-.9.9c-.4.4-1.2.7-1.8.7-.6 0-1.3-.3-1.8-.7-1-1-1-2.7 0-3.6l2.6-2.6c.4-.4 1.2-.7 1.8-.7 1.4 0 2.1 1 2.6 2l1.3-1.3c-.8-1.5-2-2.6-3.8-2.6-1.2 0-2.3.5-3 1.3l-2.6 2.6c-1.7 1.7-1.7 4.4 0 6 1.6 1.6 4.4 1.7 5.9 0l1.9-1.9c-.3.1-.6.1-.9.1-.5 0-.9 0-1.3-.2z"/>
-</svg>
+</g></svg>
index c62fcca..22228cd 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15.387 4.33c-2.1 0-3.6 1.9-5.1 3.3.2 0 .5-.1.8-.1.5 0 1 .1 1.5.3.8-.8 1.6-1.7 2.8-1.7.6 0 1.3.3 1.8.7 1 1 1 2.6 0 3.6l-2.6 2.6c-.4.4-1.2.7-1.8.7-1.4 0-2.1-.9-2.6-2l-1.3 1.3c.8 1.5 2 2.6 3.8 2.6 1.2 0 2.3-.5 3-1.3l2.6-2.6c.9-.9 1.5-2 1.5-3.3-.2-2.2-2.2-4.1-4.4-4.1zm-4.3 12.1l-.9.9c-.4.4-1.2.7-1.8.7-.6 0-1.3-.3-1.8-.7-1-1-1-2.7 0-3.6l2.6-2.6c.4-.4 1.2-.7 1.8-.7 1.4 0 2.1 1 2.6 2l1.3-1.3c-.8-1.5-2-2.6-3.8-2.6-1.2 0-2.3.5-3 1.3l-2.6 2.6c-1.7 1.7-1.7 4.4 0 6 1.6 1.6 4.4 1.7 5.9 0l1.9-1.9c-.3.1-.6.1-.9.1-.5 0-.9 0-1.3-.2z"/>
-</svg>
+</g></svg>
index 7bb02fa..1ea19e8 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9.025 3.6c2.1 0 3.6 1.9 5.1 3.3-.2 0-.5-.1-.8-.1-.5 0-1 .1-1.5.3-.8-.8-1.6-1.7-2.8-1.7-.6 0-1.3.3-1.8.7-1 1-1 2.6 0 3.6l2.6 2.6c.4.4 1.2.7 1.8.7 1.4 0 2.1-.9 2.6-2l1.3 1.3c-.8 1.5-2 2.6-3.8 2.6-1.2 0-2.3-.5-3-1.3l-2.6-2.6c-.9-.9-1.5-2-1.5-3.3.2-2.2 2.2-4.1 4.4-4.1zm4.3 12.1l.9.9c.4.4 1.2.7 1.8.7.6 0 1.3-.3 1.8-.7 1-1 1-2.7 0-3.6l-2.6-2.6c-.4-.4-1.2-.7-1.8-.7-1.4 0-2.1 1-2.6 2l-1.3-1.3c.8-1.5 2-2.6 3.8-2.6 1.2 0 2.3.5 3 1.3l2.6 2.6c1.7 1.7 1.7 4.4 0 6-1.6 1.6-4.4 1.7-5.9 0l-1.9-1.9c.3.1.6.1.9.1.5 0 .9 0 1.3-.2z"/>
-</svg>
+</g></svg>
index 1d6be90..3af1611 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9.025 3.6c2.1 0 3.6 1.9 5.1 3.3-.2 0-.5-.1-.8-.1-.5 0-1 .1-1.5.3-.8-.8-1.6-1.7-2.8-1.7-.6 0-1.3.3-1.8.7-1 1-1 2.6 0 3.6l2.6 2.6c.4.4 1.2.7 1.8.7 1.4 0 2.1-.9 2.6-2l1.3 1.3c-.8 1.5-2 2.6-3.8 2.6-1.2 0-2.3-.5-3-1.3l-2.6-2.6c-.9-.9-1.5-2-1.5-3.3.2-2.2 2.2-4.1 4.4-4.1zm4.3 12.1l.9.9c.4.4 1.2.7 1.8.7.6 0 1.3-.3 1.8-.7 1-1 1-2.7 0-3.6l-2.6-2.6c-.4-.4-1.2-.7-1.8-.7-1.4 0-2.1 1-2.6 2l-1.3-1.3c.8-1.5 2-2.6 3.8-2.6 1.2 0 2.3.5 3 1.3l2.6 2.6c1.7 1.7 1.7 4.4 0 6-1.6 1.6-4.4 1.7-5.9 0l-1.9-1.9c.3.1.6.1.9.1.5 0 .9 0 1.3-.2z"/>
-</svg>
+</g></svg>
index d63a791..cb63d50 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 7H9V5h12v2zM7 6c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 12c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z"/>
-</svg>
+</g></svg>
index db97e4b..0417a94 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 7H9V5h12v2zM7 6c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 12c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm14 7H9v-2h12v2zM7 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z"/>
-</svg>
+</g></svg>
index 49879fb..081fee4 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 7h12V5H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 13h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 19h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2z"/>
-</svg>
+</g></svg>
index 05b4b85..c8610c9 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 7h12V5H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 13h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zM3 19h12v-2H3v2zm14-1c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2z"/>
-</svg>
+</g></svg>
index 0d37861..c752585 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 7H8V5h13v2zm0 6H8v-2h13v2zm0 6H8v-2h13v2zM4 4h2v4H5V5H4zm-1 6V9h3v3H4v1h2v1H3v-3h2v-1zm3 10H3v-1h2v-1H4v-1h1v-1H3v-1h3z"/>
-</svg>
+</g></svg>
index d3328a1..150723f 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 7H8V5h13v2zm0 6H8v-2h13v2zm0 6H8v-2h13v2zM4 4h2v4H5V5H4zm-1 6V9h3v3H4v1h2v1H3v-3h2v-1zm3 10H3v-1h2v-1H4v-1h1v-1H3v-1h3z"/>
-</svg>
+</g></svg>
index fff182c..493654d 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 7h13V5H3zm0 6h13v-2H3zm0 6h13v-2H3zM18 4h2v4h-1V5h-1zm0 6V9h3v3h-2v1h2v1h-3v-3h2v-1zm3 10h-3v-1h2v-1h-1v-1h1v-1h-2v-1h3z"/>
-</svg>
+</g></svg>
index c4c9396..469f949 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 7h13V5H3zm0 6h13v-2H3zm0 6h13v-2H3zM18 4h2v4h-1V5h-1zm0 6V9h3v3h-2v1h2v1h-3v-3h2v-1zm3 10h-3v-1h2v-1h-1v-1h1v-1h-2v-1h3z"/>
-</svg>
+</g></svg>
index 2cfa62e..9e4aee0 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z"/>
-</svg>
+</g></svg>
index fa72442..7e11b41 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z"/>
-</svg>
+</g></svg>
index e21e755..a90a981 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 8s0-3-2.5-3S10 8 10 8v1h5zm2 0v1h2v10H9c-1.7 0-3-1.3-3-3V9h2V8s0-5 4.5-5S17 8 17 8z"/>
-</svg>
+</g></svg>
index 2daea47..1eea0ed 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z"/>
-</svg>
+</g></svg>
index cfbad71..9396317 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z"/>
-</svg>
+</g></svg>
index afd2e07..6d2fa9c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 8s0-3 2.5-3S15 8 15 8v1h-5zM8 8v1H6v10h10c1.7 0 3-1.3 3-3V9h-2V8s0-5-4.5-5S8 8 8 8z"/>
-</svg>
+</g></svg>
index 0d5cc21..da6a634 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
-</svg>
+</g></svg>
index 9e8d1a6..bdf23f4 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
-</svg>
+</g></svg>
index 07ef00f..ea35803 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z"/>
-</svg>
+</g></svg>
index 5a8617a..403bfc9 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z"/>
-</svg>
+</g></svg>
index da611ba..6d95c87 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 6c-3.9 0-7 3.1-7 7s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7zm0 13c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm-1.7-4.6c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5zm4 0c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5z"/>
-</svg>
+</g></svg>
index c24cba6..ee16220 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 6c-3.9 0-7 3.1-7 7s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7zm0 13c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm-1.7-4.6c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5zm4 0c-.7 0-1-.4-1-1.2s.3-1.2 1-1.2c.4 0 .6.2.8.6l.9-.5c-.4-.7-1-1-1.9-1-.6 0-1.1.2-1.5.6s-.6.8-.6 1.5.2 1.2.6 1.6c.4.4.9.6 1.5.6.8 0 1.4-.4 1.9-1.1l-.9-.4c-.2.3-.5.5-.8.5z"/>
-</svg>
+</g></svg>
index 9414378..27513cc 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15.4 7.8c-2-.9-2.3-2.5-2.4-2.8.1.1 2 1 2 1l-3-5-3 5 2-1s0 .8.6 2.1c.8 1.5 2.2 2.2 2.2 2.2s1.6.7 2.2 1.3l-.7.7-.5-.5-.4 1.8 1.8-.4-.5-.5.7-.7c.9 1 1.5 2.3 1.6 3.8h-1V14l-1.5 1 1.5 1v-.8h1c-.1 1.5-.6 2.8-1.6 3.8l-.7-.7.5-.5-1.8-.4.4 1.8.5-.5.7.7c-1 .9-2.3 1.5-3.8 1.6v-1h.8l-1-1.5-1 1.5h.8v1c-1.5-.1-2.8-.6-3.8-1.6l.7-.7.5.5.4-1.8-1.8.4.5.5-.7.7c-.9-1-1.5-2.3-1.6-3.8h1v.8l1.5-1L7 14v.8H6c.1-1.5.6-2.8 1.6-3.8l.7.7-.5.5 1.8.4-.4-1.8-.5.5-.7-.7-1.5-1.4A7.99 7.99 0 0 0 4 15c0 4.4 3.6 8 8 8s8-3.6 8-8c0-3.2-1.9-5.9-4.6-7.2z"/>
     <circle cx="12" cy="15" r="3"/>
-</svg>
+</g></svg>
index 5e89b3d..bb82d1f 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15.4 7.8c-2-.9-2.3-2.5-2.4-2.8.1.1 2 1 2 1l-3-5-3 5 2-1s0 .8.6 2.1c.8 1.5 2.2 2.2 2.2 2.2s1.6.7 2.2 1.3l-.7.7-.5-.5-.4 1.8 1.8-.4-.5-.5.7-.7c.9 1 1.5 2.3 1.6 3.8h-1V14l-1.5 1 1.5 1v-.8h1c-.1 1.5-.6 2.8-1.6 3.8l-.7-.7.5-.5-1.8-.4.4 1.8.5-.5.7.7c-1 .9-2.3 1.5-3.8 1.6v-1h.8l-1-1.5-1 1.5h.8v1c-1.5-.1-2.8-.6-3.8-1.6l.7-.7.5.5.4-1.8-1.8.4.5.5-.7.7c-.9-1-1.5-2.3-1.6-3.8h1v.8l1.5-1L7 14v.8H6c.1-1.5.6-2.8 1.6-3.8l.7.7-.5.5 1.8.4-.4-1.8-.5.5-.7-.7-1.5-1.4A7.99 7.99 0 0 0 4 15c0 4.4 3.6 8 8 8s8-3.6 8-8c0-3.2-1.9-5.9-4.6-7.2z"/>
     <circle cx="12" cy="15" r="3"/>
-</svg>
+</g></svg>
index 21548d9..9c4a955 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index 359d032..594cdfb 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index f7293c8..fb304f6 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M22.3 6.3c0 .2 0 .3-.1.3-.7.1-1.2.5-1.6 1.1-.1.2-.2.4-.3.7l-4.6 10.1c-.1.2-.2.3-.2.3s-.1.1-.2.1c-.2 0-.4-.1-.5-.4L12.2 13l-2.8 5.5c-.1.3-.3.4-.5.4s-.4-.1-.5-.4L4.1 8.4c-.3-.8-.6-1.2-.8-1.4-.2-.2-.5-.3-1-.4-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h4.3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.6.1-1 .2-1.1.4-.1.2 0 .6.3 1.2l3.6 8.2h.1l2.2-4.4L10 8.4c-.3-.7-.6-1.2-.8-1.4s-.5-.3-.9-.4c-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h3.6c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.4.1-.6.2-.6.4s.1.6.4 1.2l1 1.9 1-1.9c.3-.6.5-.9.5-1.1 0-.2 0-.3-.1-.4-.1-.1-.3-.1-.5-.1l-.1-.3c0-.2 0-.3.1-.3h3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.5.1-.8.2-1.1.5-.3.3-.6.7-.8 1.3l-1.3 2.8 2.5 5.2h.1l3.7-8.1c.3-.5.3-.9.2-1.2-.1-.3-.5-.4-1.1-.5-.1-.1-.1-.2-.1-.3s0-.3.1-.3h3.7c-.2.1-.2.2-.2.3z"/>
-</svg>
+</g></svg>
index 64d2e28..4c7864b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M22.3 6.3c0 .2 0 .3-.1.3-.7.1-1.2.5-1.6 1.1-.1.2-.2.4-.3.7l-4.6 10.1c-.1.2-.2.3-.2.3s-.1.1-.2.1c-.2 0-.4-.1-.5-.4L12.2 13l-2.8 5.5c-.1.3-.3.4-.5.4s-.4-.1-.5-.4L4.1 8.4c-.3-.8-.6-1.2-.8-1.4-.2-.2-.5-.3-1-.4-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h4.3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.6.1-1 .2-1.1.4-.1.2 0 .6.3 1.2l3.6 8.2h.1l2.2-4.4L10 8.4c-.3-.7-.6-1.2-.8-1.4s-.5-.3-.9-.4c-.1-.1-.1-.2-.1-.3 0-.2 0-.3.1-.3h3.6c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.4.1-.6.2-.6.4s.1.6.4 1.2l1 1.9 1-1.9c.3-.6.5-.9.5-1.1 0-.2 0-.3-.1-.4-.1-.1-.3-.1-.5-.1l-.1-.3c0-.2 0-.3.1-.3h3c.1.1.1.2.1.3 0 .2 0 .3-.1.3-.5.1-.8.2-1.1.5-.3.3-.6.7-.8 1.3l-1.3 2.8 2.5 5.2h.1l3.7-8.1c.3-.5.3-.9.2-1.2-.1-.3-.5-.4-1.1-.5-.1-.1-.1-.2-.1-.3s0-.3.1-.3h3.7c-.2.1-.2.2-.2.3z"/>
-</svg>
+</g></svg>
index fb772cf..59bb24e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 6L9 4 3 6v15l6-2 6 2 6-2V4l-6 2zM8.7 18.1L4 19.6V6.7L9 5v12.9l-.3.2zm11.3.2L15 20V7.1l.3-.1L20 5.4v12.9z"/>
-</svg>
+</g></svg>
index c148e74..bebac9c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 6L9 4 3 6v15l6-2 6 2 6-2V4l-6 2zM8.7 18.1L4 19.6V6.7L9 5v12.9l-.3.2zm11.3.2L15 20V7.1l.3-.1L20 5.4v12.9z"/>
-</svg>
+</g></svg>
index bfbfe72..06c3d10 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 6l6-2 6 2v15l-6-2-6 2-6-2V4l6 2zm6.3 12.1l4.7 1.5V6.7L15 5v12.9l.3.2zM4 18.3L9 20V7.1L8.7 7 4 5.4v12.9z"/>
-</svg>
+</g></svg>
index e928f61..a969ee6 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 6l6-2 6 2v15l-6-2-6 2-6-2V4l6 2zm6.3 12.1l4.7 1.5V6.7L15 5v12.9l.3.2zM4 18.3L9 20V7.1L8.7 7 4 5.4v12.9z"/>
-</svg>
+</g></svg>
index 548e136..a8010f9 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
-</svg>
+</g></svg>
index daf032a..717b91c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 12c0-3.9-3.1-7-7-7s-7 3.1-7 7c0 1.4.4 2.6 1.1 3.7L12 23l5.9-7.3c.7-1.1 1.1-2.3 1.1-3.7zm-7 3c-1.6 0-3-1.4-3-3s1.4-3 3-3 3 1.4 3 3-1.4 3-3 3z"/>
-</svg>
+</g></svg>
index cfa98d8..eb5e624 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
   <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
   <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
-</svg>
+</g></svg>
 
index 7cf1509..3e0ea6c 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
   <path d="M24 4h-4V0h-2v4h-4v2h4v4h2V6h4V4z"/>
   <path d="M18.9 11c.1.3.1.7.1 1 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-3.9 3.1-7 7-7 .3 0 .7 0 1 .1V7h3.9l.1.1V11h1.9zM15 12c0-1.6-1.4-3-3-3s-3 1.4-3 3 1.4 3 3 3 3-1.4 3-3z"/>
-</svg>
+</g></svg>
 
index 8b02ddb..a7a14e9 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
     <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
-</svg>
+</g></svg>
index c920c8d..9bcc436 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M0 4h4V0h2v4h4v2H6v4H4V6H0"/>
     <path d="M6 11h1V7.1l.1-.1H11V5.1c.3-.1.7-.1 1-.1 3.9 0 7 3.1 7 7 0 1.4-.4 2.6-1.1 3.7L12 23l-5.9-7.3C5.4 14.6 5 13.4 5 12c0-.3 0-.7.1-1H6zm6 4c1.65 0 3-1.35 3-3s-1.35-3-3-3-3 1.35-3 3 1.35 3 3 3z"/>
-</svg>
+</g></svg>
index 0fde2c9..cb54763 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="markup">
         <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index 891f51d..af2f0ff 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="markup">
         <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
         <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
     </g>
-</svg>
+</g></svg>
index 1c1dc22..e87b9bf 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="menu">
         <path id="lines" d="M6 15h12a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1zm-1-4v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1zm0-5v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1z"/>
     </g>
-</svg>
+</g></svg>
index a94207a..6d9edd1 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="menu">
         <path id="lines" d="M6 15h12a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1zm-1-4v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-1a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1zm0-5v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H6a1 1 0 0 0-1 1z"/>
     </g>
-</svg>
+</g></svg>
index b7a09c6..a3aae21 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 9c0-1.7-1.3-3-3-3H3v3l9 4 9-4zM3 11v6c0 1.7 1.3 3 3 3h15v-9l-9 4-9-4z"/>
-</svg>
+</g></svg>
index 47e2797..36bfd0c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 9c0-1.7-1.3-3-3-3H3v3l9 4 9-4zM3 11v6c0 1.7 1.3 3 3 3h15v-9l-9 4-9-4z"/>
-</svg>
+</g></svg>
index 63493b7..0a52eec 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 9c0-1.7 1.3-3 3-3h15v3l-9 4-9-4zm18 2v6c0 1.7-1.3 3-3 3H3v-9l9 4 9-4z"/>
-</svg>
+</g></svg>
index c7b2c68..0beb5ee 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 9c0-1.7 1.3-3 3-3h15v3l-9 4-9-4zm18 2v6c0 1.7-1.3 3-3 3H3v-9l9 4 9-4z"/>
-</svg>
+</g></svg>
index 6fce33f..7ecd512 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M19.1 17.5c-3.3 1.4-7.1-.2-8.5-3.5-1.4-3.3.2-7.1 3.5-8.5.2-.1.5-.2.7-.3-1.6-.4-3.2-.3-4.8.4C6 7.3 4 12 5.7 16c1.7 4.1 6.4 6 10.5 4.3 1.7-.7 3-1.9 3.8-3.4-.3.3-.6.4-.9.6z"/>
-</svg>
+</g></svg>
index 5d9b12a..2da24a5 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 11l-4-3v2h-3V7h2l-3-4-3 4h2v3H8V8l-4 3 4 3v-2h3v3H9l3 4 3-4h-2v-3h3v2z"/>
-</svg>
+</g></svg>
index b5b9a8a..468ad1b 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="move-ltr">
         <path id="arrow" d="M8.935 7.18l5.302 5.303-5.302 5.303L10.35 19.2l6.715-6.717-6.716-6.716z"/>
     </g>
-</svg>
+</g></svg>
index 0a9917f..dd47881 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="move-ltr">
         <path id="arrow" d="M8.935 7.18l5.302 5.303-5.302 5.303L10.35 19.2l6.715-6.717-6.716-6.716z"/>
     </g>
-</svg>
+</g></svg>
index 00ae97b..6274f6f 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 11l-4-3v2h-3V7h2l-3-4-3 4h2v3H8V8l-4 3 4 3v-2h3v3H9l3 4 3-4h-2v-3h3v2z"/>
-</svg>
+</g></svg>
index 6ba135e..264f3b6 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="move-rtl">
         <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
     </g>
-</svg>
+</g></svg>
index e98ca08..32aee25 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="move-rtl">
         <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
     </g>
-</svg>
+</g></svg>
index 8b86916..bc7fedc 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 54e3194..1ef309b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index a372d88..41e0401 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 3bcf517..a877db8 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 5f531f3..6ec8972 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17.8 5.7c-.5 0-.9.2-1.2.5s-.5.7-.5 1.2v4.3H11v-4l-6 5.5 6 5.5v-4h8v-9h-1.2z" id="line_return"/>
-</svg>
+</g></svg>
index bf7a001..b0e6aaf 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17.8 5.7c-.5 0-.9.2-1.2.5s-.5.7-.5 1.2v4.3H11v-4l-6 5.5 6 5.5v-4h8v-9h-1.2z" id="line_return"/>
-</svg>
+</g></svg>
index 34d15fd..c919608 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6.2 5.7c.5 0 .9.2 1.2.5.3.3.5.7.5 1.2v4.3H13v-4l6 5.5-6 5.5v-4H5v-9h1.2z" id="line_return"/>
-</svg>
+</g></svg>
index b209825..1547e82 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6.2 5.7c.5 0 .9.2 1.2.5.3.3.5.7.5 1.2v4.3H13v-4l6 5.5-6 5.5v-4H5v-9h1.2z" id="line_return"/>
-</svg>
+</g></svg>
index 903b3a0..69b737a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6 7v12c-.6 0-1-.4-1-1V9H4v9c0 1.1.9 2 2 2h15V7H6zm9 11H8v-1h7v1zm0-2H8v-1h7v1zm0-2H8v-1h7v1zm4 4h-3v-5h3v5zm0-7H8V9h11v2z"/>
-</svg>
+</g></svg>
index f2c23c1..df59aac 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6 7v12c-.6 0-1-.4-1-1V9H4v9c0 1.1.9 2 2 2h15V7H6zm9 11H8v-1h7v1zm0-2H8v-1h7v1zm0-2H8v-1h7v1zm4 4h-3v-5h3v5zm0-7H8V9h11v2z"/>
-</svg>
+</g></svg>
index 86bdeb0..74fa337 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 7v12c.6 0 1-.4 1-1V9h1v9c0 1.1-.9 2-2 2H4V7h15zm-9 11h7v-1h-7v1zm0-2h7v-1h-7v1zm0-2h7v-1h-7v1zm-4 4h3v-5H6v5zm0-7h11V9H6v2z"/>
-</svg>
+</g></svg>
index edcab40..5533c83 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 7v12c.6 0 1-.4 1-1V9h1v9c0 1.1-.9 2-2 2H4V7h15zm-9 11h7v-1h-7v1zm0-2h7v-1h-7v1zm0-2h7v-1h-7v1zm-4 4h3v-5H6v5zm0-7h11V9H6v2z"/>
-</svg>
+</g></svg>
index f89b415..d4cad39 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index 898c674..3fb2dd9 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index ddac4c9..346c582 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index a81c3a5..9915009 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z" id="noWikiText-rtl"/>
-</svg>
+</g></svg>
index 94fd0b8..ca20b5a 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8z"/>
-</svg>
+</g></svg>
index c7d59cc..a0f8ddc 100644 (file)
@@ -1,4 +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" id="svg3116"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><g fill="#fff">
     <path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="alert"/>
-</svg>
+</g></svg>
index fefbc9f..d828121 100644 (file)
@@ -1,4 +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" id="svg3116"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="svg3116"><g fill="#36c">
     <path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="alert"/>
-</svg>
+</g></svg>
index 6e878c3..ffd31b2 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #fff }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#fff">
     <path d="M17.8 18.6H2.5l2.7-2.7V6h15.3v9.9c0 1.53-1.17 2.7-2.7 2.7zm-7.542-4.95c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 25ca20d..7178cb4 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #36c }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#36c">
     <path d="M17.8 18.6H2.5l2.7-2.7V6h15.3v9.9c0 1.53-1.17 2.7-2.7 2.7zm-7.542-4.95c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945zm4.05 0c0 .405-.135.675-.405.945-.27.27-.607.405-.945.405-.405 0-.675-.135-.945-.405a1.332 1.332 0 0 1-.405-.945c0-.338.135-.675.405-.945.27-.27.608-.405.945-.405.338 0 .675.135.945.405.27.27.405.607.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index f483a16..61e51ca 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #fff }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#fff">
     <path d="M5.2 18.6h15.3l-2.7-2.7V6H2.5v9.9c0 1.53 1.17 2.7 2.7 2.7zm7.542-4.95c0 .405.135.675.405.945.27.27.607.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.607-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.608-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.332 1.332 0 0 0-.945-.405c-.337 0-.675.135-.945.405-.27.27-.405.608-.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 659dde8..6320f87 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>* { fill: #36c }</style>
+<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="#36c">
     <path d="M5.2 18.6h15.3l-2.7-2.7V6H2.5v9.9c0 1.53 1.17 2.7 2.7 2.7zm7.542-4.95c0 .405.135.675.405.945.27.27.607.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.607-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.334 1.334 0 0 0-.945-.405c-.338 0-.675.135-.945.405-.27.27-.405.608-.405.945zm-4.05 0c0 .405.135.675.405.945.27.27.608.405.945.405.405 0 .675-.135.945-.405.27-.27.405-.607.405-.945 0-.337-.135-.675-.405-.945a1.332 1.332 0 0 0-.945-.405c-.337 0-.675.135-.945.405-.27.27-.405.608-.405.945z" id="ongoing-conversation" fill-rule="evenodd"/>
-</svg>
+</g></svg>
index 14cf6d7..efdbe9a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 12l5 4V8l-5 4z"/>
-</svg>
+</g></svg>
index c5f296f..29e5f42 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 8h9v2h-9V8zm0 3h9v2h-9v-2zm0 3h6v2h-6v-2zm11-8H3V4h18v2zm0 14H3v-2h18v2zM3 12l5 4V8l-5 4z"/>
-</svg>
+</g></svg>
index 2d47900..3a9d2b5 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zm18-8l-5 4V8l5 4z"/>
-</svg>
+</g></svg>
index 16eb16e..560abbb 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M14 8H5v2h9V8zm0 3H5v2h9v-2zm0 3H8v2h6v-2zM3 6h18V4H3v2zm0 14h18v-2H3v2zm18-8l-5 4V8l5 4z"/>
-</svg>
+</g></svg>
index 56d505c..e9fb818 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="outline-ltr">
         <path id="text" d="M5 13h14v6H5v-6z"/>
         <path id="float" d="M5 5v6h6V5H5zm5 5H6V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index bed7254..662409a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="outline-ltr">
         <path id="text" d="M5 13h14v6H5v-6z"/>
         <path id="float" d="M5 5v6h6V5H5zm5 5H6V6h4v4z"/>
     </g>
-</svg>
+</g></svg>
index 49dd03e..74689d1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="outline-rtl">
         <path id="text" d="M19 19H5v-6h14v6z"/>
         <path id="float" d="M13 5v6h6V5h-6zm1 1h4v4h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 8c126eb..b579315 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="outline-rtl">
         <path id="text" d="M19 19H5v-6h14v6z"/>
         <path id="float" d="M13 5v6h6V5h-6zm1 1h4v4h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 2ced125..1a0340c 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm-2 12V9l6 4-6 4z"/>
-</svg>
+</g></svg>
index 8703508..5b62113 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm-2 12V9l6 4-6 4z"/>
-</svg>
+</g></svg>
index 4e1287f..b27b913 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 5c4.4 0 8 3.6 8 8s-3.6 8-8 8-8-3.6-8-8 3.6-8 8-8zm2 12V9l-6 4 6 4z"/>
-</svg>
+</g></svg>
index c8529dc..05b7749 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 5c4.4 0 8 3.6 8 8s-3.6 8-8 8-8-3.6-8-8 3.6-8 8-8zm2 12V9l-6 4 6 4z"/>
-</svg>
+</g></svg>
index cc215e7..ae4352f 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
-</svg>
+</g></svg>
index 0d68d7d..fb372de 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
-</svg>
+</g></svg>
index 8b66878..d045ff9 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z"/>
-</svg>
+</g></svg>
index 6f3ccbb..91ccc6f 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z"/>
-</svg>
+</g></svg>
index f1dba0f..27c3ab6 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18 9.9c-.7 0-1.4.3-1.8.9V6h-4c.2-.4.4-.8.4-1.2 0-1.2-1-2.2-2.2-2.2-1.3-.1-2.3.9-2.3 2.2 0 .4.2.8.4 1.2H4.1v3.6l.6-.1c1.4 0 2.5 1.1 2.5 2.5s-1.1 2.5-2.5 2.5c-.2 0-.4 0-.6-.1V18H9c-.5.4-.9 1-.9 1.8 0 1.2 1 2.2 2.3 2.2 1.2 0 2.2-1 2.2-2.2 0-.7-.3-1.4-.9-1.8h4.5v-4.5c.4.5 1 .9 1.8.9 1.2 0 2.2-1 2.2-2.2 0-1.3-1-2.3-2.2-2.3z"/>
-</svg>
+</g></svg>
index c4af15c..3406199 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18 9.9c-.7 0-1.4.3-1.8.9V6h-4c.2-.4.4-.8.4-1.2 0-1.2-1-2.2-2.2-2.2-1.3-.1-2.3.9-2.3 2.2 0 .4.2.8.4 1.2H4.1v3.6l.6-.1c1.4 0 2.5 1.1 2.5 2.5s-1.1 2.5-2.5 2.5c-.2 0-.4 0-.6-.1V18H9c-.5.4-.9 1-.9 1.8 0 1.2 1 2.2 2.3 2.2 1.2 0 2.2-1 2.2-2.2 0-.7-.3-1.4-.9-1.8h4.5v-4.5c.4.5 1 .9 1.8.9 1.2 0 2.2-1 2.2-2.2 0-1.3-1-2.3-2.2-2.3z"/>
-</svg>
+</g></svg>
index 7cce537..cee2e1a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6.3 9.9c.7 0 1.4.3 1.8.9V6h4c-.2-.4-.4-.8-.4-1.2 0-1.2 1-2.2 2.2-2.2 1.3-.1 2.3.9 2.3 2.2 0 .4-.2.8-.4 1.2h4.4v3.6l-.6-.1c-1.4 0-2.5 1.1-2.5 2.5s1.1 2.5 2.5 2.5c.2 0 .4 0 .6-.1V18h-4.9c.5.4.9 1 .9 1.8 0 1.2-1 2.2-2.3 2.2-1.2 0-2.2-1-2.2-2.2 0-.7.3-1.4.9-1.8H8.1v-4.5c-.4.5-1 .9-1.8.9-1.2 0-2.2-1-2.2-2.2 0-1.3 1-2.3 2.2-2.3z"/>
-</svg>
+</g></svg>
index 3ea0529..3f6a3a8 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6.3 9.9c.7 0 1.4.3 1.8.9V6h4c-.2-.4-.4-.8-.4-1.2 0-1.2 1-2.2 2.2-2.2 1.3-.1 2.3.9 2.3 2.2 0 .4-.2.8-.4 1.2h4.4v3.6l-.6-.1c-1.4 0-2.5 1.1-2.5 2.5s1.1 2.5 2.5 2.5c.2 0 .4 0 .6-.1V18h-4.9c.5.4.9 1 .9 1.8 0 1.2-1 2.2-2.3 2.2-1.2 0-2.2-1-2.2-2.2 0-.7.3-1.4.9-1.8H8.1v-4.5c-.4.5-1 .9-1.8.9-1.2 0-2.2-1-2.2-2.2 0-1.3 1-2.3 2.2-2.3z"/>
-</svg>
+</g></svg>
index ca34c66..7c9feea 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes">
         <path id="quote" d="M6.9 8.4c-.446.55-1.974 2.6-1.9 5.7V17h4.7c.9 0 1.6-.7 1.6-1.6V11H8.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
     </g>
     <use transform="translate(8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index f795285..c64995d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes">
         <path id="quote" d="M6.9 8.4c-.446.55-1.974 2.6-1.9 5.7V17h4.7c.9 0 1.6-.7 1.6-1.6V11H8.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
     </g>
     <use transform="translate(8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index 38e0cbc..baae1fa 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes">
         <path id="quote" d="M17.1 8.4c.446.55 1.9 2.6 1.9 5.7V17h-4.7c-.9 0-1.6-.7-1.6-1.6V11h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
     </g>
     <use transform="translate(-8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index 097b62a..255faad 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes">
         <path id="quote" d="M17.1 8.4c.446.55 1.9 2.6 1.9 5.7V17h-4.7c-.9 0-1.6-.7-1.6-1.6V11h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
     </g>
     <use transform="translate(-8)" id="quote2" width="24" height="24" xlink:href="#quote"/>
-</svg>
+</g></svg>
index 425815b..0d79616 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes-add">
         <path id="quote" d="M5.9 10.4c-.446.55-1.974 2.6-1.9 5.7V19h4.7c.9 0 1.593-.7 1.6-1.6V13H7.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
         <path id="quote2" d="M15 9.344c-.476.32-.78.677-1.094 1.062A8.76 8.76 0 0 0 12 16.094V19h4.688a1.6 1.6 0 0 0 1.625-1.594V13H15V9.344z"/>
         <path id="add" d="M18 6V2h-2v4h-4v2h4v4h2V8h4V6z"/>
     </g>
-</svg>
+</g></svg>
index be02943..755708d 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes-add">
         <path id="quote" d="M5.9 10.4c-.446.55-1.974 2.6-1.9 5.7V19h4.7c.9 0 1.593-.7 1.6-1.6V13H7.2s.05-.74.6-1.4c.453-.543 1-.9 1.6-1.2.2-.1.47-.212.6-.5.127-.282.2-.5.2-.9v-.6c-1 .2-1.744.197-2.6.6-.856.403-1.272.873-1.7 1.4z"/>
         <path id="quote2" d="M15 9.344c-.476.32-.78.677-1.094 1.062A8.76 8.76 0 0 0 12 16.094V19h4.688a1.6 1.6 0 0 0 1.625-1.594V13H15V9.344z"/>
         <path id="add" d="M18 6V2h-2v4h-4v2h4v4h2V8h4V6z"/>
     </g>
-</svg>
+</g></svg>
index c7aea7a..2a839f0 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="quotes-add">
         <path id="quote" d="M18.097 10.4c.446.55 1.974 2.6 1.9 5.7V19h-4.7c-.9 0-1.593-.7-1.6-1.6V13h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
         <path id="quote2" d="M8.997 9.344c.476.32.782.677 1.094 1.062A8.758 8.758 0 0 1 12 16.094V19H7.31c-.9 0-1.618-.694-1.625-1.594V13h3.312V9.344z"/>
         <path id="add" d="M5.997 6V2h2v4h4v2h-4v4h-2V8h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 2758fa6..a5c10b4 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="quotes-add">
         <path id="quote" d="M18.097 10.4c.446.55 1.974 2.6 1.9 5.7V19h-4.7c-.9 0-1.593-.7-1.6-1.6V13h3.1s-.05-.74-.6-1.4c-.453-.543-1-.9-1.6-1.2-.2-.1-.47-.212-.6-.5-.127-.282-.2-.5-.2-.9v-.6c1 .2 1.744.197 2.6.6.856.403 1.272.873 1.7 1.4z"/>
         <path id="quote2" d="M8.997 9.344c.476.32.782.677 1.094 1.062A8.758 8.758 0 0 1 12 16.094V19H7.31c-.9 0-1.618-.694-1.625-1.594V13h3.312V9.344z"/>
         <path id="add" d="M5.997 6V2h2v4h4v2h-4v4h-2V8h-4V6z"/>
     </g>
-</svg>
+</g></svg>
index 76ead20..0cb419e 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777A6.886 6.886 0 0 1 4.764 7H6.23a7.923 7.923 0 0 0-1.25 2.374 8.563 8.563 0 0 0 .007 5.314c.29.85.7 1.622 1.23 2.312h-1.45a6.53 6.53 0 0 1-1.314-2.223 8.126 8.126 0 0 1-.45-2.732"/>
         <path id="dot" d="M10 16a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
         <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.47-1.992.14 1.307 1.74-1.33.71-.914-1.833-.8 1.822-1.38-.698 1.296-1.74-1.98-.152.23-1.464 2.14.61-.24-2.158h1.534"/>
         <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744A6.51 6.51 0 0 1 19.236 17h-1.453a8.017 8.017 0 0 0 1.225-2.31c.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66a7.913 7.913 0 0 0-1.248-2.374h1.465a6.764 6.764 0 0 1 1.313 2.28c.3.86.45 1.782.45 2.764"/>
     </g>
-</svg>
+</g></svg>
index 82598da..5e2894b 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777A6.886 6.886 0 0 1 4.764 7H6.23a7.923 7.923 0 0 0-1.25 2.374 8.563 8.563 0 0 0 .007 5.314c.29.85.7 1.622 1.23 2.312h-1.45a6.53 6.53 0 0 1-1.314-2.223 8.126 8.126 0 0 1-.45-2.732"/>
         <path id="dot" d="M10 16a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
         <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.47-1.992.14 1.307 1.74-1.33.71-.914-1.833-.8 1.822-1.38-.698 1.296-1.74-1.98-.152.23-1.464 2.14.61-.24-2.158h1.534"/>
         <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744A6.51 6.51 0 0 1 19.236 17h-1.453a8.017 8.017 0 0 0 1.225-2.31c.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66a7.913 7.913 0 0 0-1.248-2.374h1.465a6.764 6.764 0 0 1 1.313 2.28c.3.86.45 1.782.45 2.764"/>
     </g>
-</svg>
+</g></svg>
index 64430f9..640d263 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index cf0888d..c0aa287 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 5b608cf..3c02eb4 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index cb64033..efc8223 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 9969490..8df7b16 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index d95aa42..07f23a8 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 3fbdebd..1b24dbb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <g id="secure">
         <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.49-.485 1.45-.487 1.94-.002.543.546.545 1.536.545 1.55V5H3.998z"/>
     </g>
-</svg>
+</g></svg>
index 3b755c1..ee69fc4 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
     <g id="secure">
         <path id="lock" d="M8 5h.02v-.997c0-.057.003-1.41-.833-2.255-.434-.438-.998-.66-1.68-.66s-1.244.222-1.677.66c-.837.846-.833 2.198-.832 2.25V5H3a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.49-.485 1.45-.487 1.94-.002.543.546.545 1.536.545 1.55V5H3.998z"/>
     </g>
-</svg>
+</g></svg>
index da266da..630835a 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="settings">
         <path id="gear" d="M3 4h3v2H3zm9 0h9v2h-9zM8 3h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm-5 8h9v2H3zm15 0h3v2h-3zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zM3 18h6v2H3zm12 0h6v2h-6zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1z"/>
     </g>
-</svg>
+</g></svg>
index 9d28697..a93d312 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="settings">
         <path id="gear" d="M3 4h3v2H3zm9 0h9v2h-9zM8 3h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm-5 8h9v2H3zm15 0h3v2h-3zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zM3 18h6v2H3zm12 0h6v2h-6zm-4-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1z"/>
     </g>
-</svg>
+</g></svg>
index bde5f71..b783779 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M0 20h24v1H0v-1zm6-8l-1-1-2 2-2-2-1 1 2 2-2 2 1 1 2-2 2 2 1-1-2-2zm15.6 3.7c-.9-.5-1.9-.5-2.7 0-1.5.9-3.1.4-3.1.4-.4-.2-.8-.4-1.1-.6 2.2-.6 4.4-1.8 6-3.9 1.1-1.2 2.5-3.9.4-6-.7-.7-1.6-1.1-2.7-1-1.4.1-2.8.9-3.9 2.1-.9 1.1-3.1 4.5-2.3 7.5 0 .1 0 .2.1.3-2.3.3-4.2.2-4.4.1v1.5c.7.1 2.7.2 5.1-.2.5.7 1.3 1.2 2.3 1.6.1 0 2.4.8 4.5-.6.5-.3.9-.1 1.1 0 .4.2.7.6.7 1H23c0-.8-.6-1.7-1.4-2.2zm-8-1.7c-.5-2.2 1.1-5.1 2-6.2.8-.9 1.8-1.5 2.8-1.6h.1c.6 0 1.1.2 1.5.6 1.6 1.6-.4 3.9-.5 4-1.5 2-3.7 3-5.8 3.5l-.1-.3z"/>
-</svg>
+</g></svg>
index d38c7ec..366aafb 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M0 20h24v1H0v-1zm6-8l-1-1-2 2-2-2-1 1 2 2-2 2 1 1 2-2 2 2 1-1-2-2zm15.6 3.7c-.9-.5-1.9-.5-2.7 0-1.5.9-3.1.4-3.1.4-.4-.2-.8-.4-1.1-.6 2.2-.6 4.4-1.8 6-3.9 1.1-1.2 2.5-3.9.4-6-.7-.7-1.6-1.1-2.7-1-1.4.1-2.8.9-3.9 2.1-.9 1.1-3.1 4.5-2.3 7.5 0 .1 0 .2.1.3-2.3.3-4.2.2-4.4.1v1.5c.7.1 2.7.2 5.1-.2.5.7 1.3 1.2 2.3 1.6.1 0 2.4.8 4.5-.6.5-.3.9-.1 1.1 0 .4.2.7.6.7 1H23c0-.8-.6-1.7-1.4-2.2zm-8-1.7c-.5-2.2 1.1-5.1 2-6.2.8-.9 1.8-1.5 2.8-1.6h.1c.6 0 1.1.2 1.5.6 1.6 1.6-.4 3.9-.5 4-1.5 2-3.7 3-5.8 3.5l-.1-.3z"/>
-</svg>
+</g></svg>
index de006d7..ffbf189 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M24 20H0v1h24v-1zm-6-8l1-1 2 2 2-2 1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2zM2.4 15.7c.9-.5 1.9-.5 2.7 0 1.5.9 3.1.4 3.1.4.4-.2.8-.4 1.1-.6-2.2-.6-4.4-1.8-6-3.9-1.1-1.2-2.5-3.9-.4-6 .7-.7 1.6-1.1 2.7-1 1.4.1 2.8.9 3.9 2.1.9 1.1 3.1 4.5 2.3 7.5 0 .1 0 .2-.1.3 2.3.3 4.2.2 4.4.1v1.5c-.7.1-2.7.2-5.1-.2-.5.7-1.3 1.2-2.3 1.6-.1 0-2.4.8-4.5-.6-.5-.3-.9-.1-1.1 0-.4.2-.7.6-.7 1H1c0-.8.6-1.7 1.4-2.2zm8-1.7c.5-2.2-1.1-5.1-2-6.2-.8-.9-1.8-1.5-2.8-1.6h-.1c-.6 0-1.1.2-1.5.6-1.6 1.6.4 3.9.5 4 1.5 2 3.7 3 5.8 3.5l.1-.3z"/>
-</svg>
+</g></svg>
index caa2839..3131849 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M24 20H0v1h24v-1zm-6-8l1-1 2 2 2-2 1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2zM2.4 15.7c.9-.5 1.9-.5 2.7 0 1.5.9 3.1.4 3.1.4.4-.2.8-.4 1.1-.6-2.2-.6-4.4-1.8-6-3.9-1.1-1.2-2.5-3.9-.4-6 .7-.7 1.6-1.1 2.7-1 1.4.1 2.8.9 3.9 2.1.9 1.1 3.1 4.5 2.3 7.5 0 .1 0 .2-.1.3 2.3.3 4.2.2 4.4.1v1.5c-.7.1-2.7.2-5.1-.2-.5.7-1.3 1.2-2.3 1.6-.1 0-2.4.8-4.5-.6-.5-.3-.9-.1-1.1 0-.4.2-.7.6-.7 1H1c0-.8.6-1.7 1.4-2.2zm8-1.7c.5-2.2-1.1-5.1-2-6.2-.8-.9-1.8-1.5-2.8-1.6h-.1c-.6 0-1.1.2-1.5.6-1.6 1.6.4 3.9.5 4 1.5 2 3.7 3 5.8 3.5l.1-.3z"/>
-</svg>
+</g></svg>
index b29f718..3f82d69 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 6h5l-2.5 3z"/>
-</svg>
+</g></svg>
index 9b7962e..67bf3a9 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M9.666 6H8.294l-4.48 12H5.52l1.493-4h4l1.507 4h1.666zm-2.28 7l1.617-4.333L10.637 13h-3.25z"/>
     <path id="small-a" d="M17.828 12h-.686l-2.24 6h.853l.747-2h2l.753 2h.833zm-1.14 3.5l.81-2.167.816 2.167H16.69z"/>
     <path id="arrow" d="M15 6h5l-2.5 3z"/>
-</svg>
+</g></svg>
index 171b31d..3d99520 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 6H4l2.5 3z"/>
-</svg>
+</g></svg>
index 23c0b09..2ca5200 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="big-a" d="M14.334 6h1.372l4.48 12H18.48l-1.493-4h-4l-1.507 4H9.814zm2.28 7l-1.617-4.333L13.363 13h3.25z"/>
     <path id="small-a" d="M6.172 12h.686l2.24 6h-.853L7.5 16H5.497l-.753 2h-.833zm1.14 3.5l-.81-2.166-.816 2.166h1.625z"/>
     <path id="arrow" d="M9 6H4l2.5 3z"/>
-</svg>
+</g></svg>
index 107f5f6..146a212 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M17.6 20h-5.4v-.5c.2 0 .5-.1.9-.1.3-.1.5-.2.5-.3V19s0-.1-.1-.2l-.8-2H9.3c-.1.2-.2.4-.3.7-.1.3-.2.5-.2.7-.1.3-.1.4-.2.6v.2c0 .1.1.3.3.4.2.1.6.2 1.1.2v.4H6v-.5c.2 0 .3 0 .5-.1.2 0 .3-.1.5-.2s.4-.2.5-.4l.3-.6c.5-1.3 1.1-2.6 1.6-3.9.5-1.3 1.1-2.7 1.8-4.3h1.4c.9 2.2 1.6 4 2.1 5.3.5 1.3 1 2.4 1.3 3.2.1.1.1.3.2.4.1.1.2.2.4.3.1.1.3.1.5.2s.3.1.5.1v.5zm-5.2-4L11 12.4 9.6 16h2.8z"/>
-</svg>
+</g></svg>
index a290c92..960793c 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M6 19.5c.1 0 .3 0 .5-.1s.3-.1.5-.2.3-.2.4-.3c.1-.1.2-.2.2-.4.4-.9.8-1.9 1.3-3.2.5-1.3 1.2-3.1 2.1-5.3h1.4c.7 1.6 1.2 3 1.8 4.3.5 1.3 1.1 2.6 1.6 3.9l.3.6c.1.2.3.3.5.4.1.1.3.1.5.2.2 0 .4.1.5.1v.5h-4v-.5c.5 0 .9-.1 1.1-.2.2-.1.3-.2.3-.4v-.2c0-.1-.1-.3-.2-.6-.1-.2-.2-.4-.2-.7-.1-.3-.2-.5-.3-.7h-3.4l-.8 2c0 .1-.1.1-.1.2v.1c0 .1.2.2.5.3.3.1.6.1.9.1v.6H6v-.5zm8-3.5l-1.4-3.6-1.4 3.6H14z"/>
-</svg>
+</g></svg>
index 6dd9266..b234e63 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="special-character">
         <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327a7.232 7.232 0 0 0-.19 1.7c0 .512.06 1 .18 1.46.12.46.31.87.567 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.455.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99a4.428 4.428 0 0 1-.89-1.4 4.78 4.78 0 0 1-.32-1.778c0-.82.13-1.537.394-2.15a3.97 3.97 0 0 1 1.163-1.54c.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.9.92 1.16 1.54.27.614.404 1.33.404 2.15a4.79 4.79 0 0 1-.32 1.78 4.35 4.35 0 0 1-.9 1.397c-.38.4-.83.732-1.355.99-.526.255-.708.43-1.337.523l-.092.894h.66l.448-.01.75-.034.606-.044.4-.053.534-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.698 2.002-1.365.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.07-1.186-.198-1.7a3.175 3.175 0 0 0-.66-1.326c-.31-.37-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
     </g>
-</svg>
+</g></svg>
index 4473704..091063f 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="special-character">
         <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.31.366-.53.808-.66 1.327a7.232 7.232 0 0 0-.19 1.7c0 .512.06 1 .18 1.46.12.46.31.87.567 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.455.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99a4.428 4.428 0 0 1-.89-1.4 4.78 4.78 0 0 1-.32-1.778c0-.82.13-1.537.394-2.15a3.97 3.97 0 0 1 1.163-1.54c.507-.407 1.133-.71 1.878-.912.745-.206 1.6-.31 2.565-.31.96 0 1.81.103 2.556.31.75.2 1.38.504 1.887.912.51.407.9.92 1.16 1.54.27.614.404 1.33.404 2.15a4.79 4.79 0 0 1-.32 1.78 4.35 4.35 0 0 1-.9 1.397c-.38.4-.83.732-1.355.99-.526.255-.708.43-1.337.523l-.092.894h.66l.448-.01.75-.034.606-.044.4-.053.534-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.698 2.002-1.365.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.07-1.186-.198-1.7a3.175 3.175 0 0 0-.66-1.326c-.31-.37-.73-.66-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
     </g>
-</svg>
+</g></svg>
index a5f137d..5fa3f49 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 20H2l3-3V6h17v11c0 1.7-1.3 3-3 3z"/>
-</svg>
+</g></svg>
index 3cc8dc6..d196d55 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 20H2l3-3V6h17v11c0 1.7-1.3 3-3 3z"/>
-</svg>
+</g></svg>
index 03d53d2..2da483c 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 20h17l-3-3V6H2v11c0 1.7 1.3 3 3 3z"/>
-</svg>
+</g></svg>
index 2722814..43b2364 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 20h17l-3-3V6H2v11c0 1.7 1.3 3 3 3z"/>
-</svg>
+</g></svg>
index e85c9a6..843469e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm8 3h1v3h3v1h-3v3h-1v-3h-3v-1h3V9z"/>
-</svg>
+</g></svg>
index 6e28601..bd4128b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm8 3h1v3h3v1h-3v3h-1v-3h-3v-1h3V9z"/>
-</svg>
+</g></svg>
index 810766a..d0e2cc4 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M2 6v11c0 1.7 1.3 3 3 3h17l-3-3V6H2zm8 3h1v3h3v1h-3v3h-1v-3H7v-1h3V9z"/>
-</svg>
+</g></svg>
index 266efc4..a35ff20 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M2 6v11c0 1.7 1.3 3 3 3h17l-3-3V6H2zm8 3h1v3h3v1h-3v3h-1v-3H7v-1h3V9z"/>
-</svg>
+</g></svg>
index 1cf7d78..a9ea6c8 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 9v9l2 2H8V9h12zM3 4h12v4H7v7H1l2-2V4z"/>
-</svg>
+</g></svg>
index 4a065cd..1c79ef6 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 9v9l2 2H8V9h12zM3 4h12v4H7v7H1l2-2V4z"/>
-</svg>
+</g></svg>
index ed874d1..c8b684a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 9v9l-2 2h14V9H3zm17-5H8v4h8v7h6l-2-2V4z"/>
-</svg>
+</g></svg>
index eb262e7..fe65227 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 9v9l-2 2h14V9H3zm17-5H8v4h8v7h6l-2-2V4z"/>
-</svg>
+</g></svg>
index defc618..407d2da 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
-</svg>
+</g></svg>
index ba60a4b..0cbd1d0 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
-</svg>
+</g></svg>
index defc618..407d2da 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
-</svg>
+</g></svg>
index eed2650..40f44d7 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
        <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 11.1H9v-6h6v6z"/>
-</svg>
+</g></svg>
index 1e702f9..5b44a8d 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
        <path d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm3 11.1H9v-6h6v6z"/>
-</svg>
+</g></svg>
index 11949f8..e277ae3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="strikethrough-a">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M12.666 6h-1.372l-4.48 12H8.52l1.493-4h4l1.507 4h1.666l-4.52-12zm-2.28 7l1.617-4.333L13.637 13h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index f80a245..a957e80 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="strikethrough-a">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M12.666 6h-1.372l-4.48 12H8.52l1.493-4h4l1.507 4h1.666l-4.52-12zm-2.28 7l1.617-4.333L13.637 13h-3.25z"/>
     </g>
-</svg>
+</g></svg>
index c570ba9..a8301f2 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
         <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.47 0-.962-.074-1.462-.24a7.288 7.288 0 0 1-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.714-.148-1.202-.352-1.404-.54-.206-.202-.313-.484-.313-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.19-.383-1.69-.48c-.5-.097-.983-.15-1.467-.15z"/>
     </g>
-</svg>
+</g></svg>
index 6446e8e..f6f5331 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="strikethrough-s">
         <path id="strikethrough" d="M6 12h12v1H6v-1z"/>
         <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .89.22 1.602.72 2.13.497.528 1.278.91 2.31 1.14l.813.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.53 1.26-.36.29-.895.45-1.626.45-.47 0-.962-.074-1.462-.24a7.288 7.288 0 0 1-1.562-.75l-.374-.238v2.158l.156.062c.58.237 1.144.417 1.69.54.548.12 1.07.18 1.56.18 1.287 0 2.298-.293 3-.9.71-.605 1.063-1.486 1.063-2.608 0-.943-.256-1.726-.78-2.312-.522-.592-1.306-1-2.345-1.23l-.812-.18c-.714-.148-1.202-.352-1.404-.54-.206-.202-.313-.484-.313-.934 0-.533.162-.9.5-1.17.342-.27.836-.42 1.53-.42.396 0 .82.052 1.25.18.434.128.91.334 1.407.6l.375.18V6.63s-1.19-.383-1.69-.48c-.5-.097-.983-.15-1.467-.15z"/>
     </g>
-</svg>
+</g></svg>
index bd80846..f34be15 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="strikethrough-y">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M7 6h1.724l3.288 4.935L15.276 6H17l-4.194 6.285V18h-1.612v-5.715L7 6"/>
     </g>
-</svg>
+</g></svg>
index 95d7218..778a941 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="strikethrough-y">
         <path id="strikethrough" d="M6 11h12v1H6v-1z"/>
         <path id="a" d="M7 6h1.724l3.288 4.935L15.276 6H17l-4.194 6.285V18h-1.612v-5.715L7 6"/>
     </g>
-</svg>
+</g></svg>
index b774dce..4b2040c 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 9h12v2H4V9zm0 3h8v2H4v-2zm0-7h16v3H4V5zm16 14H4v-3h16v3z"/>
-</svg>
+</g></svg>
index c6c541c..a7ddaac 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 9h12v2H4V9zm0 3h8v2H4v-2zm0-7h16v3H4V5zm16 14H4v-3h16v3z"/>
-</svg>
+</g></svg>
index eb52a4d..af6e715 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 9H8v2h12V9zm0 3h-8v2h8v-2zm0-7H4v3h16V5zM4 19h16v-3H4v3z"/>
-</svg>
+</g></svg>
index a59254c..e835c21 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 9H8v2h12V9zm0 3h-8v2h8v-2zm0-7H4v3h16V5zM4 19h16v-3H4v3z"/>
-</svg>
+</g></svg>
index 7d8ccdc..68085f9 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 19H4v-2h16v2zM20 15H4v-2h16v2zM20 11H4V9h16v2z"/>
-</svg>
+</g></svg>
index 862a2f7..7bb2d16 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 19H4v-2h16v2zM20 15H4v-2h16v2zM20 11H4V9h16v2z"/>
-</svg>
+</g></svg>
index 893d559..91fcd8f 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20 11H4V9h16v2zM4 12h8v2H4v-2z"/>
-</svg>
+</g></svg>
index 503dc27..59342a5 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20 11H4V9h16v2zM4 12h8v2H4v-2z"/>
-</svg>
+</g></svg>
index a5f1417..dae554e 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 11h16V9H4v2zm16 1h-8v2h8v-2z"/>
-</svg>
+</g></svg>
index 75b3cb6..6b94663 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 11h16V9H4v2zm16 1h-8v2h8v-2z"/>
-</svg>
+</g></svg>
index 7424959..7b2ec17 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 13H4v-3h13v3zm-5 6H4v-3h8v3zM4 7V4h16v3H4z"/>
-</svg>
+</g></svg>
index 1a59715..d027539 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 13H4v-3h13v3zm-5 6H4v-3h8v3zM4 7V4h16v3H4z"/>
-</svg>
+</g></svg>
index e1802d1..2e75158 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 13h13v-3H7v3zm5 6h8v-3h-8v3zm8-12V4H4v3h16z"/>
-</svg>
+</g></svg>
index 15aa549..3c27eaf 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 13h13v-3H7v3zm5 6h8v-3h-8v3zm8-12V4H4v3h16z"/>
-</svg>
+</g></svg>
index d168e2f..b6f5d6d 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 13l-1 1v3l1 1h-1l-.527-.46L16 18h-1l1-1v-3l-1-1h1l.485.497L17 13z"/>
-</svg>
+</g></svg>
index da428f7..11dc32f 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 13l-1 1v3l1 1h-1l-.527-.46L16 18h-1l1-1v-3l-1-1h1l.485.497L17 13z"/>
-</svg>
+</g></svg>
index 25fcb14..b1608f9 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 13l1 1v3l-1 1h1l.527-.46L10 18h1l-1-1v-3l1-1h-1l-.485.497L9 13z"/>
-</svg>
+</g></svg>
index e65abbb..f0c5d31 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 13l1 1v3l-1 1h1l.527-.46L10 18h1l-1-1v-3l1-1h-1l-.485.497L9 13z"/>
-</svg>
+</g></svg>
index 6abcb57..498df82 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 29f965b..afd390c 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 92a045d..f932701 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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)"/>
-</svg>
+</g></svg>
index 1f78472..72754d4 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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)"/>
-</svg>
+</g></svg>
index 03636db..430abf0 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 7l-1 1v3l1 1h-1l-.527-.46L16 12h-1l1-1V8l-1-1h1l.485.497L17 7z"/>
-</svg>
+</g></svg>
index d926f44..80495b8 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M14 9l-2.354 3.406L14 16h-1.2L11 13.25 9.2 16H8l2.403-3.662L8 9h1.188l1.857 2.494L12.797 9H14z"/>
     <path d="M18 7l-1 1v3l1 1h-1l-.527-.46L16 12h-1l1-1V8l-1-1h1l.485.497L17 7z"/>
-</svg>
+</g></svg>
index 59418fe..ea8ea9c 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 7l1 1v3l-1 1h1l.527-.46L10 12h1l-1-1V8l1-1h-1l-.485.497L9 7z"/>
-</svg>
+</g></svg>
index 20db11c..e742990 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path id="x" d="M12 9l2.354 3.406L12 16h1.2l1.8-2.75L16.8 16H18l-2.403-3.662L18 9h-1.188l-1.857 2.494L13.203 9H12z"/>
     <path d="M8 7l1 1v3l-1 1h1l.527-.46L10 12h1l-1-1V8l1-1h-1l-.485.497L9 7z"/>
-</svg>
+</g></svg>
index f62c61c..360fbe1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-caption">
         <path id="caption" d="M6 6h12v3H6z"/>
         <path id="table" d="M4 10v7h16v-7H4zm1 1h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2zM5 14h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2z"/>
     </g>
-</svg>
+</g></svg>
index 9270ddf..02faf85 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-caption">
         <path id="caption" d="M6 6h12v3H6z"/>
         <path id="table" d="M4 10v7h16v-7H4zm1 1h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2zM5 14h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2z"/>
     </g>
-</svg>
+</g></svg>
index 2944ec1..9a93e24 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-column-ltr">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h2v14H5z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 9c5550b..1f560bb 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-column-ltr">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h2v14H5z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 2f4627b..7c54e2c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-column-rtl">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M17 5h2v14h-2z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 224cd80..3e178ee 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-column-rtl">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M17 5h2v14h-2z" id="column"/>
     </g>
-</svg>
+</g></svg>
index 8ce9614..2df3cfc 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-row-after">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 17h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index 6085525..f85c5a3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-row-after">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 17h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index 98a8732..5d529f1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert-row-before">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index b23e4a0..f26feef 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert-row-before">
         <path d="M13 9h-2v2H9v2h2v2h2v-2h2v-2h-2z" id="plus"/>
         <path d="M5 5h14v2H5z" id="row"/>
     </g>
-</svg>
+</g></svg>
index 171473d..85a3f97 100644 (file)
@@ -1,6 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-insert">
         <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
-</svg>
+</g></svg>
index bc8f537..102a686 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="table-merge-cells">
         <g id="merge-cell-left">
             <path id="cell-border" d="M4 7v9h7v-3l-1 .834V15H5V8h5v1.167L11 10V7z"/>
@@ -7,4 +7,4 @@
         </g>
         <use id="merge-cell-right" xlink:href="#merge-cell-left" transform="matrix(-1 0 0 1 24 0)"/>
     </g>
-</svg>
+</g></svg>
index cb90635..c2c5a7e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-merge-cells">
         <g id="merge-cell-left">
             <path id="cell-border" d="M4 7v9h7v-3l-1 .834V15H5V8h5v1.167L11 10V7z"/>
@@ -7,4 +7,4 @@
         </g>
         <use id="merge-cell-right" xlink:href="#merge-cell-left" transform="matrix(-1 0 0 1 24 0)"/>
     </g>
-</svg>
+</g></svg>
index 5aa79ee..3441e65 100644 (file)
@@ -1,6 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="table-insert">
         <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
-</svg>
+</g></svg>
index e55880e..ce04687 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index 0732f2e..cb00c1c 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index e90541b..a4f38b4 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index e55880e..ce04687 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index df57de5..bf31a97 100644 (file)
@@ -1,4 +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"><style>* { fill: #ff5d00 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ff5d00">
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
-</svg>
+</g></svg>
index c427bba..4d0e4a5 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="template-add">
         <path id="add" d="M23 7h-4V3h-2v4h-4v2h4v4h2V9h4z"/>
         <path id="template" d="M18 14v4H6c-1.1 0-2-.9-2-2V8h8V7H3v9c0 1.7 1.3 3 3 3h13v-5z"/>
     </g>
-</svg>
+</g></svg>
index 1800115..8b6325e 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="template-add">
         <path id="add" d="M23 7h-4V3h-2v4h-4v2h4v4h2V9h4z"/>
         <path id="template" d="M18 14v4H6c-1.1 0-2-.9-2-2V8h8V7H3v9c0 1.7 1.3 3 3 3h13v-5z"/>
     </g>
-</svg>
+</g></svg>
index 0142745..3277986 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="template-add">
         <path id="add" d="M1 7h4V3h2v4h4v2H7v4H5V9H1z"/>
         <path id="template" d="M6 14v4h12c1.1 0 2-.9 2-2V8h-8V7h9v9c0 1.7-1.3 3-3 3H5v-5z"/>
     </g>
-</svg>
+</g></svg>
index 134d304..ea7a4ce 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="template-add">
         <path id="add" d="M1 7h4V3h2v4h4v2H7v4H5V9H1z"/>
         <path id="template" d="M6 14v4h12c1.1 0 2-.9 2-2V8h-8V7h9v9c0 1.7-1.3 3-3 3H5v-5z"/>
     </g>
-</svg>
+</g></svg>
index 00b1928..8824e9c 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 7H5V6h2l.47.5L8 6h2v1H8v10h2v1H8l-.5-.53L7 18H5v-1h2zm6.976 9v-2H11v-4h2.976V8.044L20 12.022z" id="text-dir-ltr"/>
-</svg>
+</g></svg>
index f67802a..968e13b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 7H5V6h2l.47.5L8 6h2v1H8v10h2v1H8l-.5-.53L7 18H5v-1h2zm6.976 9v-2H11v-4h2.976V8.044L20 12.022z" id="text-dir-ltr"/>
-</svg>
+</g></svg>
index c1dc96e..12544d9 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 17h2v1h-2l-.47-.5-.53.5h-2v-1h2V7h-2V6h2l.5.53L17 6h2v1h-2zm-6.976-9v2H13v4h-2.976v1.956L4 11.978z" id="text-dir-rtl"/>
-</svg>
+</g></svg>
index 52fa585..73ebe60 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 17h2v1h-2l-.47-.5-.53.5h-2v-1h2V7h-2V6h2l.5.53L17 6h2v1h-2zm-6.976-9v2H13v4h-2.976v1.956L4 11.978z" id="text-dir-rtl"/>
-</svg>
+</g></svg>
index d26f68f..318c168 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="text-style">
         <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.29 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
-</svg>
+</g></svg>
index fc53802..6f17920 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="text-style">
         <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.29 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
         <path id="underline" d="M6 19h12v1H6v-1z"/>
     </g>
-</svg>
+</g></svg>
index 59ad3f2..eb52343 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
-</svg>
+</g></svg>
index 92c7966..f84bfe9 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
-</svg>
+</g></svg>
index 6a328db..1099f6a 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
-</svg>
+</g></svg>
index fe8600a..28442a3 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
-</svg>
+</g></svg>
index 5544fd3..7b079ea 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
-</svg>
+</g></svg>
index 36fd719..148da47 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
+</g></svg>
index bc96e99..e80e6ae 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M17 11v2h-2l3.6 3.6c.9-1.3 1.4-2.9 1.4-4.6 0-4.4-3.6-8-8-8-1.7 0-3.3.5-4.6 1.4L13 11h4zM4 4L3 5l2.4 2.4C4.5 8.7 4 10.3 4 12c0 4.4 3.6 8 8 8 1.7 0 3.3-.5 4.6-1.4L19 21l1-1L4 4zm3 9v-2h2l2 2H7z"/>
-</svg>
+</g></svg>
index b6f1610..8aace96 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
+</g></svg>
index dc03220..1337e16 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 11v2h2l-3.6 3.6C4.5 15.3 4 13.7 4 12c0-4.4 3.6-8 8-8 1.7 0 3.3.5 4.6 1.4L11 11H7zm13-7l1 1-2.4 2.4c.9 1.3 1.4 2.9 1.4 4.6 0 4.4-3.6 8-8 8-1.7 0-3.3-.5-4.6-1.4L5 21l-1-1L20 4zm-3 9v-2h-2l-2 2h4z"/>
-</svg>
+</g></svg>
index c73d23f..dba18af 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
        <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index 16b6d3a..e84befe 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
        <path d="M19.9 19.6l-16-16-1.1 1.1L6 7.9V20h1v-7c.6-.6 2-.8 3.4-.7l8.4 8.4 1.1-1.1zM17 14V7c-.7.7-2.7.9-4 .5V6c-1.2-1.3-3.9-1.3-5.4-.5l8.9 9c.3-.2.4-.3.5-.5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index 440390e..88256ec 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
        <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index 7f45734..fcb4d11 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
        <path d="M3.5 19.6l16-16 1.1 1.1-3.2 3.2V20h-1v-7c-.6-.6-2-.8-3.4-.7l-8.4 8.4-1.1-1.1zM6.3 14V7c.7.7 2.7.9 4 .5V6c1.2-1.3 3.9-1.3 5.4-.5l-8.9 9c-.3-.2-.4-.3-.5-.5z"/>
-</svg>
\ No newline at end of file
+</g></svg>
\ No newline at end of file
index d45ebac..cf82e1f 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z"/>
-</svg>
+</g></svg>
index bfc7a3f..3c6f966 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z"/>
-</svg>
+</g></svg>
index 86a7bb9..55b8cc3 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 9V7s0-5-4.5-5S3 7 3 7h2s0-3 2.5-3S10 7 10 7v2H7v7c0 1.7 1.3 3 3 3h10V9z"/>
-</svg>
+</g></svg>
index 5e6d205..d70f3a9 100644 (file)
@@ -1,4 +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"><style>* { fill: #d33 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#d33">
     <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z"/>
-</svg>
+</g></svg>
index 78cd92b..bfe53ad 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z"/>
-</svg>
+</g></svg>
index 272c543..20e4afa 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 9V7s0-5 4.5-5S20 7 20 7h-2s0-3-2.5-3S13 7 13 7v2h3v7c0 1.7-1.3 3-3 3H3V9z"/>
-</svg>
+</g></svg>
index f9c609a..7265f4a 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
-</svg>
+</g></svg>
index 8105090..b34f49b 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
-</svg>
+</g></svg>
index f9c609a..7265f4a 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
-</svg>
+</g></svg>
index 0763ff8..efa8e83 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
+</g></svg>
index 6d1fdd9..c5bf2cc 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
-</svg>
+</g></svg>
index 12e57b2..3fb2085 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
+</g></svg>
index 6395968..0a67774 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z"/>
-</svg>
+</g></svg>
index 1fb4ca9..3078617 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="underline-a">
         <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index ec858c9..99d9dad 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="underline-a">
         <path id="a" d="M14.424 16H16.5L13.037 6H10.96L7.5 16h2.077l.627-2h3.604l.616 2zm-3.92-3.623L12 7.997l1.51 4.38h-3z"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 0c73875..8136276 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="underline-u">
         <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.658-1.666.98-2.98.98-1.32 0-2.32-.32-2.996-.98C8.336 14.37 8 13.41 8 12.13V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 691846b..2953213 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="underline-u">
         <path id="u" d="M8 6h2v5.96c-.104 1.706.695 2 2 2.04 1.777.062 2.002-.88 2-2.04V6h2v6.123c0 1.28-.338 2.245-1.016 2.898-.672.658-1.666.98-2.98.98-1.32 0-2.32-.32-2.996-.98C8.336 14.37 8 13.41 8 12.13V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
-</svg>
+</g></svg>
index 7d91326..e5c84a9 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M12 8l8 10H4z"/>
-</svg>
+</g></svg>
index 1757188..b6bbc97 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M12 8l8 10H4z"/>
-</svg>
+</g></svg>
index 818178e..4a7cf26 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index edeb448..85bb62f 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
-</svg>
+</g></svg>
index 9abf396..d347e6a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index 29e8f16..d367074 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
-</svg>
+</g></svg>
index 93b7c5e..beefd8d 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-2 4c.7 0 1.2.6 1.2 1.2s-.6 1.2-1.2 1.2-1.2-.6-1.2-1.2S13.3 9 14 9zM9 9c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2S8.3 9 9 9zm7 5.4c0 .2-.1.3-.3.5-.7.6-1.6 1-2.6 1.3s-2.1.2-3.1 0-2-.9-2.7-1.5c-.1-.1-.2-.3-.2-.4s.1-.3.2-.4c.1-.1.3-.2.4-.2.2 0 .3.1.4.2.5.5 1.2.9 2.1 1.1s1.7.2 2.6 0 1.6-.5 2.1-1c.1-.1.3-.2.4-.2s.3.1.5.2.2.2.2.4z"/>
-</svg>
+</g></svg>
index b1147fc..3232e97 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-2 4c.7 0 1.2.6 1.2 1.2s-.6 1.2-1.2 1.2-1.2-.6-1.2-1.2S13.3 9 14 9zM9 9c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2S8.3 9 9 9zm7 5.4c0 .2-.1.3-.3.5-.7.6-1.6 1-2.6 1.3s-2.1.2-3.1 0-2-.9-2.7-1.5c-.1-.1-.2-.3-.2-.4s.1-.3.2-.4c.1-.1.3-.2.4-.2.2 0 .3.1.4.2.5.5 1.2.9 2.1 1.1s1.7.2 2.6 0 1.6-.5 2.1-1c.1-.1.3-.2.4-.2s.3.1.5.2.2.2.2.4z"/>
-</svg>
+</g></svg>
index ad40b9e..08a382a 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm2 4c-.7 0-1.2.6-1.2 1.2s.6 1.2 1.2 1.2 1.2-.6 1.2-1.2S9.7 9 9 9zm5 0c-.7 0-1.2.6-1.2 1.2s.5 1.3 1.2 1.3 1.2-.6 1.2-1.2S14.7 9 14 9zm-7 5.4c0 .2.1.3.3.5.7.6 1.6 1 2.6 1.3 1 .3 2.1.2 3.1 0s2-.9 2.7-1.5c.1-.1.2-.3.2-.4 0-.1-.1-.3-.2-.4-.1-.1-.3-.2-.4-.2-.2 0-.3.1-.4.2-.5.5-1.2.9-2.1 1.1-.9.2-1.7.2-2.6 0-.9-.2-1.6-.5-2.1-1-.1-.1-.3-.2-.4-.2-.1 0-.3.1-.5.2s-.2.2-.2.4z"/>
-</svg>
+</g></svg>
index 958e480..c38292e 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm2 4c-.7 0-1.2.6-1.2 1.2s.6 1.2 1.2 1.2 1.2-.6 1.2-1.2S9.7 9 9 9zm5 0c-.7 0-1.2.6-1.2 1.2s.5 1.3 1.2 1.3 1.2-.6 1.2-1.2S14.7 9 14 9zm-7 5.4c0 .2.1.3.3.5.7.6 1.6 1 2.6 1.3 1 .3 2.1.2 3.1 0s2-.9 2.7-1.5c.1-.1.2-.3.2-.4 0-.1-.1-.3-.2-.4-.1-.1-.3-.2-.4-.2-.2 0-.3.1-.4.2-.5.5-1.2.9-2.1 1.1-.9.2-1.7.2-2.6 0-.9-.2-1.6-.5-2.1-1-.1-.1-.3-.2-.4-.2-.1 0-.3.1-.5.2s-.2.2-.2.4z"/>
-</svg>
+</g></svg>
index a2e039b..5f4e136 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M18.75 17.4c-1.08-.36-3.6-1.35-3.6-1.35-.81-.27-.81-.99-.9-1.8v-.09c1.26-1.08 2.25-2.88 2.25-4.86 0-4.23-1.8-5.85-4.5-5.85-1.89 0-4.5 1.08-4.5 5.85 0 1.89.99 3.69 2.25 4.86v.09c0 .81-.09 1.53-.9 1.8 0 0-2.61.99-3.6 1.35-1.17.36-2.25.9-2.25 2.25v.9h18v-.9c0-1.08-.72-1.8-2.25-2.25z"/>
-</svg>
+</g></svg>
index 257f593..26ae8b6 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M18.75 17.4c-1.08-.36-3.6-1.35-3.6-1.35-.81-.27-.81-.99-.9-1.8v-.09c1.26-1.08 2.25-2.88 2.25-4.86 0-4.23-1.8-5.85-4.5-5.85-1.89 0-4.5 1.08-4.5 5.85 0 1.89.99 3.69 2.25 4.86v.09c0 .81-.09 1.53-.9 1.8 0 0-2.61.99-3.6 1.35-1.17.36-2.25.9-2.25 2.25v.9h18v-.9c0-1.08-.72-1.8-2.25-2.25z"/>
-</svg>
+</g></svg>
index c4049a5..075ea5c 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-9.3 5.4C6.2 10 6 9.6 6 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6zm8.4 4.3c0 .2-.1.3-.3.4-1 .6-2.2.9-3.5.9-1.2 0-2.3-.3-3.3-1-.2-.1-.2-.2-.3-.4s0-.3.1-.5.2-.2.4-.3.3 0 .5.1c.8.5 1.7.8 2.8.8s2-.2 2.8-.7c.1-.1.3-.1.5-.1s.3.1.4.3l-.1.5zm1.2-4.3c-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6S12 9.6 12 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4z"/>
-</svg>
+</g></svg>
index 60165e7..f48929d 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M16 5H4v12c0 1.7 1.3 3 3 3h12V8c0-1.7-1.3-3-3-3zm-9.3 5.4C6.2 10 6 9.6 6 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6zm8.4 4.3c0 .2-.1.3-.3.4-1 .6-2.2.9-3.5.9-1.2 0-2.3-.3-3.3-1-.2-.1-.2-.2-.3-.4s0-.3.1-.5.2-.2.4-.3.3 0 .5.1c.8.5 1.7.8 2.8.8s2-.2 2.8-.7c.1-.1.3-.1.5-.1s.3.1.4.3l-.1.5zm1.2-4.3c-.5.4-1.1.6-1.8.6s-1.3-.2-1.8-.6S12 9.6 12 9c.6.6 1.5.9 2.5.9s1.9-.3 2.5-.9c0 .6-.2 1-.7 1.4z"/>
-</svg>
+</g></svg>
index 2759926..0b3aa4d 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm9.3 5.4c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S12.6 9.6 12 9c0 .6.2 1 .7 1.4.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6zm-8.4 4.3c0 .2.1.3.3.4 1 .6 2.2.9 3.5.9 1.2 0 2.3-.3 3.3-1 .2-.1.2-.2.3-.4.1-.2 0-.3-.1-.5s-.2-.2-.4-.3c-.2-.1-.3 0-.5.1-.8.5-1.7.8-2.8.8-1.1 0-2-.2-2.8-.7-.1-.1-.3-.1-.5-.1s-.3.1-.4.3l.1.5zm-1.2-4.3c.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S6.6 9.6 6 9c0 .6.2 1 .7 1.4z"/>
-</svg>
+</g></svg>
index 9ec8f4f..76d950c 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M7 5h12v12c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3zm9.3 5.4c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S12.6 9.6 12 9c0 .6.2 1 .7 1.4.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6zm-8.4 4.3c0 .2.1.3.3.4 1 .6 2.2.9 3.5.9 1.2 0 2.3-.3 3.3-1 .2-.1.2-.2.3-.4.1-.2 0-.3-.1-.5s-.2-.2-.4-.3c-.2-.1-.3 0-.5.1-.8.5-1.7.8-2.8.8-1.1 0-2-.2-2.8-.7-.1-.1-.3-.1-.5-.1s-.3.1-.4.3l.1.5zm-1.2-4.3c.5.4 1.1.6 1.8.6s1.3-.2 1.8-.6c.5-.4.7-.8.7-1.4-.6.6-1.5.9-2.5.9S6.6 9.6 6 9c0 .6.2 1 .7 1.4z"/>
-</svg>
+</g></svg>
index c781931..934128f 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm11.2 2.5c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2.6-1.3 1.2-1.3zm-5.4 0c.7 0 1.2.6 1.2 1.2s-.6 1.3-1.2 1.3-1.2-.6-1.2-1.2.5-1.3 1.2-1.3zm2.7 8.5c-5.1 0-6-5-6-5s2 1 6 1l6-1s-1 5-6 5z"/>
-</svg>
+</g></svg>
index 539f6f4..232a04a 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm11.2 2.5c.7 0 1.2.6 1.2 1.2s-.5 1.3-1.2 1.3-1.2-.6-1.2-1.2.6-1.3 1.2-1.3zm-5.4 0c.7 0 1.2.6 1.2 1.2s-.6 1.3-1.2 1.3-1.2-.6-1.2-1.2.5-1.3 1.2-1.3zm2.7 8.5c-5.1 0-6-5-6-5s2 1 6 1l6-1s-1 5-6 5z"/>
-</svg>
+</g></svg>
index dd8588a..5c48db2 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M19 6v11l3 3H5c-1.7 0-3-1.3-3-3V6h17zM7.8 8.5c-.7 0-1.2.6-1.2 1.2S7.1 11 7.8 11 9 10.4 9 9.8s-.6-1.3-1.2-1.3zm5.4 0c-.7 0-1.2.6-1.2 1.2s.6 1.3 1.2 1.3 1.2-.6 1.2-1.2-.5-1.3-1.2-1.3zM10.5 17c5.1 0 6-5 6-5s-2 1-6 1l-6-1s1 5 6 5z"/>
-</svg>
+</g></svg>
index 32cad91..2a2b17b 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M19 6v11l3 3H5c-1.7 0-3-1.3-3-3V6h17zM7.8 8.5c-.7 0-1.2.6-1.2 1.2S7.1 11 7.8 11 9 10.4 9 9.8s-.6-1.3-1.2-1.3zm5.4 0c-.7 0-1.2.6-1.2 1.2s.6 1.3 1.2 1.3 1.2-.6 1.2-1.2-.5-1.3-1.2-1.3zM10.5 17c5.1 0 6-5 6-5s-2 1-6 1l-6-1s1 5 6 5z"/>
-</svg>
+</g></svg>
index f33f917..b70f4f9 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="viewCompact">
         <circle cx="6" cy="6" r="2"/>
         <circle cx="12" cy="6" r="2"/>
@@ -11,4 +11,4 @@
         <circle cx="12" cy="18" r="2"/>
         <circle cx="18" cy="18" r="2"/>
     </g>
-</svg>
+</g></svg>
index 7f66bc7..a7edfc5 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="viewCompact">
         <circle cx="6" cy="6" r="2"/>
         <circle cx="12" cy="6" r="2"/>
@@ -11,4 +11,4 @@
         <circle cx="12" cy="18" r="2"/>
         <circle cx="18" cy="18" r="2"/>
     </g>
-</svg>
+</g></svg>
index cea83f9..1e349b3 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index 1e1d76b..c6588c2 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 34ee977..f2d6a87 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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>
+</g></svg>
index d253a88..9b7b78d 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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>
+</g></svg>
index 0e7728f..10edb0f 100644 (file)
@@ -1,4 +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"><style>* { fill: #ffffff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#ffffff">
     <path d="M0 10v8h2.3c.3.6 1 1 1.7 1h4c1.5 0 2.7-.8 3-2h2c.3 1.2 1.5 2 3 2h4c.7 0 1.4 0 1.7-1H24v-8zm10 6c0 1-.4 2-2 2H4c-.6 0-1-.4-1-1v-3c0-.6.4-1 1-1h5c.6 0 1 .4 1 1zm11 1c0 .6-.4 1-1 1h-4c-1.6 0-2-1-2-2v-2c0-.6.4-1 1-1h5c.6 0 1 .4 1 1z"/>
-</svg>
+</g></svg>
index 5600602..ff99d08 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 212193f..6d06ede 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 08986e5..50224d0 100644 (file)
@@ -1,4 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index e529a67..a2589bd 100644 (file)
@@ -1,4 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <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"/>
-</svg>
+</g></svg>
index 12e246c..72601da 100644 (file)
@@ -1,9 +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"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="wikiText">
         <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
         <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
         <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
         <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
-</svg>
+</g></svg>
index 4afd5e0..f7ba89d 100644 (file)
@@ -1,9 +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"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="wikiText">
         <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
         <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
         <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
         <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
-</svg>
+</g></svg>
index d373c0d..17d3645 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<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"/>
-</svg>
+</g></svg>
index 7a49393..2b49b99 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 4021b30..fbb9cab 100644 (file)
@@ -1,5 +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"><style>* { fill: #fff }</style>
+<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)"/>
-</svg>
+</g></svg>
index a937688..a2f62ff 100644 (file)
@@ -1,5 +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"><style>* { fill: #36c }</style>
+<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)"/>
-</svg>
+</g></svg>
index eaaca54..bebd3a8 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <g id="window">
         <path id="title" d="M7 10h10v1H7z"/>
         <path id="frame" d="M16 19H8c-2.206 0-4-1.794-4-4V9c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zM8 7c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2V9c0-1.103-.897-2-2-2H8z"/>
     </g>
-</svg>
+</g></svg>
index cb2de06..9204afe 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #36c }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <g id="window">
         <path id="title" d="M7 10h10v1H7z"/>
         <path id="frame" d="M16 19H8c-2.206 0-4-1.794-4-4V9c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zM8 7c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2V9c0-1.103-.897-2-2-2H8z"/>
     </g>
-</svg>
+</g></svg>
index bb38ce5..a520175 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zM5 7h2V2H5zm0 3h2V8H5z" id="alert"/>
-</svg>
+</g></svg>
index 8bff5c9..900e477 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index a02090b..e194d0d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <g id="down">
         <path id="arrow" d="M1 4h10L6 9 1 4"/>
     </g>
-</svg>
+</g></svg>
index 422d51a..511359a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index d0c754b..9e0e569 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <g id="ltr">
         <path id="arrow" d="M4 1v10l5-5-5-5"/>
     </g>
-</svg>
+</g></svg>
index b866ef9..fc6cb9a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 157f000..d032b05 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <g id="rtl">
         <path id="arrow" d="M8 11V1L3 6l5 5"/>
     </g>
-</svg>
+</g></svg>
index 0623742..8f1a254 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 14bc04c..3b79abb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <g id="up">
         <path id="arrow" d="M1 8h10L6 3 1 8"/>
     </g>
-</svg>
+</g></svg>
index ef83982..4e9221a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index e3fd49c..eb45dfc 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index ff05cfa..4ea1013 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 632eb89..efd0840 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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"/>
-</svg>
+</g></svg>
index 26e4913..ab95a3d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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"/>
-</svg>
+</g></svg>
index 036697e..cc383ee 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index 51ff91d..5e8e395 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
index 3b2e1b6..19114d8 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #fff }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
     <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>
-</svg>
+</g></svg>
index 2cd760a..015d02e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #36c }</style>
+<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>
-</svg>
+</g></svg>
diff --git a/resources/src/dom-level2-skip.js b/resources/src/dom-level2-skip.js
deleted file mode 100644 (file)
index 484c295..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Skip function for dom-level2-shim module.
- *
- * Tests for window.Node because that's the only thing that this shim is adding.
- */
-return !!window.Node;
index d24fcc9..92c6c43 100644 (file)
@@ -7,9 +7,9 @@
 
 .arrowSteps li {
        float: left;
-       padding: 0px;
-       margin: 0px;
-       border: 0 none;
+       padding: 0;
+       margin: 0;
+       border: 0;
 }
 
 .arrowSteps li div {
index 8b4bd7b..8e0e512 100644 (file)
@@ -19,9 +19,9 @@
 .mw-badge-inline {
        margin-left: 3px;
        display: inline-block;
-       /* Hack for IE6 and IE7 (bug 47926) */
+       /* Hack for IE6 and IE7 (T49926) */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 
 }
 .mw-badge-overlay {
index 567bec8..c75246c 100644 (file)
@@ -87,7 +87,7 @@
                // Chop off characters from the end of the "inserted content" string
                // until the limit is statisfied.
                if ( fn ) {
-                       // stop, when there is nothing to slice - bug 41450
+                       // stop, when there is nothing to slice - T43450
                        while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) {
                                inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
                        }
                                }
                                // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
                                // trimByteLength to compare the new value to an empty string instead of the
-                               // old value, resulting in trimming always from the end (bug 40850).
+                               // old value, resulting in trimming always from the end (T42850).
                                prevSafeVal = res.newVal;
                        } );
                } );
index b7e0af5..0cba34f 100644 (file)
        position: absolute;
        cursor: crosshair;
 }
-.farbtastic, .farbtastic .wheel {
+.farbtastic,
+.farbtastic .wheel {
        width: 195px;
        height: 195px;
 }
-.farbtastic .color, .farbtastic .overlay {
+.farbtastic .color,
+.farbtastic .overlay {
        top: 47px;
        left: 47px;
        width: 101px;
index 3feca81..a14e3eb 100644 (file)
@@ -8,18 +8,28 @@
        $.highlightText = {
 
                // Split our pattern string at spaces and run our highlight function on the results
-               splitAndHighlight: function ( node, pat ) {
+               splitAndHighlight: function ( node, text ) {
                        var i,
-                               patArray = pat.split( ' ' );
-                       for ( i = 0; i < patArray.length; i++ ) {
-                               if ( patArray[ i ].length === 0 ) {
+                               words = text.split( ' ' );
+                       for ( i = 0; i < words.length; i++ ) {
+                               if ( words[ i ].length === 0 ) {
                                        continue;
                                }
-                               $.highlightText.innerHighlight( node, patArray[ i ] );
+                               $.highlightText.innerHighlight(
+                                       node,
+                                       new RegExp( '(^|\\s)' + mw.RegExp.escape( words[ i ] ), 'i' )
+                               );
                        }
                        return node;
                },
 
+               prefixHighlight: function ( node, prefix ) {
+                       $.highlightText.innerHighlight(
+                               node,
+                               new RegExp( '(^)' + mw.RegExp.escape( prefix ), 'i' )
+                       );
+               },
+
                // scans a node looking for the pattern and wraps a span around each match
                innerHighlight: function ( node, pat ) {
                        var i, match, pos, spannode, middlebit, middleclone;
@@ -28,7 +38,7 @@
                                // non latin characters can make regex think a new word has begun: do not use \b
                                // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
                                // look for an occurrence of our pattern and store the starting position
-                               match = node.data.match( new RegExp( '(^|\\s)' + mw.RegExp.escape( pat ), 'i' ) );
+                               match = node.data.match( pat );
                                if ( match ) {
                                        pos = match.index + match[ 1 ].length; // include length of any matched spaces
                                        // create the span wrapper for the matched text
@@ -37,7 +47,7 @@
                                        // shave off the characters preceding the matched text
                                        middlebit = node.splitText( pos );
                                        // shave off any unmatched text off the end
-                                       middlebit.splitText( pat.length );
+                                       middlebit.splitText( match[ 0 ].length - match[ 1 ].length );
                                        // clone for appending to our span
                                        middleclone = middlebit.cloneNode( true );
                                        // append the matched text node to the span
                }
        };
 
-       $.fn.highlightText = function ( matchString ) {
+       /**
+        * Highlight certain text in current nodes (by wrapping it in `<span class="highlight">...</span>`).
+        *
+        * @param {string} matchString String to match
+        * @param {Object} [options]
+        * @param {string} [options.method='splitAndHighlight'] Method of matching to use, one of:
+        *   - 'splitAndHighlight': Split `matchString` on spaces, then match each word separately.
+        *   - 'prefixHighlight': Match `matchString` at the beginning of text only.
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.highlightText = function ( matchString, options ) {
+               options = options || {};
+               options.method = options.method || 'splitAndHighlight';
                return this.each( function () {
                        var $el = $( this );
                        $el.data( 'highlightText', { originalText: $el.text() } );
-                       $.highlightText.splitAndHighlight( this, matchString );
+                       $.highlightText[ options.method ]( this, matchString );
                } );
        };
 
index 4353dd7..0aaa4ff 100644 (file)
@@ -12,6 +12,7 @@
  *
  * @author Timo Tijhof, 2011-2012
  */
+/* eslint-env qunit */
 ( function ( mw, $ ) {
        'use strict';
 
index 76b4845..6c7bd0e 100644 (file)
@@ -36,5 +36,5 @@
 
        /* IE < 8 */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
index f6b4fd1..2cc0cc9 100644 (file)
@@ -6,7 +6,7 @@
        top: 0;
        left: 0;
        width: 0;
-       border: none;
+       border: 0;
        z-index: 1099;
        padding: 0;
        margin: -1px 0 0 0;
@@ -17,7 +17,6 @@
        background-color: #fff;
        cursor: pointer;
        border: solid 1px #aaa;
-       padding: 0;
        margin: 0;
        margin-top: -2px;
        display: none;
index f3e4e09..fdc8a26 100644 (file)
                                                                }
 
                                                                if ( context.config.highlightInput ) {
-                                                                       $result.highlightText( context.data.prevText );
+                                                                       $result.highlightText( context.data.prevText, { method: 'prefixHighlight' } );
                                                                }
 
                                                                // Widen results box if needed (new width is only calculated here, applied later).
                                                                // Don't interfere with special clicks (e.g. to open in new tab)
                                                                if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                        // This will hide the link we're just clicking on, which causes problems
-                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       // when done synchronously in at least Firefox 3.6 (T64858).
                                                                        setTimeout( function () {
                                                                                $.suggestions.hide( context );
                                                                        }, 0 );
                                                                // Don't interfere with special clicks (e.g. to open in new tab)
                                                                if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                        // This will hide the link we're just clicking on, which causes problems
-                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       // when done synchronously in at least Firefox 3.6 (T64858).
                                                                        setTimeout( function () {
                                                                                $.suggestions.hide( context );
                                                                        }, 0 );
index 1b64237..f84c091 100644 (file)
@@ -63,7 +63,7 @@
                var $node = $( node ),
                        // Use data-sort-value attribute.
                        // Use data() instead of attr() so that live value changes
-                       // are processed as well (bug 38152).
+                       // are processed as well (T40152).
                        data = $node.data( 'sortValue' );
 
                if ( data !== null && data !== undefined ) {
index f4ef540..11f472e 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* Table Sorting */
 
index c897302..c6ad945 100644 (file)
@@ -4,7 +4,7 @@
 ( function ( $ ) {
        if ( document.selection && document.selection.createRange ) {
                // On IE, patch the focus() method to restore the windows' scroll position
-               // (bug 32241)
+               // (T34241)
                $.fn.extend( {
                        focus: ( function ( jqFocus ) {
                                return function () {
@@ -56,7 +56,7 @@
                 */
                function activateElementOnIE( element ) {
                        if ( element.setActive ) {
-                               element.setActive(); // bug 32241: doesn't scroll
+                               element.setActive(); // T34241: doesn't scroll
                        } else {
                                $( element ).focus(); // may scroll (but we patched it above)
                        }
                                                        // IE
 
                                                        // Note that IE9 will trigger the next section unless we check this first.
-                                                       // See bug 35201.
+                                                       // See bug T37201.
 
                                                        activateElementOnIE( this );
                                                        if ( context ) {
                                                // IE doesn't properly report non-selected caret position through
                                                // the selection ranges when textarea isn't focused. This can
                                                // lead to saving a bogus empty selection, which then screws up
-                                               // whatever we do later (bug 31847).
+                                               // whatever we do later (T33847).
                                                activateElementOnIE( e );
 
                                                preFinished = false;
index 011f9c5..938962f 100644 (file)
@@ -2,27 +2,31 @@
        var collapsibleLists, handleOne;
 
        // Collapsible lists of categories and templates
+       // If changing or removing a storeKey, ensure there is a strategy for old keys.
+       // E.g. detect existence via requestIdleCallback and remove. (T121646)
        collapsibleLists = [
                {
                        listSel: '.templatesUsed ul',
                        togglerSel: '.mw-templatesUsedExplanation',
-                       cookieName: 'templates-used-list'
+                       storeKey: 'mwedit-state-templatesUsed'
                },
                {
                        listSel: '.hiddencats ul',
                        togglerSel: '.mw-hiddenCategoriesExplanation',
-                       cookieName: 'hidden-categories-list'
+                       storeKey: 'mwedit-state-hiddenCategories'
                },
                {
                        listSel: '.preview-limit-report-wrapper',
                        togglerSel: '.mw-limitReportExplanation',
-                       cookieName: 'preview-limit-report'
+                       storeKey: 'mwedit-state-limitReport'
                }
        ];
 
-       handleOne = function ( $list, $toggler, cookieName ) {
-               // Collapsed by default
-               var isCollapsed = mw.cookie.get( cookieName ) !== 'expanded';
+       handleOne = function ( $list, $toggler, storeKey ) {
+               var collapsedVal = '0',
+                       expandedVal = '1',
+                       // Default to collapsed if not set
+                       isCollapsed = mw.storage.get( storeKey ) !== expandedVal;
 
                // Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
                $toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
 
                $list.on( 'beforeExpand.mw-collapsible', function () {
                        $toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
-                       mw.cookie.set( cookieName, 'expanded' );
+                       mw.storage.set( storeKey, expandedVal );
                } );
 
                $list.on( 'beforeCollapse.mw-collapsible', function () {
                        $toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
-                       mw.cookie.set( cookieName, 'collapsed' );
+                       mw.storage.set( storeKey, collapsedVal );
                } );
        };
 
@@ -55,7 +59,7 @@
                        handleOne(
                                $editForm.find( collapsibleLists[ i ].listSel ),
                                $editForm.find( collapsibleLists[ i ].togglerSel ),
-                               collapsibleLists[ i ].cookieName
+                               collapsibleLists[ i ].storeKey
                        );
                }
        } );
index 9b0c430..f68dbfa 100644 (file)
@@ -11,5 +11,5 @@
        display: inline-block;
        /* IE7 */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable declaration-block-no-duplicate-properties */
 }
index f26c336..15d0a39 100644 (file)
 
                // This should be moved down to '#editform', but is kept on the body for now
                // because the LiquidThreads extension is re-using this module with only half
-               // the EditPage (doesn't include #editform presumably, bug 55463).
+               // the EditPage (doesn't include #editform presumably, T57463).
                $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
        } );
 
index 7e966ea..31c22af 100644 (file)
@@ -59,6 +59,7 @@
                        }
 
                        params = {
+                               formatversion: 2,
                                action: 'stashedit',
                                title: mw.config.get( 'wgPageName' ),
                                section: section,
index d288e6b..d228236 100644 (file)
        font-size: 0.9em;
 }
 
-#wpSummary {
+input#wpSummary {
        display: block;
+       background-color: #fff;
+       color: #000;
+       width: 80%;
        margin-top: 0;
-       margin-bottom: 0.5em;
+       margin-bottom: 1em;
+       padding: 0.625em 0.546875em 0.546875em;
+       border: 1px solid #a2a9b1;
+       border-radius: 2px;
+       box-shadow: inset 0 0 0 1px #fff;
+       font-family: inherit;
+       font-size: inherit;
+       -webkit-transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+       -moz-transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+       transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+}
+
+input#wpSummary:focus,
+input#wpSummary:active {
+       outline: 0;
+       border-color: #36c;
+       box-shadow: inset 0 0 0 1px #36c;
 }
 
 .editButtons input:first-child {
-       margin-left: .1em;
+       margin-left: 0.1em;
 }
 
 /*
index fd5dbc9..f3ea163 100644 (file)
@@ -1,6 +1,6 @@
 /* Styles for the JavaScript enhancements of the history page */
 
-#pagehistory li.before input[name="oldid"],
-#pagehistory li.after input[name="diff"] {
+#pagehistory li.before input[name='oldid'],
+#pagehistory li.after input[name='diff'] {
        visibility: hidden;
 }
index 7439754..d89cd4a 100644 (file)
@@ -8,9 +8,9 @@
                        // Recheck preference so extensions can do a hack to disable this code.
                        if ( parseInt( mw.user.options.get( 'editondblclick' ), 10 ) ) {
                                e.preventDefault();
-                               // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                               // Trigger native HTMLElement click instead of opening URL (T45052)
                                $a = $( '#ca-edit a' );
-                               // Not every page has an edit link (bug 57713)
+                               // Not every page has an edit link (T59713)
                                if ( $a.length ) {
                                        $a.get( 0 ).click();
                                }
index 1f0365e..d466216 100644 (file)
@@ -33,7 +33,7 @@
 
 /*
  * Add a checkered background image on hover for file
- * description pages. (bug 26470)
+ * description pages. (T28470)
  */
 .filehistory a img,
 #file img:hover {
@@ -76,6 +76,8 @@
        font-size: 0.8em;
        margin-left: 0.5em;
        margin-bottom: 0.5em;
+       border: 0;
+       border-collapse: collapse;
        width: 400px;
 }
 
        font-weight: bold;
 }
 
-.mw_metadata th {
-       font-weight: normal;
-       text-align: center;
-}
-
-.mw_metadata td {
-       padding: 0.1em;
-}
-
-.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
 .mw_metadata td,
 .mw_metadata th {
        border: 1px solid #a2a9b1;
 
 .mw_metadata th {
        background-color: #f8f9fa;
+       font-weight: normal;
+       text-align: center;
 }
 
 .mw_metadata td {
        background-color: #fcfcfc;
+       padding-top: 0.1em;
+       padding-bottom: 0.1em;
 }
 
 .mw_metadata ul.metadata-langlist {
index 9a8edef..a5ca65e 100644 (file)
@@ -16,7 +16,7 @@
        position: relative;
        top: 0.6em;
        left: -50%;
-       padding: .6em 3.6em .6em 1.1em;
+       padding: 0.6em 3.6em 0.6em 1.1em;
        line-height: 1.5625em;
        color: #626465;
        background-color: #f4f4f4;
@@ -32,7 +32,7 @@
 }
 
 .skin-monobook .postedit {
-       top: 6em !important;
+       top: 6em !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .postedit-faded {
@@ -55,7 +55,7 @@
 
 .postedit-close {
        position: absolute;
-       padding: 0 .8em;
+       padding: 0 0.8em;
        right: 0;
        top: 0;
        font-size: 1.25em;
index b791db8..dccbacc 100644 (file)
        list-style: none none;
        display: inline;
        /* shared.css has some very weird directionality-specific rules for 'ul' we need to override,
-          search for "Correct directionality when page dir is different from site/user dir" */
+        * search for "Correct directionality when page dir is different from site/user dir" */
+       /* stylelint-disable declaration-no-important */
        margin: 0 !important;
        padding: 0 !important;
+       /* stylelint-enable declaration-no-important */
 }
 
 /* @noflip */
index ada101e..ebd1ebc 100644 (file)
@@ -18,7 +18,7 @@ jQuery( function ( $ ) {
                // inside the heading (e.g. to do things like copy URL, open in new tab, ..).
                // e.target can be the heading, but it can also be anything inside the heading.
                if ( e.target.nodeName.toLowerCase() !== 'a' ) {
-                       // Trigger native HTMLElement click instead of opening URL (bug 43052)
+                       // Trigger native HTMLElement click instead of opening URL (T45052)
                        e.preventDefault();
                        $edit.get( 0 ).click();
                }
index ec94df3..b047f62 100644 (file)
@@ -99,26 +99,26 @@ img {
  * MediaWiki-specific elements
  */
 #globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
+       width: 100% !important; /* stylelint-disable-line declaration-no-important */
+       min-width: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-body {
        background: #fff;
        color: #000;
-       border: 0 !important;
-       padding: 0 !important;
-       margin: 0 !important;
+       border: 0 !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
        direction: ltr;
 }
 
 #column-content {
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #column-content .mw-body {
        padding: 1em;
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #toc {
@@ -164,14 +164,14 @@ img {
  * Links
  */
 a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* Expand URLs for printing */
 .mw-body a.external.text:after,
 .mw-body a.external.autonumber:after {
-       content: " (" attr( href ) ")";
+       content: ' (' attr( href ) ')';
        word-break: break-all;
        word-wrap: break-word;
 }
@@ -179,25 +179,19 @@ a {
 /* Expand protocol-relative URLs for printing */
 .mw-body a.external.text[href^='//']:after,
 .mw-body a.external.autonumber[href^='//']:after {
-       content: " (https:" attr( href ) ")";
+       content: ' (https:' attr( href ) ')';
 }
 
-/* MSIE/Win doesn't understand 'inherit' */
 a,
 a.external,
 a.new,
 a.stub {
-       color: #000 !important;
-       text-decoration: none !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-       color: inherit !important;
-       text-decoration: inherit !important;
+       /* IE 6 & 7 don't understand `inherit` */
+       color: #000 !important; /* stylelint-disable-line declaration-no-important */
+       text-decoration: none !important; /* stylelint-disable-line declaration-no-important */
+       /* Modern browser will apply this, IE 6 & 7 ignore the unknown */
+       color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
+       text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
 }
 
 /**
@@ -258,7 +252,7 @@ html .thumbimage {
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        text-align: left;
        line-height: 1.4em;
        padding: 3px;
@@ -336,13 +330,13 @@ table.listing td {
 .catlinks li {
        display: inline-block;
        line-height: 1.15em;
-       padding: 0 .4em;
+       padding: 0 0.4em;
        border-left: 1pt solid #aaa;
        margin: 0.1em 0;
 }
 
 .catlinks li:first-child {
-       padding-left: .2em;
+       padding-left: 0.2em;
        border-left: 0;
 }
 
index 4daf77f..7c4dbb1 100644 (file)
@@ -32,7 +32,12 @@ h6 {
        font-size: 1em;
 }
 
-h1, h2, h3, h4, h5, h6 {
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
        font-weight: bolder;
 }
 
@@ -78,7 +83,7 @@ table.rimage {
 
 /* thumbnails */
 div.thumb {
-       margin-bottom: .5em;
+       margin-bottom: 0.5em;
        border-style: solid;
        border-color: #fff;
        width: auto;
@@ -100,7 +105,7 @@ html .thumbimage {
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
@@ -136,15 +141,15 @@ div.magnify a {
 div.tright {
        clear: right;
        float: right;
-       border-width: .5em 0 .8em 1.4em;
+       border-width: 0.5em 0 0.8em 1.4em;
 }
 
 /* @noflip */
 div.tleft {
        float: left;
        clear: left;
-       margin-right: .5em;
-       border-width: .5em 1.4em .8em 0;
+       margin-right: 0.5em;
+       border-width: 0.5em 1.4em 0.8em 0;
 }
 
 img.thumbborder {
@@ -158,14 +163,14 @@ img.thumbborder {
 }
 
 img {
-       border: none;
+       border: 0;
 }
 
 #toc,
 .toc {
        border: 1px solid #bba;
        background-color: #f7f8ff;
-       padding: 5px;
+       padding: 7px;
        font-size: 95%;
        text-align: center;
        display: inline-block;
@@ -173,9 +178,7 @@ img {
 
        /* IE7 and earlier */
        zoom: 1;
-       *display: inline;
-
-       padding: 7px;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
 
 /* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
@@ -193,7 +196,7 @@ table.toc td {
 #toc h2,
 .toc h2 {
        display: inline;
-       border: none;
+       border: 0;
        padding: 0;
        font-size: 100%;
        font-weight: bold;
@@ -308,9 +311,7 @@ span.comment {
 }
 
 .editExternally {
-       border-style: solid;
-       border-width: 1px;
-       border-color: #808080;
+       border: 1px solid #808080;
        background: #fff;
        padding: 3px;
        margin-top: 0.5em;
@@ -333,25 +334,14 @@ li span.deleted {
 /* Classes for Exif data display */
 table.mw_metadata {
        margin-left: 0.5em;
+       border: 0;
+       border-collapse: collapse;
 }
 
 table.mw_metadata caption {
        font-weight: bold;
 }
 
-table.mw_metadata th {
-       font-weight: normal;
-}
-
-table.mw_metadata td {
-       padding: 0.1em;
-}
-
-table.mw_metadata {
-       border: none;
-       border-collapse: collapse;
-}
-
 table.mw_metadata td,
 table.mw_metadata th {
        border: 1px solid #aaa;
@@ -361,16 +351,18 @@ table.mw_metadata th {
 
 table.mw_metadata th {
        background-color: #f9f9f9;
+       font-weight: normal;
 }
 
 table.mw_metadata td {
        background-color: #fcfcfc;
+       padding-top: 0.1em;
+       padding-bottom: 0.1em;
 }
 
 table.mw_metadata td.spacer {
        background: inherit;
-       border-top: none;
-       border-bottom: none;
+       border-width: 0 1px;
 }
 
 .visualClear {
@@ -399,14 +391,14 @@ table.mw_metadata td.spacer {
 }
 
 div.multipageimagenavbox {
-       border: solid 1px #c0c0c0;
+       border: 1px solid #c0c0c0;
        padding: 4px;
        margin: 1em;
        background: #f0f0f0;
 }
 
 div.multipageimagenavbox div.thumb {
-       border: none;
+       border: 0;
        margin-left: 2em;
        margin-right: 2em;
 }
index befe957..ff0c0e3 100644 (file)
@@ -56,22 +56,22 @@ wbr {
 
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
+input[type='submit'],
+input[type='button'],
+input[type='reset'],
+input[type='file'] {
        direction: ltr;
 }
 
 /* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
+textarea[dir='ltr'],
+input[dir='ltr'] {
        /* @noflip */
        direction: ltr;
 }
 
-textarea[dir="rtl"],
-input[dir="rtl"] {
+textarea[dir='rtl'],
+input[dir='rtl'] {
        /* @noflip */
        direction: rtl;
 }
@@ -83,10 +83,10 @@ abbr[title],
        cursor: help;
 }
 
-@supports (text-decoration: underline dotted) {
+@supports ( text-decoration: underline dotted ) {
        abbr[title],
        .explain[title] {
-               border-bottom: none;
+               border-bottom: 0;
                text-decoration: underline dotted;
        }
 }
@@ -166,6 +166,7 @@ div.patrollink {
  */
 td.mw-label {
        text-align: right;
+       vertical-align: middle;
 }
 
 td.mw-input {
@@ -174,21 +175,9 @@ td.mw-input {
 
 td.mw-submit {
        text-align: left;
-}
-
-td.mw-label {
-       vertical-align: middle;
-}
-
-td.mw-submit {
        white-space: nowrap;
 }
 
-input#wpSummary {
-       width: 80%;
-       margin-bottom: 1em;
-}
-
 .mw-input-with-label {
        white-space: nowrap;
        display: inline-block;
@@ -226,7 +215,7 @@ input#wpSummary {
 #catlinks {
        /**
         * Overrides text justification (user preference)
-        * See bug 31990
+        * See T33990
         */
        text-align: left;
 }
@@ -248,15 +237,15 @@ input#wpSummary {
        margin: 0.125em 0;
        padding: 0 0.5em;
        zoom: 1;
-       display: inline !ie;
+       display: inline !ie; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
 
 .catlinks li:first-child {
        padding-left: 0.25em;
-       border-left: none;
+       border-left: 0;
 }
 
-/* (bug 5346) make category redirects italic */
+/* (T7346) make category redirects italic */
 .catlinks li a.mw-redirect {
        font-style: italic;
 }
@@ -328,7 +317,7 @@ th.mw-revdel-checkbox {
        text-align: center;
 }
 
-/* red links; see bug 36276 */
+/* red links; see T38276 */
 a.new {
        color: #ba0000;
 }
@@ -336,11 +325,11 @@ a.new {
 /* Plainlinks - this can be used to switch
  * off special external link styling */
 .plainlinks a.external {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
-/* External URLs should always be treated as LTR (bug 4330) */
+/* External URLs should always be treated as LTR (T6330) */
 /* @noflip */ .rtl a.external.free,
 .rtl a.external.autonumber {
        direction: ltr;
@@ -400,11 +389,11 @@ table.wikitable > caption {
 .warningbox,
 .successbox {
        border: 1px solid;
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        margin-bottom: 1em;
        display: inline-block;
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
 }
 
 .errorbox h2,
@@ -414,8 +403,8 @@ table.wikitable > caption {
        color: inherit;
        font-weight: bold;
        display: inline;
-       margin: 0 .5em 0 0;
-       border: none;
+       margin: 0 0.5em 0 0;
+       border: 0;
 }
 
 .errorbox {
@@ -551,103 +540,106 @@ table.wikitable > caption {
 }
 
 .mw-small-spinner {
-       padding: 10px !important;
+       padding: 10px !important; /* stylelint-disable-line declaration-no-important */
        margin-right: 0.6em;
        background-image: url( images/spinner.gif );
        background-position: center center;
        background-repeat: no-repeat;
 }
 
-/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Language specific height correction for titles. Ref T31405 and T32809 */
 /* Languages like hi or ml require slightly more vertical space to show diacritics properly */
-h1:lang(anp),
-h1:lang(as),
-h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
-h1:lang(bho),
-h1:lang(bn),
-h1:lang(gu),
-h1:lang(hi),
-h1:lang(kn),
-h1:lang(ks),
-h1:lang(ml),
-h1:lang(mr),
-h1:lang(my),
-h1:lang(mai),
-h1:lang(ne),
-h1:lang(new),
-h1:lang(or),
-h1:lang(pa),
-h1:lang(pi),
-h1:lang(sa),
-h1:lang(ta),
-h1:lang(te) {
-       line-height: 1.6em !important;
-}
-
-h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
-h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
-h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
-h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
-h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
-h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
-h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
-h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
-h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
-h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
-h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
-h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
-h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
-h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
-h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
-h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
-h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
-h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
-h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
-h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
-h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+h1:lang( anp ),
+h1:lang( as ),
+h1:lang( bh ), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
+h1:lang( bho ),
+h1:lang( bn ),
+h1:lang( gu ),
+h1:lang( hi ),
+h1:lang( kn ),
+h1:lang( ks ),
+h1:lang( ml ),
+h1:lang( mr ),
+h1:lang( my ),
+h1:lang( mai ),
+h1:lang( ne ),
+h1:lang( new ),
+h1:lang( or ),
+h1:lang( pa ),
+h1:lang( pi ),
+h1:lang( sa ),
+h1:lang( ta ),
+h1:lang( te ) {
+       line-height: 1.6em !important; /* stylelint-disable-line declaration-no-important */
+}
+
+/* stylelint-disable selector-list-comma-newline-after */
+h2:lang( anp ), h3:lang( anp ), h4:lang( anp ), h5:lang( anp ), h6:lang( anp ),
+h2:lang( as ), h3:lang( as ), h4:lang( as ), h5:lang( as ), h6:lang( as ),
+h2:lang( bho ), h3:lang( bho ), h4:lang( bho ), h5:lang( bho ), h6:lang( bho ),
+h2:lang( bh ), h3:lang( bh ), h4:lang( bh ), h5:lang( bh ), h6:lang( bh ),
+h2:lang( bn ), h3:lang( bn ), h4:lang( bn ), h5:lang( bn ), h6:lang( bn ),
+h2:lang( gu ), h3:lang( gu ), h4:lang( gu ), h5:lang( gu ), h6:lang( gu ),
+h2:lang( hi ), h3:lang( hi ), h4:lang( hi ), h5:lang( hi ), h6:lang( hi ),
+h2:lang( kn ), h3:lang( kn ), h4:lang( kn ), h5:lang( kn ), h6:lang( kn ),
+h2:lang( ks ), h3:lang( ks ), h4:lang( ks ), h5:lang( ks ), h6:lang( ks ),
+h2:lang( ml ), h3:lang( ml ), h4:lang( ml ), h5:lang( ml ), h6:lang( ml ),
+h2:lang( mr ), h3:lang( mr ), h4:lang( mr ), h5:lang( mr ), h6:lang( mr ),
+h2:lang( my ), h3:lang( my ), h4:lang( my ), h5:lang( my ), h6:lang( my ),
+h2:lang( mai ), h3:lang( mai ), h4:lang( mai ), h5:lang( mai ), h6:lang( mai ),
+h2:lang( ne ), h3:lang( ne ), h4:lang( ne ), h5:lang( ne ), h6:lang( ne ),
+h2:lang( new ), h3:lang( new ), h4:lang( new ), h5:lang( new ), h6:lang( new ),
+h2:lang( or ), h3:lang( or ), h4:lang( or ), h5:lang( or ), h6:lang( or ),
+h2:lang( pa ), h3:lang( pa ), h4:lang( pa ), h5:lang( pa ), h6:lang( pa ),
+h2:lang( pi ), h3:lang( pi ), h4:lang( pi ), h5:lang( pi ), h6:lang( pi ),
+h2:lang( sa ), h3:lang( sa ), h4:lang( sa ), h5:lang( sa ), h6:lang( sa ),
+h2:lang( ta ), h3:lang( ta ), h4:lang( ta ), h5:lang( ta ), h6:lang( ta ),
+h2:lang( te ), h3:lang( te ), h4:lang( te ), h5:lang( te ), h6:lang( te ) {
        line-height: 1.2em;
 }
+/* stylelint-enable selector-list-comma-newline-after */
 
 /* Localised ordered list numbering for some languages */
-ol:lang(azb) li,
-ol:lang(bcc) li,
-ol:lang(bgn) li,
-ol:lang(bqi) li,
-ol:lang(fa) li,
-ol:lang(glk) li,
-ol:lang(kk-arab) li,
-ol:lang(lrc) li,
-ol:lang(luz) li,
-ol:lang(mzn) li {
+ol:lang( azb ) li,
+ol:lang( bcc ) li,
+ol:lang( bgn ) li,
+ol:lang( bqi ) li,
+ol:lang( fa ) li,
+ol:lang( glk ) li,
+ol:lang( kk-arab ) li,
+ol:lang( lrc ) li,
+ol:lang( luz ) li,
+ol:lang( mzn ) li {
        list-style-type: -moz-persian;
        list-style-type: persian;
 }
 
-ol:lang(ckb) li,
-ol:lang(sdh) li {
+ol:lang( ckb ) li,
+ol:lang( sdh ) li {
        list-style-type: -moz-arabic-indic;
        list-style-type: arabic-indic;
 }
 
-ol:lang(hi) li,
-ol:lang(mr) li {
+ol:lang( hi ) li,
+ol:lang( mr ) li {
        list-style-type: -moz-devanagari;
        list-style-type: devanagari;
 }
 
-ol:lang(as) li,
-ol:lang(bn) li {
+ol:lang( as ) li,
+ol:lang( bn ) li {
        list-style-type: -moz-bengali;
        list-style-type: bengali;
 }
 
-ol:lang(or) li {
+ol:lang( or ) li {
        list-style-type: -moz-oriya;
        list-style-type: oriya;
 }
 
-#toc ul, .toc ul {
-       margin: .3em 0;
+#toc ul,
+.toc ul {
+       margin: 0.3em 0;
 }
 
 /* Correct directionality when page dir is different from site/user dir */
@@ -724,7 +716,7 @@ table.floatleft {
        position: relative;
 }
 
-/* bug 12205 */
+/* T14205 */
 #mw-credits a {
        unicode-bidi: embed;
 }
index fd615b7..651a018 100644 (file)
@@ -9,4 +9,4 @@
        -webkit-transform: rotate( @deg );
        -moz-transform: rotate( @deg );
        transform: rotate( @deg );
-}
\ No newline at end of file
+}
index 3535be8..1e952b0 100644 (file)
@@ -1,7 +1,7 @@
 // Common Less mixin library for MediaWiki
 //
 // By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
-// which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+// which makes this file importable by all less files via `@import 'mediawiki.mixins';`.
 //
 // The mixins included below are considered a public interface for MediaWiki extensions.
 // The signatures of parametrized mixins should be kept as stable as possible.
 }
 
 .flex-display( @display: flex ) {
-       display: ~"-webkit-@{display}"; // iOS 6-, Safari 3.1-6
-       display: ~"-moz-@{display}"; // Firefox 21-
-       display: ~"-ms-@{display}box"; // IE 10
+       display: ~'-webkit-@{display}'; // iOS 6-, Safari 3.1-6
+       display: ~'-moz-@{display}'; // Firefox 21-
+       display: ~'-ms-@{display}box'; // IE 10
        display: @display;
 }
 
+.flex-wrap( @wrap: wrap ) {
+       -webkit-flex-wrap: @wrap; // iOS 6-, Safari 3.1-6
+       -moz-flex-wrap: @wrap; // Firefox 21-
+       -ms-flex-wrap: @wrap; // IE 10
+       flex-wrap: @wrap;
+}
+
 .flex( @grow: 1, @shrink: 1, @width: auto, @order: 1 ) {
        // For 2009/2012 spec alignment consistency with current default
        -webkit-box-pack: justify; // iOS 6-, Safari 3.1-6
        order: @order;
 }
 
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+.mixin-placeholder( @rules ) {
+       // WebKit, Blink, Edge
+       &::-webkit-input-placeholder {
+               @rules();
+       }
+       // Internet Explorer 10-11
+       &:-ms-input-placeholder {
+               @rules();
+       }
+       // Firefox 19-
+       &::-moz-placeholder {
+               @rules();
+       }
+       // Firefox 4-18
+       &:-moz-placeholder {
+               @rules();
+       }
+       // W3C Standard Selectors Level 4
+       &::placeholder {
+               @rules();
+       }
+       // For inputs that use jquery.placeholder.js e.g. IE9
+       &.placeholder {
+               @rules();
+       }
+}
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 
 // Screen Reader Helper Mixin
 .mixin-screen-reader-text() {
        display: block;
-       position: absolute !important;
+       position: absolute !important; /* stylelint-disable-line declaration-no-important */
        clip: rect( 1px, 1px, 1px, 1px );
        width: 1px;
        height: 1px;
index a404286..64d6b3d 100644 (file)
@@ -1,7 +1,7 @@
 // This is a separate file because importing the mixin causes
 // the keyframes blocks to be included in the output, regardless
 // of whether .rotation is used.
-@import "mediawiki.mixins.animation";
+@import 'mediawiki.mixins.animation';
 
 .rotate-frames() {
        from {
index 1bfa3a3..a0ff767 100644 (file)
@@ -17,8 +17,8 @@
        line-height: normal;
        font-weight: normal;
 
-       & > input[type="checkbox"],
-       & > input[type="radio"] {
+       & > input[type='checkbox'],
+       & > input[type='radio'] {
                width: auto;
                height: auto;
                margin: 0 0.1em 0 0;
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js
new file mode 100644 (file)
index 0000000..d6ce734
--- /dev/null
@@ -0,0 +1,60 @@
+( function ( mw ) {
+       /**
+        * View model for the changes list
+        *
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        */
+       mw.rcfilters.dm.ChangesListViewModel = function MwRcfiltersDmChangesListViewModel() {
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+
+               this.valid = true;
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.dm.ChangesListViewModel );
+       OO.mixinClass( mw.rcfilters.dm.ChangesListViewModel, OO.EventEmitter );
+
+       /* Events */
+
+       /**
+        * @event invalidate
+        *
+        * The list of changes is now invalid (out of date)
+        */
+
+       /**
+        * @event update
+        * @param {jQuery|string} changesListContent
+        *
+        * The list of change is now up to date
+        */
+
+       /* Methods */
+
+       /**
+        * Invalidate the list of changes
+        *
+        * @fires invalidate
+        */
+       mw.rcfilters.dm.ChangesListViewModel.prototype.invalidate = function () {
+               if ( this.valid ) {
+                       this.valid = false;
+                       this.emit( 'invalidate' );
+               }
+       };
+
+       /**
+        * Update the model with an updated list of changes
+        *
+        * @param {jQuery|string} changesListContent
+        * @param {jQuery} $fieldset
+        */
+       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset ) {
+               this.valid = true;
+               this.emit( 'update', changesListContent, $fieldset );
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
new file mode 100644 (file)
index 0000000..14a610b
--- /dev/null
@@ -0,0 +1,183 @@
+( function ( mw ) {
+       /**
+        * View model for a filter group
+        *
+        * @mixins OO.EventEmitter
+        * @mixins OO.EmitterList
+        *
+        * @constructor
+        * @param {string} name Group name
+        * @param {Object} [config] Configuration options
+        * @cfg {string} [type='send_unselected_if_any'] Group type
+        * @cfg {string} [title] Group title
+        * @cfg {string} [separator='|'] Value separator for 'string_options' groups
+        * @cfg {boolean} [active] Group is active
+        * @cfg {boolean} [fullCoverage] This filters in this group collectively cover all results
+        */
+       mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) {
+               config = config || {};
+
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+               OO.EmitterList.call( this );
+
+               this.name = name;
+               this.type = config.type || 'send_unselected_if_any';
+               this.title = config.title;
+               this.separator = config.separator || '|';
+
+               this.active = !!config.active;
+               this.fullCoverage = !!config.fullCoverage;
+
+               this.aggregate( { update: 'filterItemUpdate' } );
+               this.connect( this, { filterItemUpdate: 'onFilterItemUpdate' } );
+       };
+
+       /* Initialization */
+       OO.initClass( mw.rcfilters.dm.FilterGroup );
+       OO.mixinClass( mw.rcfilters.dm.FilterGroup, OO.EventEmitter );
+       OO.mixinClass( mw.rcfilters.dm.FilterGroup, OO.EmitterList );
+
+       /* Events */
+
+       /**
+        * @event update
+        *
+        * Group state has been updated
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to filterItem update event
+        *
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.onFilterItemUpdate = function () {
+               // Update state
+               var active = this.areAnySelected();
+
+               if ( this.active !== active ) {
+                       this.active = active;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Get group active state
+        *
+        * @return {boolean} Active state
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.isActive = function () {
+               return this.active;
+       };
+
+       /**
+        * Get group name
+        *
+        * @return {string} Group name
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Check whether there are any items selected
+        *
+        * @return {boolean} Any items in the group are selected
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.areAnySelected = function () {
+               return this.getItems().some( function ( filterItem ) {
+                       return filterItem.isSelected();
+               } );
+       };
+
+       /**
+        * Check whether all items selected
+        *
+        * @return {boolean} All items are selected
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.areAllSelected = function () {
+               return this.getItems().every( function ( filterItem ) {
+                       return filterItem.isSelected();
+               } );
+       };
+
+       /**
+        * Get all selected items in this group
+        *
+        * @param {mw.rcfilters.dm.FilterItem} [excludeItem] Item to exclude from the list
+        * @return {mw.rcfilters.dm.FilterItem[]} Selected items
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getSelectedItems = function ( excludeItem ) {
+               var excludeName = ( excludeItem && excludeItem.getName() ) || '';
+
+               return this.getItems().filter( function ( item ) {
+                       return item.getName() !== excludeName && item.isSelected();
+               } );
+       };
+
+       /**
+        * Check whether all selected items are in conflict with the given item
+        *
+        * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item to test
+        * @return {boolean} All selected items are in conflict with this item
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.areAllSelectedInConflictWith = function ( filterItem ) {
+               var selectedItems = this.getSelectedItems( filterItem );
+
+               return selectedItems.length > 0 && selectedItems.every( function ( selectedFilter ) {
+                       return selectedFilter.existsInConflicts( filterItem );
+               } );
+       };
+
+       /**
+        * Check whether any of the selected items are in conflict with the given item
+        *
+        * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item to test
+        * @return {boolean} Any of the selected items are in conflict with this item
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.areAnySelectedInConflictWith = function ( filterItem ) {
+               var selectedItems = this.getSelectedItems( filterItem );
+
+               return selectedItems.length > 0 && selectedItems.some( function ( selectedFilter ) {
+                       return selectedFilter.existsInConflicts( filterItem );
+               } );
+       };
+
+       /**
+        * Get group type
+        *
+        * @return {string} Group type
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getType = function () {
+               return this.type;
+       };
+
+       /**
+        * Get group's title
+        *
+        * @return {string} Title
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getTitle = function () {
+               return this.title;
+       };
+
+       /**
+        * Get group's values separator
+        *
+        * @return {string} Values separator
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getSeparator = function () {
+               return this.separator;
+       };
+
+       /**
+        * Check whether the group is defined as full coverage
+        *
+        * @return {boolean} Group is full coverage
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.isFullCoverage = function () {
+               return this.fullCoverage;
+       };
+}( mediaWiki ) );
index 5dfb68d..18f1299 100644 (file)
@@ -6,6 +6,7 @@
         *
         * @constructor
         * @param {string} name Filter 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 {string} [label] The label for the filter
         * @cfg {boolean} [active=true] The filter is active and affecting the result
         * @cfg {string[]} [excludes=[]] A list of filter names this filter, if
         *  selected, makes inactive.
-        * @cfg {boolean} [default] The default state of this filter
+        * @cfg {boolean} [selected] The item is selected
+        * @cfg {string[]} [subset] Defining the names of filters that are a subset of this filter
+        * @cfg {string[]} [conflictsWith] Defining the names of filters that conflict with this item
+        * @cfg {string} [cssClass] The class identifying the results that match this filter
         */
-       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, config ) {
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, groupModel, config ) {
                config = config || {};
 
                // Mixin constructor
                OO.EventEmitter.call( this );
 
                this.name = name;
-               this.group = config.group || '';
+               this.groupModel = groupModel;
+
                this.label = config.label || this.name;
                this.description = config.description;
-               this.default = !!config.default;
+               this.selected = !!config.selected;
+
+               // Interaction definitions
+               this.subset = config.subset || [];
+               this.conflicts = config.conflicts || [];
+               this.superset = [];
 
-               this.active = config.active === undefined ? true : !!config.active;
-               this.excludes = config.excludes || [];
-               this.selected = this.default;
+               // Interaction states
+               this.included = false;
+               this.conflicted = false;
+               this.fullyCovered = false;
+
+               // Highlight
+               this.cssClass = config.cssClass;
+               this.highlightColor = null;
+               this.highlightEnabled = false;
        };
 
        /* Initialization */
 
        /* Methods */
 
+       /**
+        * Return the representation of the state of this item.
+        *
+        * @return {Object} State of the object
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getState = function () {
+               return {
+                       selected: this.isSelected(),
+                       included: this.isIncluded(),
+                       conflicted: this.isConflicted(),
+                       fullyCovered: this.isFullyCovered()
+               };
+       };
+
        /**
         * Get the name of this filter
         *
                return this.name;
        };
 
+       /**
+        * Get the model of the group this filter belongs to
+        *
+        * @return {mw.rcfilters.dm.FilterGroup} Filter group model
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getGroupModel = function () {
+               return this.groupModel;
+       };
+
        /**
         * Get the group name this filter belongs to
         *
         * @return {string} Filter group name
         */
-       mw.rcfilters.dm.FilterItem.prototype.getGroup = function () {
-               return this.group;
+       mw.rcfilters.dm.FilterItem.prototype.getGroupName = function () {
+               return this.groupModel.getName();
        };
 
        /**
                return this.default;
        };
 
+       /**
+        * Get filter subset
+        * This is a list of filter names that are defined to be included
+        * when this filter is selected.
+        *
+        * @return {string[]} Filter subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getSubset = function () {
+               return this.subset;
+       };
+
+       /**
+        * Get filter superset
+        * This is a generated list of filters that define this filter
+        * to be included when either of them is selected.
+        *
+        * @return {string[]} Filter superset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getSuperset = function () {
+               return this.superset;
+       };
+
        /**
         * Get the selected state of this filter
         *
        };
 
        /**
-        * Check if this filter is active
+        * Check whether the filter is currently in a conflict state
+        *
+        * @return {boolean} Filter is in conflict state
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isConflicted = function () {
+               return this.conflicted;
+       };
+
+       /**
+        * Check whether the filter is currently in an already included subset
+        *
+        * @return {boolean} Filter is in an already-included subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isIncluded = function () {
+               return this.included;
+       };
+
+       /**
+        * Check whether the filter is currently fully covered
+        *
+        * @return {boolean} Filter is in fully-covered state
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isFullyCovered = function () {
+               return this.fullyCovered;
+       };
+
+       /**
+        * Get filter conflicts
         *
-        * @return {boolean} Filter is active
+        * @return {string[]} Filter conflicts
         */
-       mw.rcfilters.dm.FilterItem.prototype.isActive = function () {
-               return this.active;
+       mw.rcfilters.dm.FilterItem.prototype.getConflicts = function () {
+               return this.conflicts;
        };
 
        /**
-        * Check if this filter has a list of excluded filters
+        * Set filter conflicts
+        *
+        * @param {string[]} conflicts Filter conflicts
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setConflicts = function ( conflicts ) {
+               this.conflicts = conflicts || [];
+       };
+
+       /**
+        * Set filter superset
+        *
+        * @param {string[]} superset Filter superset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setSuperset = function ( superset ) {
+               this.superset = superset || [];
+       };
+
+       /**
+        * Check whether a filter exists in the subset list for this filter
+        *
+        * @param {string} filterName Filter name
+        * @return {boolean} Filter name is in the subset list
+        */
+       mw.rcfilters.dm.FilterItem.prototype.existsInSubset = function ( filterName ) {
+               return this.subset.indexOf( filterName ) > -1;
+       };
+
+       /**
+        * Check whether this item has a potential conflict with the given item
+        *
+        * This checks whether the given item is in the list of conflicts of
+        * the current item, but makes no judgment about whether the conflict
+        * is currently at play (either one of the items may not be selected)
         *
-        * @return {boolean} Filter has a list of excluded filters
+        * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item
+        * @return {boolean} This item has a conflict with the given item
         */
-       mw.rcfilters.dm.FilterItem.prototype.hasExcludedFilters = function () {
-               return !!this.excludes.length;
+       mw.rcfilters.dm.FilterItem.prototype.existsInConflicts = function ( filterItem ) {
+               return this.conflicts.indexOf( filterItem.getName() ) > -1;
        };
 
        /**
-        * Get this filter's list of excluded filters
+        * Set the state of this filter as being conflicted
+        * (This means any filters in its conflicts are selected)
         *
-        * @return {string[]} Array of excluded filter names
+        * @param {boolean} [conflicted] Filter is in conflict state
+        * @fires update
         */
-       mw.rcfilters.dm.FilterItem.prototype.getExcludedFilters = function () {
-               return this.excludes;
+       mw.rcfilters.dm.FilterItem.prototype.toggleConflicted = function ( conflicted ) {
+               conflicted = conflicted === undefined ? !this.conflicted : conflicted;
+
+               if ( this.conflicted !== conflicted ) {
+                       this.conflicted = conflicted;
+                       this.emit( 'update' );
+               }
        };
 
        /**
-        * Toggle the active state of the item
+        * Set the state of this filter as being already included
+        * (This means any filters in its superset are selected)
         *
-        * @param {boolean} [isActive] Filter is active
+        * @param {boolean} [included] Filter is included as part of a subset
         * @fires update
         */
-       mw.rcfilters.dm.FilterItem.prototype.toggleActive = function ( isActive ) {
-               isActive = isActive === undefined ? !this.active : isActive;
+       mw.rcfilters.dm.FilterItem.prototype.toggleIncluded = function ( included ) {
+               included = included === undefined ? !this.included : included;
 
-               if ( this.active !== isActive ) {
-                       this.active = isActive;
+               if ( this.included !== included ) {
+                       this.included = included;
                        this.emit( 'update' );
                }
        };
                        this.emit( 'update' );
                }
        };
+
+       /**
+        * Toggle the fully covered state of the item
+        *
+        * @param {boolean} [isFullyCovered] Filter is fully covered
+        * @fires update
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleFullyCovered = function ( isFullyCovered ) {
+               isFullyCovered = isFullyCovered === undefined ? !this.fullycovered : isFullyCovered;
+
+               if ( this.fullyCovered !== isFullyCovered ) {
+                       this.fullyCovered = isFullyCovered;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Set the highlight color
+        *
+        * @param {string|null} highlightColor
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setHighlightColor = function ( highlightColor ) {
+               if ( this.highlightColor !== highlightColor ) {
+                       this.highlightColor = highlightColor;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Clear the highlight color
+        */
+       mw.rcfilters.dm.FilterItem.prototype.clearHighlightColor = function () {
+               this.setHighlightColor( null );
+       };
+
+       /**
+        * Get the highlight color, or null if none is configured
+        *
+        * @return {string|null}
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getHighlightColor = function () {
+               return this.highlightColor;
+       };
+
+       /**
+        * Get the CSS class that matches changes that fit this filter
+        * or null if none is configured
+        *
+        * @return {string|null}
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getCssClass = function () {
+               return this.cssClass;
+       };
+
+       /**
+        * Toggle the highlight feature on and off for this filter.
+        * It only works if highlight is supported for this filter.
+        *
+        * @param {boolean} enable Highlight should be enabled
+        */
+       mw.rcfilters.dm.FilterItem.prototype.toggleHighlight = function ( enable ) {
+               enable = enable === undefined ? !this.highlightEnabled : enable;
+
+               if ( !this.isHighlightSupported() ) {
+                       return;
+               }
+
+               if ( enable === this.highlightEnabled ) {
+                       return;
+               }
+
+               this.highlightEnabled = enable;
+               this.emit( 'update' );
+       };
+
+       /**
+        * Check if the highlight feature is currently enabled for this filter
+        *
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isHighlightEnabled = function () {
+               return !!this.highlightEnabled;
+       };
+
+       /**
+        * Check if the highlight feature is supported for this filter
+        *
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.FilterItem.prototype.isHighlightSupported = function () {
+               return !!this.getCssClass();
+       };
 }( mediaWiki ) );
index 3f7fa53..2afe286 100644 (file)
                OO.EmitterList.call( this );
 
                this.groups = {};
-               this.excludedByMap = {};
                this.defaultParams = {};
                this.defaultFiltersEmpty = null;
+               this.highlightEnabled = false;
 
                // Events
                this.aggregate( { update: 'filterItemUpdate' } );
-               this.connect( this, { filterItemUpdate: 'onFilterItemUpdate' } );
+               this.connect( this, { filterItemUpdate: [ 'emit', 'itemUpdate' ] } );
        };
 
        /* Initialization */
         * Filter item has changed
         */
 
-       /* Methods */
-
        /**
-        * Respond to filter item change.
+        * @event highlightChange
+        * @param {boolean} Highlight feature is enabled
         *
-        * @param {mw.rcfilters.dm.FilterItem} item Updated filter
-        * @fires itemUpdate
+        * Highlight feature has been toggled enabled or disabled
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.onFilterItemUpdate = function ( item ) {
-               // Reapply the active state of filters
-               this.reapplyActiveFilters( item );
 
-               this.emit( 'itemUpdate', item );
-       };
+       /* Methods */
 
        /**
-        * Calculate the active state of the filters, based on selected filters in the group.
+        * Re-assess the states of filter items based on the interactions between them
         *
-        * @param {mw.rcfilters.dm.FilterItem} item Changed item
+        * @param {mw.rcfilters.dm.FilterItem} [item] Changed item. If not given, the
+        *  method will go over the state of all items
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.reapplyActiveFilters = function ( item ) {
-               var selectedItemsCount,
-                       group = item.getGroup(),
-                       model = this;
-               if (
-                       !this.groups[ group ].exclusionType ||
-                       this.groups[ group ].exclusionType === 'default'
-               ) {
-                       // Default behavior
-                       // If any parameter is selected, but:
-                       // - If there are unselected items in the group, they are inactive
-                       // - If the entire group is selected, all are inactive
-
-                       // Check what's selected in the group
-                       selectedItemsCount = this.groups[ group ].filters.filter( function ( filterItem ) {
-                               return filterItem.isSelected();
-                       } ).length;
-
-                       this.groups[ group ].filters.forEach( function ( filterItem ) {
-                               filterItem.toggleActive(
-                                       selectedItemsCount > 0 ?
-                                               // If some items are selected
-                                               (
-                                                       selectedItemsCount === model.groups[ group ].filters.length ?
-                                                       // If **all** items are selected, they're all inactive
-                                                       false :
-                                                       // If not all are selected, then the selected are active
-                                                       // and the unselected are inactive
-                                                       filterItem.isSelected()
-                                               ) :
-                                               // No item is selected, everything is active
-                                               true
+       mw.rcfilters.dm.FiltersViewModel.prototype.reassessFilterInteractions = function ( item ) {
+               var allSelected,
+                       model = this,
+                       iterationItems = item !== undefined ? [ item ] : this.getItems();
+
+               iterationItems.forEach( function ( checkedItem ) {
+                       var allCheckedItems = checkedItem.getSubset().concat( [ checkedItem.getName() ] ),
+                               groupModel = checkedItem.getGroupModel();
+
+                       // Check for subsets (included filters) plus the item itself:
+                       allCheckedItems.forEach( function ( filterItemName ) {
+                               var itemInSubset = model.getItemByName( filterItemName );
+
+                               itemInSubset.toggleIncluded(
+                                       // If any of itemInSubset's supersets are selected, this item
+                                       // is included
+                                       itemInSubset.getSuperset().some( function ( supersetName ) {
+                                               return ( model.getItemByName( supersetName ).isSelected() );
+                                       } )
                                );
                        } );
-               } else if ( this.groups[ group ].exclusionType === 'explicit' ) {
-                       // Explicit behavior
-                       // - Go over the list of excluded filters to change their
-                       //   active states accordingly
-
-                       // For each item in the list, see if there are other selected
-                       // filters that also exclude it. If it does, it will still be
-                       // inactive.
-
-                       item.getExcludedFilters().forEach( function ( filterName ) {
-                               var filterItem = model.getItemByName( filterName );
-
-                               // Note to reduce confusion:
-                               // - item is the filter whose state changed and should exclude the other filters
-                               //   in its list of exclusions
-                               // - filterItem is the filter that is potentially being excluded by the current item
-                               // - anotherExcludingFilter is any other filter that excludes filterItem; we must check
-                               //   if that filter is selected, because if it is, we should not touch the excluded item
-                               if (
-                                       // Check if there are any filters (other than the current one)
-                                       // that also exclude the filterName
-                                       !model.excludedByMap[ filterName ].some( function ( anotherExcludingFilterName ) {
-                                               var anotherExcludingFilter = model.getItemByName( anotherExcludingFilterName );
-
-                                               return (
-                                                       anotherExcludingFilterName !== item.getName() &&
-                                                       anotherExcludingFilter.isSelected()
-                                               );
-                                       } )
-                               ) {
-                                       // Only change the state for filters that aren't
-                                       // also affected by other excluding selected filters
-                                       filterItem.toggleActive( !item.isSelected() );
+
+                       // Update coverage for the changed group
+                       if ( groupModel.isFullCoverage() ) {
+                               allSelected = groupModel.areAllSelected();
+                               groupModel.getItems().forEach( function ( filterItem ) {
+                                       filterItem.toggleFullyCovered( allSelected );
+                               } );
+                       }
+               } );
+
+               // Check for conflicts
+               // In this case, we must go over all items, since
+               // conflicts are bidirectional and depend not only on
+               // individual items, but also on the selected states of
+               // the groups they're in.
+               this.getItems().forEach( function ( filterItem ) {
+                       var inConflict = false,
+                               filterItemGroup = filterItem.getGroupModel();
+
+                       // For each item, see if that item is still conflicting
+                       $.each( model.groups, function ( groupName, groupModel ) {
+                               if ( filterItem.getGroupName() === groupName ) {
+                                       // Check inside the group
+                                       inConflict = groupModel.areAnySelectedInConflictWith( filterItem );
+                               } else {
+                                       // According to the spec, if two items conflict from two different
+                                       // groups, the conflict only lasts if the groups **only have selected
+                                       // items that are conflicting**. If a group has selected items that
+                                       // are conflicting and non-conflicting, the scope of the result has
+                                       // expanded enough to completely remove the conflict.
+
+                                       // For example, see two groups with conflicts:
+                                       // userExpLevel: [
+                                       //   {
+                                       //     name: 'experienced',
+                                       //     conflicts: [ 'unregistered' ]
+                                       //   }
+                                       // ],
+                                       // registration: [
+                                       //   {
+                                       //     name: 'registered',
+                                       //   },
+                                       //   {
+                                       //     name: 'unregistered',
+                                       //   }
+                                       // ]
+                                       // If we select 'experienced', then 'unregistered' is in conflict (and vice versa),
+                                       // because, inherently, 'experienced' filter only includes registered users, and so
+                                       // both filters are in conflict with one another.
+                                       // However, the minute we select 'registered', the scope of our results
+                                       // has expanded to no longer have a conflict with 'experienced' filter, and
+                                       // so the conflict is removed.
+
+                                       // In our case, we need to check if the entire group conflicts with
+                                       // the entire item's group, so we follow the above spec
+                                       inConflict = (
+                                               // The foreign group is in conflict with this item
+                                               groupModel.areAllSelectedInConflictWith( filterItem ) &&
+                                               // Every selected member of the item's own group is also
+                                               // in conflict with the other group
+                                               filterItemGroup.getSelectedItems().every( function ( otherGroupItem ) {
+                                                       return groupModel.areAllSelectedInConflictWith( otherGroupItem );
+                                               } )
+                                       );
                                }
+
+                               // If we're in conflict, this will return 'false' which
+                               // will break the loop. Otherwise, we're not in conflict
+                               // and the loop continues
+                               return !inConflict;
                        } );
-               }
+
+                       // Toggle the item state
+                       filterItem.toggleConflicted( inConflict );
+               } );
        };
 
        /**
         * @param {Object} filters Filter group definition
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
-               var i, filterItem, selectedFilterNames, excludedFilters,
+               var i, filterItem, selectedFilterNames,
                        model = this,
                        items = [],
-                       addToMap = function ( excludedFilters ) {
-                               excludedFilters.forEach( function ( filterName ) {
-                                       model.excludedByMap[ filterName ] = model.excludedByMap[ filterName ] || [];
-                                       model.excludedByMap[ filterName ].push( filterItem.getName() );
+                       addArrayElementsUnique = function ( arr, elements ) {
+                               elements = Array.isArray( elements ) ? elements : [ elements ];
+
+                               elements.forEach( function ( element ) {
+                                       if ( arr.indexOf( element ) === -1 ) {
+                                               arr.push( element );
+                                       }
                                } );
-                       };
+
+                               return arr;
+                       },
+                       conflictMap = {},
+                       supersetMap = {};
 
                // Reset
                this.clearItems();
                this.groups = {};
-               this.excludedByMap = {};
 
                $.each( filters, function ( group, data ) {
-                       model.groups[ group ] = model.groups[ group ] || {};
-                       model.groups[ group ].filters = model.groups[ group ].filters || [];
-
-                       model.groups[ group ].title = data.title;
-                       model.groups[ group ].type = data.type;
-                       model.groups[ group ].separator = data.separator || '|';
-                       model.groups[ group ].exclusionType = data.exclusionType || 'default';
+                       if ( !model.groups[ group ] ) {
+                               model.groups[ group ] = new mw.rcfilters.dm.FilterGroup( group, {
+                                       type: data.type,
+                                       title: data.title,
+                                       separator: data.separator,
+                                       fullCoverage: !!data.fullCoverage
+                               } );
+                       }
 
                        selectedFilterNames = [];
                        for ( i = 0; i < data.filters.length; i++ ) {
-                               excludedFilters = data.filters[ i ].excludes || [];
-
-                               filterItem = new mw.rcfilters.dm.FilterItem( data.filters[ i ].name, {
+                               filterItem = new mw.rcfilters.dm.FilterItem( data.filters[ i ].name, model.groups[ group ], {
                                        group: group,
                                        label: data.filters[ i ].label,
                                        description: data.filters[ i ].description,
-                                       selected: data.filters[ i ].selected,
-                                       excludes: excludedFilters,
-                                       'default': data.filters[ i ].default
+                                       subset: data.filters[ i ].subset,
+                                       cssClass: data.filters[ i ].class
                                } );
 
-                               // Map filters and what excludes them
-                               addToMap( excludedFilters );
+                               // 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 ) {
+                                       data.filters[ i ].subset.forEach( function ( subsetFilterName ) { // eslint-disable-line no-loop-func
+                                               supersetMap[ subsetFilterName ] = supersetMap[ subsetFilterName ] || [];
+                                               addArrayElementsUnique(
+                                                       supersetMap[ subsetFilterName ],
+                                                       filterItem.getName()
+                                               );
+                                       } );
+                               }
+
+                               // Conflicts are bi-directional, which means FilterA can define having
+                               // a conflict with FilterB, and this conflict should appear in **both**
+                               // filter definitions.
+                               // We need to remap all the 'conflicts' so they reflect the entire state
+                               // in either direction regardless of which filter defined the other as conflicting.
+                               if ( data.filters[ i ].conflicts ) {
+                                       conflictMap[ filterItem.getName() ] = conflictMap[ filterItem.getName() ] || [];
+                                       addArrayElementsUnique(
+                                               conflictMap[ filterItem.getName() ],
+                                               data.filters[ i ].conflicts
+                                       );
+
+                                       data.filters[ i ].conflicts.forEach( function ( conflictingFilterName ) { // eslint-disable-line no-loop-func
+                                               // Add this filter to the conflicts of each of the filters in its list
+                                               conflictMap[ conflictingFilterName ] = conflictMap[ conflictingFilterName ] || [];
+                                               addArrayElementsUnique(
+                                                       conflictMap[ conflictingFilterName ],
+                                                       filterItem.getName()
+                                               );
+                                       } );
+                               }
 
                                if ( data.type === 'send_unselected_if_any' ) {
                                        // Store the default parameter state
                                        selectedFilterNames.push( data.filters[ i ].name );
                                }
 
-                               model.groups[ group ].filters.push( filterItem );
+                               model.groups[ group ].addItems( filterItem );
                                items.push( filterItem );
                        }
 
                                // 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 ].separator );
+                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].getSeparator() );
                        }
                } );
 
+               items.forEach( function ( filterItem ) {
+                       // Apply conflict map to the items
+                       // Now that we mapped all items and conflicts bi-directionally
+                       // we need to apply the definition to each filter again
+                       filterItem.setConflicts( conflictMap[ filterItem.getName() ] );
+
+                       // Apply the superset map
+                       filterItem.setSuperset( supersetMap[ filterItem.getName() ] );
+               } );
+
+               // Add items to the model
                this.addItems( items );
 
                this.emit( 'initialize' );
        };
 
        /**
-        * Get the object that defines groups and their filter items.
-        * The structure of this response:
-        * {
-        *   groupName: {
-        *     title: {string} Group title
-        *     type: {string} Group type
-        *     filters: {string[]} Filters in the group
-        *   }
-        * }
+        * Get the object that defines groups by their name.
         *
         * @return {Object} Filter groups
         */
                return this.groups;
        };
 
-       /**
-        * Get the current state of the filters.
-        *
-        * Checks whether the filter group is active. This means at least one
-        * filter is selected, but not all filters are selected.
-        *
-        * @param {string} groupName Group name
-        * @return {boolean} Filter group is active
-        */
-       mw.rcfilters.dm.FiltersViewModel.prototype.isFilterGroupActive = function ( groupName ) {
-               var count = 0,
-                       filters = this.groups[ groupName ].filters;
-
-               filters.forEach( function ( filterItem ) {
-                       count += Number( filterItem.isSelected() );
-               } );
-
-               return (
-                       count > 0 &&
-                       count < filters.length
-               );
-       };
-
-       /**
-        * Update the representation of the parameters. These are the back-end
-        * parameters representing the filters, but they represent the given
-        * current state regardless of validity.
-        *
-        * This should only run after filters are already set.
-        *
-        * @param {Object} params Parameter state
-        */
-       mw.rcfilters.dm.FiltersViewModel.prototype.updateParameters = function ( params ) {
-               var model = this;
-
-               $.each( params, function ( name, value ) {
-                       // Only store the parameters that exist in the system
-                       if ( model.getItemByName( name ) ) {
-                               model.parameters[ name ] = value;
-                       }
-               } );
-       };
-
        /**
         * Get the value of a specific parameter
         *
                for ( i = 0; i < items.length; i++ ) {
                        result[ items[ i ].getName() ] = {
                                selected: items[ i ].isSelected(),
-                               active: items[ i ].isActive()
+                               conflicted: items[ i ].isConflicted(),
+                               included: items[ i ].isIncluded()
                        };
                }
 
                        result = {},
                        groupItems = filterGroups || this.getFilterGroups();
 
-               $.each( groupItems, function ( group, data ) {
-                       filterItems = data.filters;
+               $.each( groupItems, function ( group, model ) {
+                       filterItems = model.getItems();
 
-                       if ( data.type === 'send_unselected_if_any' ) {
+                       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
                                        result[ filterItems[ i ].getName() ] = anySelected ?
                                                Number( !filterItems[ i ].isSelected() ) : 0;
                                }
-                       } else if ( data.type === 'string_options' ) {
+                       } else if ( model.getType() === 'string_options' ) {
                                values = [];
                                for ( i = 0; i < filterItems.length; i++ ) {
                                        if ( filterItems[ i ].isSelected() ) {
                                if ( values.length === 0 || values.length === filterItems.length ) {
                                        result[ group ] = 'all';
                                } else {
-                                       result[ group ] = values.join( data.separator );
+                                       result[ group ] = values.join( model.getSeparator() );
                                }
                        }
                } );
                return result;
        };
 
+       /**
+        * Get the highlight parameters based on current filter configuration
+        *
+        * @return {object} Object where keys are "<filter name>_color" and values
+        *                  are the selected highlight colors.
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightParameters = function () {
+               var result = { highlight: this.isHighlightEnabled() };
+
+               this.getItems().forEach( function ( filterItem ) {
+                       result[ filterItem.getName() + '_color' ] = filterItem.getHighlightColor();
+               } );
+               return result;
+       };
+
        /**
         * Sanitize value group of a string_option groups type
         * Remove duplicates and make sure to only use valid
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function( groupName, valueArray ) {
                var result = [],
-                       validNames = this.groups[ groupName ].filters.map( function ( filterItem ) {
+                       validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) {
                                return filterItem.getName();
                        } );
 
         * @return {boolean} Current filters are all empty
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.areCurrentFiltersEmpty = function () {
-               var currFilters = this.getSelectedState();
+               var model = this;
 
-               return Object.keys( currFilters ).every( function ( filterName ) {
-                       return !currFilters[ filterName ];
+               // Check if there are either any selected items or any items
+               // that have highlight enabled
+               return !this.getItems().some( function ( filterItem ) {
+                       return (
+                               filterItem.isSelected() ||
+                               ( model.isHighlightEnabled() && filterItem.getHighlightColor() )
+                       );
                } );
        };
 
                        filterItem = model.getItemByName( paramName );
                        // Ignore if no filter item exists
                        if ( filterItem ) {
-                               groupMap[ filterItem.getGroup() ] = groupMap[ filterItem.getGroup() ] || {};
+                               groupMap[ filterItem.getGroupName() ] = groupMap[ filterItem.getGroupName() ] || {};
 
                                // Mark the group if it has any items that are selected
-                               groupMap[ filterItem.getGroup() ].hasSelected = (
-                                       groupMap[ filterItem.getGroup() ].hasSelected ||
+                               groupMap[ filterItem.getGroupName() ].hasSelected = (
+                                       groupMap[ filterItem.getGroupName() ].hasSelected ||
                                        !!Number( paramValue )
                                );
 
                                // Add the relevant filter into the group map
-                               groupMap[ filterItem.getGroup() ].filters = groupMap[ filterItem.getGroup() ].filters || [];
-                               groupMap[ filterItem.getGroup() ].filters.push( filterItem );
+                               groupMap[ filterItem.getGroupName() ].filters = groupMap[ filterItem.getGroupName() ].filters || [];
+                               groupMap[ filterItem.getGroupName() ].filters.push( filterItem );
                        } else if ( model.groups.hasOwnProperty( paramName ) ) {
                                // 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 ].filters };
+                               groupMap[ paramName ] = { filters: model.groups[ paramName ].getItems() };
                        }
                } );
 
                        var paramValues, filterItem,
                                allItemsInGroup = data.filters;
 
-                       if ( model.groups[ group ].type === 'send_unselected_if_any' ) {
+                       if ( model.groups[ group ].getType() === 'send_unselected_if_any' ) {
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
 
                                                // group, which means the state is false
                                                false;
                                }
-                       } else if ( model.groups[ group ].type === 'string_options' ) {
-                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].separator ) );
+                       } else if ( model.groups[ group ].getType() === 'string_options' ) {
+                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].getSeparator() ) );
 
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
                                                        // If it is the word 'all'
                                                        paramValues.length === 1 && paramValues[ 0 ] === 'all' ||
                                                        // All values are written
-                                                       paramValues.length === model.groups[ group ].filters.length
+                                                       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
                }
        };
 
+       /**
+        * Get a group model from its name
+        *
+        * @param {string} groupName Group name
+        * @return {mw.rcfilters.dm.FilterGroup} Group model
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getGroup = function ( groupName ) {
+               return this.groups[ groupName ];
+       };
+
+       /**
+        * Get all filters within a specified group by its name
+        *
+        * @param {string} groupName Group name
+        * @return {mw.rcfilters.dm.FilterItem[]} Filters belonging to this group
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getGroupFilters = function ( groupName ) {
+               return ( this.getGroup( groupName ) && this.getGroup( groupName ).getItems() ) || [];
+       };
+
        /**
         * Find items whose labels match the given string
         *
-        * @param {string} str Search string
+        * @param {string} query Search string
         * @return {Object} An object of items to show
         *  arranged by their group names
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( str ) {
+       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query ) {
                var i,
+                       groupTitle,
                        result = {},
                        items = this.getItems();
 
                // Normalize so we can search strings regardless of case
-               str = str.toLowerCase();
+               query = query.toLowerCase();
+
+               // item label starting with the query string
                for ( i = 0; i < items.length; i++ ) {
-                       if ( items[ i ].getLabel().toLowerCase().indexOf( str ) > -1 ) {
-                               result[ items[ i ].getGroup() ] = result[ items[ i ].getGroup() ] || [];
-                               result[ items[ i ].getGroup() ].push( items[ i ] );
+                       if ( items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 ) {
+                               result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
+                               result[ items[ i ].getGroupName() ].push( items[ i ] );
                        }
                }
+
+               if ( $.isEmptyObject( result ) ) {
+                       // item containing the query string in their label, description, or group title
+                       for ( i = 0; i < items.length; i++ ) {
+                               groupTitle = items[ i ].getGroupModel().getTitle();
+                               if (
+                                       items[ i ].getLabel().toLowerCase().indexOf( query ) > -1 ||
+                                       items[ i ].getDescription().toLowerCase().indexOf( query ) > -1 ||
+                                       groupTitle.toLowerCase().indexOf( query ) > -1
+                               ) {
+                                       result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
+                                       result[ items[ i ].getGroupName() ].push( items[ i ] );
+                               }
+                       }
+               }
+
                return result;
        };
 
+       /**
+        * Get items that are highlighted
+        *
+        * @return {mw.rcfilters.dm.FilterItem[]} Highlighted items
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightedItems = function () {
+               return this.getItems().filter( function ( filterItem ) {
+                       return filterItem.isHighlightSupported() &&
+                               filterItem.getHighlightColor();
+               } );
+       };
+
+       /**
+        * Toggle the highlight feature on and off.
+        * Propagate the change to filter items.
+        *
+        * @param {boolean} enable Highlight should be enabled
+        * @fires highlightChange
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.toggleHighlight = function ( enable ) {
+               enable = enable === undefined ? !this.highlightEnabled : enable;
+
+               if ( this.highlightEnabled !== enable ) {
+                       this.highlightEnabled = enable;
+
+                       this.getItems().forEach( function ( filterItem ) {
+                               filterItem.toggleHighlight( this.highlightEnabled );
+                       }.bind( this ) );
+
+                       this.emit( 'highlightChange', this.highlightEnabled );
+               }
+       };
+
+       /**
+        * Check if the highlight feature is enabled
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.isHighlightEnabled = function () {
+               return this.highlightEnabled;
+       };
+
+       /**
+        * Set highlight color for a specific filter item
+        *
+        * @param {string} filterName Name of the filter item
+        * @param {string} color Selected color
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.setHighlightColor = function ( filterName, color ) {
+               this.getItemByName( filterName ).setHighlightColor( color );
+       };
+
+       /**
+        * Clear highlight for a specific filter item
+        *
+        * @param {string} filterName Name of the filter item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.clearHighlightColor = function ( filterName ) {
+               this.getItemByName( filterName ).clearHighlightColor();
+       };
+
+       /**
+        * Clear highlight for all filter items
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.clearAllHighlightColors = function () {
+               this.getItems().forEach( function ( filterItem ) {
+                       filterItem.clearHighlightColor();
+               } );
+       };
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/images/marker-ltr.svg b/resources/src/mediawiki.rcfilters/images/marker-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/src/mediawiki.rcfilters/images/marker-rtl.svg b/resources/src/mediawiki.rcfilters/images/marker-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/src/mediawiki.rcfilters/images/pending.gif b/resources/src/mediawiki.rcfilters/images/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/src/mediawiki.rcfilters/images/pending.gif differ
index 28d9f28..1c05909 100644 (file)
@@ -1,13 +1,14 @@
-( function ( mw ) {
+( function ( mw, $ ) {
        /**
         * Controller for the filters in Recent Changes
         *
-        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model
         */
-       mw.rcfilters.Controller = function MwRcfiltersController( model ) {
-               this.model = model;
-               // TODO: When we are ready, update the URL when a filter is updated
-               // this.model.connect( this, { itemUpdate: 'updateURL' } );
+       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel ) {
+               this.filtersModel = filtersModel;
+               this.changesListModel = changesListModel;
+               this.requestCounter = 0;
        };
 
        /* Initialization */
 
        /**
         * Initialize the filter and parameter states
+        *
+        * @param {Object} filterStructure Filter definition and structure for the model
         */
-       mw.rcfilters.Controller.prototype.initialize = function () {
+       mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
                var uri = new mw.Uri();
 
-               // Give the model a full parameter state from which to
-               // update the filters
-               this.model.updateFilters(
-                       // Translate the url params to filter select states
-                       this.model.getFiltersFromParameters( uri.query )
+               // Initialize the model
+               this.filtersModel.initializeFilters( filterStructure );
+
+               // Set filter states based on defaults and URL params
+               this.filtersModel.updateFilters(
+                       this.filtersModel.getFiltersFromParameters(
+                               // Merge defaults with URL params for initialization
+                               $.extend(
+                                       true,
+                                       {},
+                                       this.filtersModel.getDefaultParams(),
+                                       // URI query overrides defaults
+                                       uri.query
+                               )
+                       )
                );
+
+               // Initialize highlights
+               this.filtersModel.toggleHighlight( !!uri.query.highlight );
+               this.filtersModel.getItems().forEach( function ( filterItem ) {
+                       var color = uri.query[ filterItem.getName() + '_color' ];
+                       if ( !color ) {
+                               return;
+                       }
+
+                       filterItem.setHighlightColor( color );
+               } );
+
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
        };
 
        /**
         * Reset to default filters
         */
        mw.rcfilters.Controller.prototype.resetToDefaults = function () {
-               this.model.setFiltersToDefaults();
+               this.filtersModel.setFiltersToDefaults();
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+
+               this.updateChangesList();
        };
 
        /**
         * Empty all selected filters
         */
        mw.rcfilters.Controller.prototype.emptyFilters = function () {
-               this.model.emptyAllFilters();
+               this.filtersModel.emptyAllFilters();
+               this.filtersModel.clearAllHighlightColors();
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+
+               this.updateChangesList();
        };
 
        /**
-        * Update the state of a filter
+        * Update the selected state of a filter
         *
         * @param {string} filterName Filter name
-        * @param {boolean} isSelected Filter selected state
+        * @param {boolean} [isSelected] Filter selected state
         */
-       mw.rcfilters.Controller.prototype.updateFilter = function ( filterName, isSelected ) {
-               var obj = {};
+       mw.rcfilters.Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) {
+               var obj = {},
+                       filterItem = this.filtersModel.getItemByName( filterName );
 
-               obj[ filterName ] = isSelected;
-               this.model.updateFilters( obj );
+               isSelected = isSelected === undefined ? !filterItem.isSelected() : isSelected;
+
+               if ( filterItem.isSelected() !== isSelected ) {
+                       obj[ filterName ] = isSelected;
+                       this.filtersModel.updateFilters( obj );
+
+                       this.updateChangesList();
+
+                       // Check filter interactions
+                       this.filtersModel.reassessFilterInteractions( this.filtersModel.getItemByName( filterName ) );
+               }
        };
 
        /**
         * Update the URL of the page to reflect current filters
+        *
+        * This should not be called directly from outside the controller.
+        * If an action requires changing the URL, it should either use the
+        * highlighting actions below, or call #updateChangesList which does
+        * the uri corrections already.
+        *
+        * @private
+        * @param {Object} [params] Extra parameters to add to the API call
         */
-       mw.rcfilters.Controller.prototype.updateURL = function () {
-               var uri = new mw.Uri();
+       mw.rcfilters.Controller.prototype.updateURL = function ( params ) {
+               var uri;
+
+               params = params || {};
+
+               uri = this.getUpdatedUri();
+               uri.extend( params );
+
+               window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
+       };
+
+       /**
+        * Get an updated mw.Uri object based on the model state
+        *
+        * @return {mw.Uri} Updated Uri
+        */
+       mw.rcfilters.Controller.prototype.getUpdatedUri = function () {
+               var uri = new mw.Uri(),
+                       highlightParams = this.filtersModel.getHighlightParameters();
 
                // Add to existing queries in URL
                // TODO: Clean up the list of filters; perhaps 'falsy' filters
                // shouldn't appear at all? Or compare to existing query string
                // and see if current state of a specific filter is needed?
-               uri.extend( this.model.getParametersFromFilters() );
+               uri.extend( this.filtersModel.getParametersFromFilters() );
 
-               // Update the URL itself
-               window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
+               // highlight params
+               Object.keys( highlightParams ).forEach( function ( paramName ) {
+                       if ( highlightParams[ paramName ] ) {
+                               uri.query[ paramName ] = highlightParams[ paramName ];
+                       } else {
+                               delete uri.query[ paramName ];
+                       }
+               } );
+
+               return uri;
+       };
+
+       /**
+        * Fetch the list of changes from the server for the current filters
+        *
+        * @return {jQuery.Promise} Promise object that will resolve with the changes list
+        *  or with a string denoting no results.
+        */
+       mw.rcfilters.Controller.prototype.fetchChangesList = function () {
+               var uri = this.getUpdatedUri(),
+                       requestId = ++this.requestCounter,
+                       latestRequest = function () {
+                               return requestId === this.requestCounter;
+                       }.bind( this );
+
+               return $.ajax( uri.toString(), { contentType: 'html' } )
+                       .then(
+                               // Success
+                               function ( html ) {
+                                       var $parsed;
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( html ) );
+
+                                       return {
+                                               // Changes list
+                                               changes: $parsed.find( '.mw-changeslist' ).first().contents(),
+                                               // Fieldset
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       };
+                               },
+                               // Failure
+                               function ( responseObj ) {
+                                       var $parsed;
+
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( responseObj.responseText ) );
+
+                                       // Force a resolve state to this promise
+                                       return $.Deferred().resolve( {
+                                               changes: 'NO_RESULTS',
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       } ).promise();
+                               }
+                       );
+       };
+
+       /**
+        * Update the list of changes and notify the model
+        *
+        * @param {Object} [params] Extra parameters to add to the API call
+        */
+       mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) {
+               this.updateURL( params );
+               this.changesListModel.invalidate();
+               this.fetchChangesList()
+                       .then(
+                               // Success
+                               function ( pieces ) {
+                                       var $changesListContent = pieces.changes,
+                                               $fieldset = pieces.fieldset;
+                                       this.changesListModel.update( $changesListContent, $fieldset );
+                               }.bind( this )
+                               // Do nothing for failure
+                       );
+       };
+
+       /**
+        * Toggle the highlight feature on and off
+        */
+       mw.rcfilters.Controller.prototype.toggleHighlight = function () {
+               this.filtersModel.toggleHighlight();
+               this.updateURL();
+       };
+
+       /**
+        * Set the highlight color for a filter item
+        *
+        * @param {string} filterName Name of the filter item
+        * @param {string} color Selected color
+        */
+       mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) {
+               this.filtersModel.setHighlightColor( filterName, color );
+               this.updateURL();
+       };
+
+       /**
+        * Clear highlight for a filter item
+        *
+        * @param {string} filterName Name of the filter item
+        */
+       mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) {
+               this.filtersModel.clearHighlightColor( filterName );
+               this.updateURL();
        };
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js
new file mode 100644 (file)
index 0000000..ebeaad6
--- /dev/null
@@ -0,0 +1,9 @@
+( function ( mw ) {
+       /**
+        * Supported highlight colors.
+        * Warning: These are also hardcoded in "styles/mw.rcfilters.variables.less"
+        *
+        * @type {string[]}
+        */
+       mw.rcfilters.HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ];
+}( mediaWiki ) );
index 7b29d4b..089b106 100644 (file)
@@ -9,24 +9,37 @@
        var rcfilters = {
                /** */
                init: function () {
-                       var model = new mw.rcfilters.dm.FiltersViewModel(),
-                               controller = new mw.rcfilters.Controller( model ),
-                               widget = new mw.rcfilters.ui.FilterWrapperWidget( controller, model );
+                       var filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                               changesListModel = new mw.rcfilters.dm.ChangesListViewModel(),
+                               controller = new mw.rcfilters.Controller( filtersModel, changesListModel ),
+                               $overlay = $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-overlay' ),
+                               filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget(
+                                       controller, filtersModel, { $overlay: $overlay } );
 
-                       model.initializeFilters( {
+                       // TODO: The changesListWrapperWidget should be able to initialize
+                       // after the model is ready.
+                       // eslint-disable-next-line no-new
+                       new mw.rcfilters.ui.ChangesListWrapperWidget(
+                               filtersModel, changesListModel, $( '.mw-changeslist, .mw-changeslist-empty' ) );
+
+                       controller.initialize( {
                                registration: {
                                        title: mw.msg( 'rcfilters-filtergroup-registration' ),
                                        type: 'send_unselected_if_any',
+                                       fullCoverage: true,
                                        filters: [
                                                {
                                                        name: 'hideliu',
                                                        label: mw.msg( 'rcfilters-filter-registered-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-registered-description' )
+                                                       description: mw.msg( 'rcfilters-filter-registered-description' ),
+                                                       'class': 'mw-changeslist-liu'
                                                },
                                                {
                                                        name: 'hideanons',
                                                        label: mw.msg( 'rcfilters-filter-unregistered-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-unregistered-description' )
+                                                       description: mw.msg( 'rcfilters-filter-unregistered-description' ),
+                                                       'class': 'mw-changeslist-anon'
                                                }
                                        ]
                                },
                                        // ** In this case, the parameter name is the group name. **
                                        type: 'string_options',
                                        separator: ',',
+                                       fullCoverage: false,
                                        filters: [
                                                {
                                                        name: 'newcomer',
                                                        label: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-description' )
+                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-description' ),
+                                                       conflicts: [ 'hideanons' ],
+                                                       'class': 'mw-changeslist-user-newcomer'
                                                },
                                                {
                                                        name: 'learner',
                                                        label: mw.msg( 'rcfilters-filter-userExpLevel-learner-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-learner-description' )
+                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-learner-description' ),
+                                                       conflicts: [ 'hideanons' ],
+                                                       'class': 'mw-changeslist-user-learner'
                                                },
                                                {
                                                        name: 'experienced',
                                                        label: mw.msg( 'rcfilters-filter-userExpLevel-experienced-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-experienced-description' )
+                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-experienced-description' ),
+                                                       conflicts: [ 'hideanons' ],
+                                                       'class': 'mw-changeslist-user-experienced'
                                                }
                                        ]
                                },
                                        // the functionality to the UI, whether we are dealing with 2
                                        // parameters in the group or more.
                                        type: 'send_unselected_if_any',
+                                       fullCoverage: true,
                                        filters: [
                                                {
                                                        name: 'hidemyself',
                                                        label: mw.msg( 'rcfilters-filter-editsbyself-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-editsbyself-description' )
+                                                       description: mw.msg( 'rcfilters-filter-editsbyself-description' ),
+                                                       'class': 'mw-changeslist-self'
                                                },
                                                {
                                                        name: 'hidebyothers',
                                                        label: mw.msg( 'rcfilters-filter-editsbyother-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-editsbyother-description' )
+                                                       description: mw.msg( 'rcfilters-filter-editsbyother-description' ),
+                                                       'class': 'mw-changeslist-others'
                                                }
                                        ]
                                },
                                automated: {
                                        title: mw.msg( 'rcfilters-filtergroup-automated' ),
                                        type: 'send_unselected_if_any',
+                                       fullCoverage: true,
                                        filters: [
                                                {
                                                        name: 'hidebots',
                                                        label: mw.msg( 'rcfilters-filter-bots-label' ),
                                                        description: mw.msg( 'rcfilters-filter-bots-description' ),
-                                                       'default': true
+                                                       'default': true,
+                                                       'class': 'mw-changeslist-bot'
                                                },
                                                {
                                                        name: 'hidehumans',
                                                        label: mw.msg( 'rcfilters-filter-humans-label' ),
                                                        description: mw.msg( 'rcfilters-filter-humans-description' ),
-                                                       'default': false
+                                                       'default': false,
+                                                       'class': 'mw-changeslist-human'
                                                }
                                        ]
                                },
                                significance: {
                                        title: mw.msg( 'rcfilters-filtergroup-significance' ),
                                        type: 'send_unselected_if_any',
+                                       fullCoverage: true,
                                        filters: [
                                                {
                                                        name: 'hideminor',
                                                        label: mw.msg( 'rcfilters-filter-minor-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-minor-description' )
+                                                       description: mw.msg( 'rcfilters-filter-minor-description' ),
+                                                       'class': 'mw-changeslist-minor'
                                                },
                                                {
                                                        name: 'hidemajor',
                                                        label: mw.msg( 'rcfilters-filter-major-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-major-description' )
+                                                       description: mw.msg( 'rcfilters-filter-major-description' ),
+                                                       'class': 'mw-changeslist-major'
                                                }
                                        ]
                                },
                                changetype: {
                                        title: mw.msg( 'rcfilters-filtergroup-changetype' ),
                                        type: 'send_unselected_if_any',
+                                       fullCoverage: true,
                                        filters: [
                                                {
                                                        name: 'hidepageedits',
                                                        label: mw.msg( 'rcfilters-filter-pageedits-label' ),
                                                        description: mw.msg( 'rcfilters-filter-pageedits-description' ),
-                                                       'default': false
+                                                       'default': false,
+                                                       'class': 'mw-changeslist-src-mw-edit'
+
                                                },
                                                {
                                                        name: 'hidenewpages',
                                                        label: mw.msg( 'rcfilters-filter-newpages-label' ),
                                                        description: mw.msg( 'rcfilters-filter-newpages-description' ),
-                                                       'default': false
+                                                       'default': false,
+                                                       'class': 'mw-changeslist-src-mw-new'
                                                },
                                                {
                                                        name: 'hidecategorization',
                                                        label: mw.msg( 'rcfilters-filter-categorization-label' ),
                                                        description: mw.msg( 'rcfilters-filter-categorization-description' ),
-                                                       'default': true
+                                                       'default': true,
+                                                       'class': 'mw-changeslist-src-mw-categorize'
                                                },
                                                {
                                                        name: 'hidelog',
                                                        label: mw.msg( 'rcfilters-filter-logactions-label' ),
                                                        description: mw.msg( 'rcfilters-filter-logactions-description' ),
-                                                       'default': false
+                                                       'default': false,
+                                                       'class': 'mw-changeslist-src-mw-log'
                                                }
                                        ]
                                }
                        } );
 
-                       $( '.rcoptions' ).before( widget.$element );
+                       // eslint-disable-next-line no-new
+                       new mw.rcfilters.ui.FormWrapperWidget(
+                               filtersModel, changesListModel, controller, $( 'fieldset.rcoptions' ) );
 
-                       // Initialize values
-                       controller.initialize();
+                       $( '.rcfilters-container' ).append( filtersWidget.$element );
+                       $( 'body' ).append( $overlay );
 
-                       // HACK: Remove old-style filter links for filters handled by the widget
-                       // Ideally the widget would handle all filters and we'd just remove .rcshowhide entirely
-                       $( '.rcshowhide' ).children().each( function () {
-                               // HACK: Interpret the class name to get the filter name
-                               // This should really be set as a data attribute
-                               var i,
-                                       name = null,
-                                       // Some of the older browsers we support don't have .classList,
-                                       // so we have to interpret the class attribute manually.
-                                       classes = this.getAttribute( 'class' ).split( ' ' );
-                               for ( i = 0; i < classes.length; i++ ) {
-                                       if ( classes[ i ].substr( 0, 'rcshow'.length ) === 'rcshow' ) {
-                                               name = classes[ i ].substr( 'rcshow'.length );
-                                               break;
-                                       }
-                               }
-                               if ( name === null ) {
-                                       return;
-                               }
-                               if ( name === 'hidemine' ) {
-                                       // HACK: the span for hidemyself is called hidemine
-                                       name = 'hidemyself';
-                               }
-                               // This span corresponds to a filter that's in our model, so remove it
-                               if ( model.getItemByName( name ) ) {
-                                       // HACK: Remove the text node after the span.
-                                       // If there isn't one, we're at the end, so remove the text node before the span.
-                                       // This would be unnecessary if we added separators with CSS.
-                                       if ( this.nextSibling && this.nextSibling.nodeType === Node.TEXT_NODE ) {
-                                               this.parentNode.removeChild( this.nextSibling );
-                                       } else if ( this.previousSibling && this.previousSibling.nodeType === Node.TEXT_NODE ) {
-                                               this.parentNode.removeChild( this.previousSibling );
-                                       }
-                                       // Remove the span itself
-                                       this.parentNode.removeChild( this );
-                               }
+                       window.addEventListener( 'popstate', function () {
+                               controller.updateChangesList();
                        } );
 
-                       $( '.rcoptions form' ).submit( function () {
-                               var $form = $( this );
-
-                               // Get current filter values
-                               $.each( model.getParametersFromFilters(), function ( paramName, paramValue ) {
-                                       var $existingInput = $form.find( 'input[name=' + paramName + ']' );
-                                       // Check if the hidden input already exists
-                                       // This happens if the parameter was already given
-                                       // on load
-                                       if ( $existingInput.length ) {
-                                               // Update the value
-                                               $existingInput.val( paramValue );
-                                       } else {
-                                               // Append hidden fields with filter values
-                                               $form.append(
-                                                       $( '<input>' )
-                                                               .attr( 'type', 'hidden' )
-                                                               .attr( 'name', paramName )
-                                                               .val( paramValue )
-                                               );
-                                       }
-                               } );
-
-                               // Continue the submission process
-                               return true;
-                       } );
+                       $( 'a.mw-helplink' ).attr(
+                               'href',
+                               'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
+                       );
                }
        };
 
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
new file mode 100644 (file)
index 0000000..897a9e8
--- /dev/null
@@ -0,0 +1,35 @@
+// Corrections for the standard special page
+.client-js{
+       .rcoptions {
+               border: 0;
+               border-bottom: 1px solid #a2a9b1;
+
+               legend {
+                       display: none;
+               }
+
+               &:not( .mw-rcfilters-ui-ready ) {
+                       /* @embed */
+                       background-image: url( ../images/pending.gif );
+                       margin: 0;
+
+                       * {
+                               visibility: hidden;
+                       }
+               }
+       }
+
+       .rcfilters-container {
+               min-height: 100px;
+               margin: 0;
+
+               &:not( .mw-rcfilters-ui-ready ) {
+                       /* @embed */
+                       background-image: url( ../images/pending.gif );
+               }
+       }
+}
+
+.mw-rcfilters-staticfilters-selected {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less
new file mode 100644 (file)
index 0000000..2ce2c7f
--- /dev/null
@@ -0,0 +1,63 @@
+@import 'mediawiki.mixins';
+@import 'mw.rcfilters.variables';
+
+// This is a general mixin for a color circle
+.mw-rcfilters-mixin-circle( @color: white, @diameter: 2em, @padding: 0.5em, @border: false ) {
+       border-radius: 50%;
+       min-width: @diameter;
+       width: @diameter;
+       min-height: @diameter;
+       height: @diameter;
+       margin: @padding;
+       .box-sizing( border-box );
+
+       background-color: @color;
+
+       & when (@border = true) {
+               border: 1px solid #565656;
+       }
+}
+
+// This is the circle that appears next to the results
+// Its visibility is directly dependent on whether there is
+// a color class on its parent element
+.result-circle( @colorName: 'none' ) {
+       &-@{colorName} {
+               .mw-rcfilters-mixin-circle( ~'@{highlight-@{colorName}}', @result-circle-diameter, 0 );
+               display: none;
+
+               .mw-rcfilters-highlight-color-@{colorName} & {
+                       display: inline-block;
+               }
+       }
+}
+
+// This mixin produces color mixes for two, three and four colors
+.highlight-color-mix( @color1, @color2, @color3: false, @color4: false ) {
+       @highlight-color-class-var: ~'.mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}';
+
+       // The nature of these variables and them being inside
+       // a 'tint' and 'average' LESS functions is such where
+       // the parsing is failing if it is done inside those functions.
+       // Instead, we first construct their LESS variable names,
+       // and then we call them inside those functions by calling @@var
+       @c1var: ~'highlight-@{color1}';
+       @c2var: ~'highlight-@{color2}';
+
+       // Two colors
+       @{highlight-color-class-var} when ( @color3 = false ) and ( @color4 = false ) and not ( @color1 = false ), ( @color2 = false ) {
+               background-color: tint( average( @@c1var, @@c2var ), 50% );
+       }
+       // Three colors
+       @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3} when ( @color4 = false ) and not ( @color3 = false ) {
+               @c3var: ~'highlight-@{color3}';
+               background-color: tint( mix( @@c1var, average( @@c2var, @@c3var ), 33% ), 30% );
+       }
+
+       // Four colors
+       @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3}.mw-rcfilters-highlight-color-@{color4} when not ( @color4 = false ) {
+               @c3var: ~'highlight-@{color3}';
+               @c4var: ~'highlight-@{color4}';
+               background-color: tint( mix( @@c1var, mix( @@c2var, average( @@c3var, @@c4var ), 25% ), 25% ), 25% );
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less
new file mode 100644 (file)
index 0000000..8173150
--- /dev/null
@@ -0,0 +1,75 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-capsuleItemWidget {
+       background-color: #fff;
+       border-color: #979797;
+       color: #222;
+
+       // Background and color of the capsule widget need a bit
+       // more specificity to override ooui internals
+       &-muted.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+               // Muted state
+               background-color: #eaecf0;
+               border-color: #c8ccd1;
+
+               .oo-ui-labelElement-label {
+                       color: #72777d;
+               }
+               .oo-ui-buttonWidget {
+                       opacity: @muted-opacity;
+               }
+       }
+
+       &-conflicted.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+               background-color: #fee7e6; // Red90 AAA
+               border-color: #b32424; // Red30 AAA
+
+               .oo-ui-labelElement-label {
+                       color: #b32424;
+               }
+               .oo-ui-buttonWidget {
+                       opacity: @muted-opacity;
+               }
+       }
+
+       &-selected.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+               background-color: #eaf3ff;
+               border-color: #36c;
+       }
+
+       &-popup-content {
+               padding: 0.5em;
+               color: #54595d;
+       }
+
+       &.oo-ui-labelElement .oo-ui-labelElement-label {
+               vertical-align: middle;
+               cursor: pointer;
+       }
+
+       &-highlight {
+               display: none;
+               padding-right: 0.5em;
+
+               &-highlighted {
+                       display: inline-block;
+
+               }
+
+               &[data-color='c1'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c1, 0.7em, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c2'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c2, 0.7em, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c3'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c3, 0.7em, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c4'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c4, 0.7em, ~'0 0.5em 0 0' );
+               }
+               &[data-color='c5'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c5, 0.7em, ~'0 0.5em 0 0' );
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
new file mode 100644 (file)
index 0000000..fcd5f67
--- /dev/null
@@ -0,0 +1,125 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-changesListWrapperWidget {
+       &-highlighted {
+               ul {
+                       list-style: none;
+                       // Each li's margin-left should be the width of the highlights
+                       // element + the margin
+                       margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
+               }
+       }
+
+       // Correction for Enhanced RC
+       // This is outside the scope of the 'highlights' wrapper
+       table.mw-enhanced-rc {
+               margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
+
+               td:last-child {
+                       width: 100%;
+               }
+       }
+
+       &-highlights {
+               display: none;
+               padding: 0 @result-circle-general-margin 0 0;
+               text-align: right;
+               // The width is 5 circles times their diameter + individual margin
+               // and then plus the general margin
+               width: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )';
+               // And we want to shift the entire block to the left of the li
+               position: absolute;
+               left: 0;
+
+               .mw-rcfilters-ui-changesListWrapperWidget-highlighted & {
+                       display: inline-block;
+               }
+
+               div {
+                       .box-sizing( border-box );
+                       margin-right: @result-circle-margin;
+                       vertical-align: middle;
+                       // This is to make the dots appear at the center of the
+                       // text itself; it's a horrendous hack and blame JamesF for it.
+                       margin-top: -2px;
+               }
+
+               &-color {
+
+                       &-none {
+                               .mw-rcfilters-mixin-circle( @highlight-none, @result-circle-diameter, 0, true );
+                               display: inline-block;
+
+                               .mw-rcfilters-highlight-color-c1 &,
+                               .mw-rcfilters-highlight-color-c2 &,
+                               .mw-rcfilters-highlight-color-c3 &,
+                               .mw-rcfilters-highlight-color-c4 &,
+                               .mw-rcfilters-highlight-color-c5 & {
+                                       display: none;
+                               }
+                       }
+                       .result-circle( c1 );
+                       .result-circle( c2 );
+                       .result-circle( c3 );
+                       .result-circle( c4 );
+                       .result-circle( c5 );
+               }
+       }
+
+       // One color
+       .mw-rcfilters-highlight-color-c1 {
+               background-color: tint( @highlight-c1, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c2 {
+               background-color: tint( @highlight-c2, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c3 {
+               background-color: tint( @highlight-c3, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c4 {
+               background-color: tint( @highlight-c4, 70% );
+       }
+
+       .mw-rcfilters-highlight-color-c5 {
+               background-color: tint( @highlight-c5, 70% );
+       }
+
+       // Two colors
+       .highlight-color-mix( c1, c2 );
+       .highlight-color-mix( c1, c3 );
+       .highlight-color-mix( c1, c4 );
+       .highlight-color-mix( c1, c5 );
+       .highlight-color-mix( c2, c3 );
+       .highlight-color-mix( c2, c4 );
+       .highlight-color-mix( c2, c5 );
+       .highlight-color-mix( c3, c4 );
+       .highlight-color-mix( c3, c5 );
+       .highlight-color-mix( c4, c5 );
+
+       // Three colors
+       .highlight-color-mix( c1, c2, c3 );
+       .highlight-color-mix( c1, c2, c5 );
+       .highlight-color-mix( c1, c2, c4 );
+       .highlight-color-mix( c1, c3, c4 );
+       .highlight-color-mix( c1, c3, c5 );
+       .highlight-color-mix( c1, c4, c5 );
+       .highlight-color-mix( c2, c3, c4 );
+       .highlight-color-mix( c2, c3, c5 );
+       .highlight-color-mix( c2, c4, c5 );
+       .highlight-color-mix( c3, c4, c5 );
+
+       // Four colors
+       .highlight-color-mix( c1, c2, c3, c4 );
+       .highlight-color-mix( c1, c2, c3, c5 );
+       .highlight-color-mix( c1, c2, c4, c5 );
+       .highlight-color-mix( c1, c3, c4, c5 );
+       .highlight-color-mix( c2, c3, c4, c5 );
+
+       // Five colors:
+       .mw-rcfilters-highlight-color-c1.mw-rcfilters-highlight-color-c2.mw-rcfilters-highlight-color-c3.mw-rcfilters-highlight-color-c4.mw-rcfilters-highlight-color-c5 {
+               background-color: tint( mix( @highlight-c1, mix( @highlight-c2, mix( @highlight-c3, average( @highlight-c4, @highlight-c5 ), 20% ), 20% ), 20% ), 15% );
+       }
+}
index 2ff731c..a0ef293 100644 (file)
@@ -1,36 +1,28 @@
 .mw-rcfilters-ui-filterCapsuleMultiselectWidget {
+       max-width: none;
+
+       &.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
+               background-color: #f8f9fa;
+               border: 1px solid #a2a9b1;
+               min-height: 5.5em;
+               padding: 0.75em;
+
+       }
+
        &-content-title {
                font-weight: bold;
                color: #54595d;
        }
 
-       &-item-inactive {
-               opacity: 0.5;
-       }
-
        &-emptyFilters {
                color: #72777d;
        }
 
-       &-table {
-               display: table;
+       &-cell-filters {
                width: 100%;
        }
-
-       &-row {
-               display: table-row;
-       }
-
-       &-cell {
-               display: table-cell;
-
-               &:last-child {
-                       text-align: right;
-               }
-       }
-
-       .oo-ui-capsuleItemWidget {
-               color: #222;
-               background-color: #fff;
+       &-cell-reset {
+               text-align: right;
+               padding-left: 0.5em;
        }
 }
index 3723916..83491ac 100644 (file)
@@ -1,3 +1,5 @@
+@import 'mediawiki.mixins';
+
 .mw-rcfilters-ui-filterGroupWidget {
        padding-bottom: 0.5em;
 
@@ -6,6 +8,7 @@
                background: #eaecf0;
                padding: 0.5em 0.75em;
                color: #555a5d;
+               .box-sizing( border-box );
        }
 
        &-active {
                        font-weight: bold;
                }
        }
-
-       &-invalid-notice {
-               padding: 0.5em;
-               font-style: italic;
-               display: none;
-
-               .mw-rcfilters-ui-filterGroupWidget-invalid & {
-                       display: block;
-               }
-       }
 }
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less
new file mode 100644 (file)
index 0000000..0f30137
--- /dev/null
@@ -0,0 +1,35 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-filterItemHighlightButton {
+       .oo-ui-iconElement-icon.oo-ui-icon-highlight {
+               /* @embed */
+               background-image: url( ../images/marker-ltr.svg );
+       }
+
+       .oo-ui-buttonWidget.oo-ui-popupButtonWidget .oo-ui-buttonElement-button > &-circle {
+               display: inline-block;
+               vertical-align: middle;
+               background-image: none;
+               margin-right: 0.2em;
+
+               &-color {
+                       &-c1 {
+                               // These values duplicate the sizing of the icon
+                               // width/height 1.875em
+                               .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0.2em 0 );
+                       }
+                       &-c2 {
+                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0.2em 0 );
+                       }
+                       &-c3 {
+                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0.2em 0 );
+                       }
+                       &-c4 {
+                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0.2em 0 );
+                       }
+                       &-c5 {
+                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0.2em 0 );
+                       }
+               }
+       }
+}
index 912e75c..1c3caa0 100644 (file)
@@ -1,10 +1,37 @@
+@import 'mediawiki.mixins';
+
 .mw-rcfilters-ui-filterItemWidget {
-       padding-left: 0.5em;
+       padding: 0 0.5em;
+       .box-sizing( border-box );
+
+       &:not( :last-child ) {
+               border-bottom: solid 1px #eaecf0; // Base 80 AAA
+       }
+
+       &:hover {
+               background-color: #f8f9fa; // Base90 AAA
+       }
+
+       .mw-rcfilters-ui-table {
+               padding-top: 0.5em;
+       }
+
+       &-muted {
+               background-color: #f8f9fa; // Base90 AAA
+               .mw-rcfilters-ui-filterItemWidget-label-title,
+               .mw-rcfilters-ui-filterItemWidget-label-desc {
+                       color: #54595d; // Base20 AAA
+               }
+       }
+
+       &-selected {
+               background-color: #eaf3ff; // Accent90 AAA
+       }
 
        &-label {
                &-title {
                        font-weight: bold;
-                       font-size: 1.2em;
+                       font-size: 1.15em;
                        color: #222;
                }
                &-desc {
                }
        }
 
-       .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-               margin-bottom: 0 !important;
+       &-filterCheckbox {
+               .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+                       // Override margin-top and -bottom rules from FieldLayout
+                       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
+               }
        }
 
-       &-inactive {
-               opacity: 0.5;
+       &-highlightButton {
+               width: 4em;
+               padding-left: 1em;
        }
 }
index f138d7e..970d140 100644 (file)
@@ -1,33 +1,34 @@
 .mw-rcfilters-ui-filterWrapperWidget {
        width: 100%;
-
-       .oo-ui-capsuleMultiselectWidget {
-               max-width: none;
-
-               &.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
-                       // TODO: Unify colors with official design palette
-                       background-color: #f8f9fa;
-                       border: 1px solid #a2a9b1;
-                       min-height: 5.5em;
-                       padding: 0.75em;
-
-               }
-       }
+       // Make sure this uses the interface direction, not the content direction
+       direction: ltr;
 
        &-popup {
                // We have to override OOUI's definition, which is set
                // on the inline style of the popup
-               margin-top: 2.4em !important;
+               margin-top: 2.4em !important; /* stylelint-disable-line declaration-no-important */
                max-width: 650px;
+
+               .oo-ui-popupWidget-body {
+                       max-height: 70vh;
+               }
+
+               .oo-ui-popupWidget-footer {
+                       background-color: #f8f9fa;
+                       text-align: right;
+                       padding: 0.5em;
+               }
        }
 
        &-search {
                max-width: none;
                margin-top: -0.5em;
-       }
 
-       &-capsule-invalid-filter {
-               // TODO: Unify colors with official design palette
-               background: red;
+               input {
+                       // We need to reiterate the directionality
+                       // for the input as well to literally override
+                       // a MediaWiki CSS rule that turns it 'ltr'
+                       direction: ltr;
+               }
        }
 }
index b874e0f..3334d84 100644 (file)
@@ -4,8 +4,22 @@
                padding: 0.75em;
                // TODO: Unify colors with official design palette
                color: #54595d;
+       }
+
+       &-header {
                border-bottom: 1px solid #c8ccd1;
                background: #f8f9fa;
+               overflow: hidden;
+
+               &-highlight {
+                       width: 1em;
+                       vertical-align: middle;
+               }
+
+               &-title {
+                       width: 100%;
+                       vertical-align: middle;
+               }
        }
 
        &-noresults {
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less
new file mode 100644 (file)
index 0000000..88f1195
--- /dev/null
@@ -0,0 +1,75 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-highlightColorPickerWidget {
+       &-label {
+               display: block;
+               font-weight: bold;
+               font-size: 1.2em;
+       }
+
+       &-buttonSelect {
+               &-color {
+                       .oo-ui-iconElement-icon {
+                               width: 2em;
+                               height: 2em;
+                       }
+
+                       &-none {
+                               .mw-rcfilters-mixin-circle( @highlight-none, 2em, 0.5em, true );
+                               // Override border to dashed
+                               border: 1px dashed #565656;
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-none;
+                               }
+                       }
+                       &-c1 {
+                               .mw-rcfilters-mixin-circle( @highlight-c1 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c1;
+                               }
+                       }
+                       &-c2 {
+                               .mw-rcfilters-mixin-circle( @highlight-c2 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c2;
+                               }
+                       }
+                       &-c3 {
+                               .mw-rcfilters-mixin-circle( @highlight-c3 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c3;
+                               }
+                       }
+                       &-c4 {
+                               .mw-rcfilters-mixin-circle( @highlight-c4 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c4;
+                               }
+                       }
+                       &-c5 {
+                               .mw-rcfilters-mixin-circle( @highlight-c5 );
+
+                               &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+                               &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected {
+                                       background-color: @highlight-c5;
+                               }
+                       }
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less
new file mode 100644 (file)
index 0000000..06840da
--- /dev/null
@@ -0,0 +1,8 @@
+.mw-rcfilters-ui-overlay {
+       font-size: 0.875em;
+       position: absolute;
+       top: 0;
+       right: 0;
+       left: 0;
+       z-index: 1;
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less
new file mode 100644 (file)
index 0000000..957e9e9
--- /dev/null
@@ -0,0 +1,16 @@
+.mw-rcfilters-ui {
+       &-table {
+               display: table;
+               width: 100%;
+       }
+
+       &-row {
+               display: table-row;
+       }
+
+       &-cell {
+               display: table-cell;
+               vertical-align: top;
+       }
+}
+
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less
new file mode 100644 (file)
index 0000000..1ef49e2
--- /dev/null
@@ -0,0 +1,19 @@
+// Highlight color definitions
+@highlight-none: #fff;
+@highlight-c1: #36c;
+@highlight-c2: #00af89;
+@highlight-c3: #fc3;
+@highlight-c4: #ff6d22;
+@highlight-c5: #d33;
+
+// Muted state
+@muted-opacity: 0.5;
+
+// Result list circle indicators
+// Defined and used in mw.rcfilters.ui.ChangesListWrapperWidget.less
+@result-circle-margin: 0.1em;
+@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;
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
new file mode 100644 (file)
index 0000000..05f2f66
--- /dev/null
@@ -0,0 +1,207 @@
+( function ( mw, $ ) {
+       /**
+        * Extend OOUI's CapsuleItemWidget to also display a popup on hover.
+        *
+        * @class
+        * @extends OO.ui.CapsuleItemWidget
+        * @mixins OO.ui.mixin.PopupElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller
+        * @param {mw.rcfilters.dm.FilterItem} model Item model
+        * @param {Object} config Configuration object
+        * @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.$overlay = config.$overlay || this.$element;
+               this.positioned = false;
+               this.popupTimeoutShow = null;
+               this.popupTimeoutHide = null;
+
+               // Parent constructor
+               mw.rcfilters.ui.CapsuleItemWidget.parent.call( this, $.extend( {
+                       data: this.model.getName(),
+                       label: this.model.getLabel()
+               }, config ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PopupElement.call( this, $.extend( {
+                       popup: {
+                               padded: false,
+                               align: 'center',
+                               $content: $popupContent
+                                       .append( descLabelWidget.$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( 'mouseenter', this.onMouseEnter.bind( this ) )
+                       .on( 'mouseleave', this.onMouseLeave.bind( this ) );
+
+               this.setCurrentMuteState();
+               this.setHighlightColor();
+       };
+
+       OO.inheritClass( mw.rcfilters.ui.CapsuleItemWidget, OO.ui.CapsuleItemWidget );
+       OO.mixinClass( mw.rcfilters.ui.CapsuleItemWidget, OO.ui.mixin.PopupElement );
+
+       /**
+        * Respond to model update event
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onModelUpdate = function () {
+               this.setCurrentMuteState();
+
+               this.setHighlightColor();
+       };
+
+       /**
+        * Override mousedown event to prevent its propagation to the parent,
+        * since the parent (the multiselect widget) focuses the popup when its
+        * mousedown event is fired.
+        *
+        * @param {jQuery.Event} e Event
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onCloseButtonMouseDown = function ( e ) {
+               e.stopPropagation();
+       };
+
+       /**
+        * Emit a click event when the capsule is clicked so we can aggregate this
+        * in the parent (the capsule)
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onClick = function () {
+               this.emit( 'click' );
+       };
+
+       /**
+        * Override the event listening to the item close button click
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onCloseClick = function () {
+               var element = this.getElementGroup();
+
+               if ( element && $.isFunction( element.removeItems ) ) {
+                       element.removeItems( [ this ] );
+               }
+
+               // Respond to user removing the filter
+               this.controller.toggleFilterSelect( this.model.getName(), false );
+               this.controller.clearHighlightColor( this.model.getName() );
+       };
+
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.setHighlightColor = function () {
+               var selectedColor = this.model.isHighlightEnabled() ? this.model.getHighlightColor() : null;
+
+               this.$highlight
+                       .attr( 'data-color', selectedColor )
+                       .toggleClass(
+                               'mw-rcfilters-ui-capsuleItemWidget-highlight-highlighted',
+                               !!selectedColor
+                       );
+       };
+
+       /**
+        * Set the current mute state for this item
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.setCurrentMuteState = function () {
+               this.$element
+                       .toggleClass(
+                               'mw-rcfilters-ui-capsuleItemWidget-muted',
+                               !this.model.isSelected() ||
+                               this.model.isIncluded() ||
+                               this.model.isFullyCovered()
+                       )
+                       .toggleClass(
+                               'mw-rcfilters-ui-capsuleItemWidget-conflicted',
+                               this.model.isConflicted()
+                       );
+       };
+
+       /**
+        * Respond to mouse enter event
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseEnter = function () {
+               if ( this.model.getDescription() ) {
+                       if ( !this.positioned ) {
+                               // Recalculate position to be center of the capsule item
+                               this.popup.$element.css( 'margin-left', ( this.$element.width() / 2 ) );
+                               this.positioned = true;
+                       }
+
+                       // Set timeout for the popup to show
+                       this.popupTimeoutShow = setTimeout( function () {
+                               this.popup.toggle( true );
+                       }.bind( this ), 500 );
+
+                       // Cancel the hide timeout
+                       clearTimeout( this.popupTimeoutHide );
+                       this.popupTimeoutHide = null;
+               }
+       };
+
+       /**
+        * Respond to mouse leave event
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseLeave = function () {
+               this.popupTimeoutHide = setTimeout( function () {
+                       this.popup.toggle( false );
+               }.bind( this ), 250 );
+
+               // Clear the show timeout
+               clearTimeout( this.popupTimeoutShow );
+               this.popupTimeoutShow = null;
+       };
+
+       /**
+        * Set selected state on this widget
+        *
+        * @param {boolean} [isSelected] Widget is selected
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-capsuleItemWidget-selected', this.selected );
+               }
+       };
+
+       /**
+        * Remove and destroy external elements of this widget
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.destroy = function () {
+               // Destroy the popup
+               this.popup.$element.detach();
+
+               // Disconnect events
+               this.model.disconnect( this );
+               this.closeButton.disconnect( this );
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
new file mode 100644 (file)
index 0000000..84248e1
--- /dev/null
@@ -0,0 +1,180 @@
+( function ( mw ) {
+       /**
+        * List of changes
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersViewModel View model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changesListViewModel View model
+        * @param {jQuery} $changesListRoot Root element of the changes list to attach to
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget = function MwRcfiltersUiChangesListWrapperWidget(
+               filtersViewModel,
+               changesListViewModel,
+               $changesListRoot,
+               config
+       ) {
+               config = $.extend( {}, config, {
+                       $element: $changesListRoot
+               } );
+
+               // Parent
+               mw.rcfilters.ui.ChangesListWrapperWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               this.filtersViewModel = filtersViewModel;
+               this.changesListViewModel = changesListViewModel;
+
+               // Events
+               this.filtersViewModel.connect( this, {
+                       itemUpdate: 'onItemUpdate',
+                       highlightChange: 'onHighlightChange'
+               } );
+               this.changesListViewModel.connect( this, {
+                       invalidate: 'onModelInvalidate',
+                       update: 'onModelUpdate'
+               } );
+
+               this.$element.addClass( 'mw-rcfilters-ui-changesListWrapperWidget' );
+
+               // Set up highlight containers
+               this.setupHighlightContainers( this.$element );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.ChangesListWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.ChangesListWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Respond to the highlight feature being toggled on and off
+        *
+        * @param {boolean} highlightEnabled
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onHighlightChange = function ( highlightEnabled ) {
+               if ( highlightEnabled ) {
+                       this.applyHighlight();
+               } else {
+                       this.clearHighlight();
+               }
+       };
+
+       /**
+        * Respond to a filter item model update
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onItemUpdate = function () {
+               if ( this.filtersViewModel.isHighlightEnabled() ) {
+                       this.clearHighlight();
+                       this.applyHighlight();
+               }
+       };
+
+       /**
+        * Respond to changes list model invalidate
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelInvalidate = function () {
+               this.pushPending();
+       };
+
+       /**
+        * Respond to changes list model update
+        *
+        * @param {jQuery|string} $changesListContent The content of the updated changes list
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent ) {
+               var 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() )
+                       );
+               } else {
+                       this.$changesListContent = $changesListContent;
+                       this.$element.empty().append( this.$changesListContent );
+                       // Set up highlight containers
+                       this.setupHighlightContainers( this.$element );
+
+                       // Apply highlight
+                       this.applyHighlight();
+
+                       // Make sure enhanced RC re-initializes correctly
+                       mw.hook( 'wikipage.content' ).fire( this.$element );
+               }
+               this.popPending();
+       };
+
+       /**
+        * Set up the highlight containers with all color circle indicators.
+        *
+        * @param {jQuery|string} $content The content of the updated changes list
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.setupHighlightContainers = function ( $content ) {
+               var $highlights = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlights' )
+                               .append(
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlights-color-none' )
+                                               .prop( 'data-color', 'none' )
+                               );
+
+               mw.rcfilters.HighlightColors.forEach( function ( color ) {
+                       $highlights.append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlights-color-' + color )
+                                       .prop( 'data-color', color )
+                       );
+               } );
+
+               if ( Number( mw.user.options.get( 'usenewrc' ) ) ) {
+                       // Enhanced RC
+                       $content.find( 'td.mw-enhanced-rc' )
+                               .parent()
+                               .prepend(
+                                       $( '<td>' )
+                                               .append( $highlights.clone() )
+                               );
+               } else {
+                       // Regular RC
+                       $content.find( 'ul.special li' )
+                               .prepend( $highlights.clone() );
+               }
+       };
+
+       /**
+        * Apply color classes based on filters highlight configuration
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.applyHighlight = function () {
+               if ( !this.filtersViewModel.isHighlightEnabled() ) {
+                       return;
+               }
+
+               this.filtersViewModel.getHighlightedItems().forEach( function ( filterItem ) {
+                       // Add highlight class to all highlighted list items
+                       this.$element.find( '.' + filterItem.getCssClass() )
+                               .addClass( 'mw-rcfilters-highlight-color-' + filterItem.getHighlightColor() );
+               }.bind( this ) );
+
+               // Turn on highlights
+               this.$element.addClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' );
+       };
+
+       /**
+        * Remove all color classes
+        */
+       mw.rcfilters.ui.ChangesListWrapperWidget.prototype.clearHighlight = function () {
+               // Remove highlight classes
+               mw.rcfilters.HighlightColors.forEach( function ( color ) {
+                       this.$element.find( '.mw-rcfilters-highlight-color-' + color ).removeClass( 'mw-rcfilters-highlight-color-' + color );
+               }.bind( this ) );
+
+               // Turn off highlights
+               this.$element.removeClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js
new file mode 100644 (file)
index 0000000..86b3b11
--- /dev/null
@@ -0,0 +1,41 @@
+( function ( mw ) {
+       /**
+        * A widget representing a single toggle filter
+        *
+        * @extends OO.ui.CheckboxInputWidget
+        *
+        * @constructor
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.CheckboxInputWidget = function MwRcfiltersUiCheckboxInputWidget( config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.CheckboxInputWidget.parent.call( this, config );
+
+               // Event
+               this.$input.on( 'change', this.onUserChange.bind( this ) );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.CheckboxInputWidget, OO.ui.CheckboxInputWidget );
+
+       /* Events */
+
+       /**
+        * @event userChange
+        * @param {boolean} Current state of the checkbox
+        *
+        * The user has checked or unchecked this checkbox
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to checkbox change by a user and emit 'userChange'.
+        */
+       mw.rcfilters.ui.CheckboxInputWidget.prototype.onUserChange = function () {
+               this.emit( 'userChange', this.$input.prop( 'checked' ) );
+       };
+}( mediaWiki ) );
index c498ce9..a06b103 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * Filter-specific CapsuleMultiselectWidget
         *
+        * @class
         * @extends OO.ui.CapsuleMultiselectWidget
         *
         * @constructor
         * @param {mw.rcfilters.dm.FiltersViewModel} model RCFilters view model
         * @param {OO.ui.InputWidget} filterInput A filter input that focuses the capsule widget
         * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.FilterCapsuleMultiselectWidget = function MwRcfiltersUiFilterCapsuleMultiselectWidget( controller, model, filterInput, config ) {
+               var title = new OO.ui.LabelWidget( {
+                               label: mw.msg( 'rcfilters-activefilters' ),
+                               classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-wrapper-content-title' ]
+                       } ),
+                       $contentWrapper = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-wrapper' );
+
+               this.$overlay = config.$overlay || this.$element;
+
                // Parent
-               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.call( this, $.extend( {
-                       $autoCloseIgnore: filterInput.$element
+               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.call( this, $.extend( true, {
+                       popup: { $autoCloseIgnore: filterInput.$element.add( this.$overlay ) }
                }, config ) );
 
                this.controller = controller;
                this.model = model;
                this.filterInput = filterInput;
-
-               this.$content.prepend(
-                       $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-content-title' )
-                               .text( mw.msg( 'rcfilters-activefilters' ) )
-               );
+               this.isSelecting = false;
+               this.selected = null;
 
                this.resetButton = new OO.ui.ButtonWidget( {
                        icon: 'trash',
                        label: mw.msg( 'rcfilters-empty-filter' ),
                        classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-emptyFilters' ]
                } );
+               this.$content.append( this.emptyFilterMessage.$element );
 
                // Events
                this.resetButton.connect( this, { click: 'onResetButtonClick' } );
-               this.model.connect( this, { itemUpdate: 'onModelItemUpdate' } );
+               this.model.connect( this, {
+                       itemUpdate: 'onModelItemUpdate',
+                       highlightChange: 'onModelHighlightChange'
+               } );
+               this.aggregate( { click: 'capsuleItemClick' } );
+
                // Add the filterInput as trigger
                this.filterInput.$input
                        .on( 'focus', this.focus.bind( this ) );
 
+               // Build the content
+               $contentWrapper.append(
+                       title.$element,
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-table' )
+                               .append(
+                                       // The filter list and button should appear side by side regardless of how
+                                       // wide the button is; the button also changes its width depending
+                                       // on language and its state, so the safest way to present both side
+                                       // by side is with a table layout
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-row' )
+                                               .append(
+                                                       this.$content
+                                                               .addClass( 'mw-rcfilters-ui-cell' )
+                                                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell-filters' ),
+                                                       $( '<div>' )
+                                                               .addClass( 'mw-rcfilters-ui-cell' )
+                                                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell-reset' )
+                                                               .append( this.resetButton.$element )
+                                               )
+                               )
+               );
+
                // Initialize
-               this.$content.append( this.emptyFilterMessage.$element );
-               this.$handle
-                       .append(
-                               // The content and button should appear side by side regardless of how
-                               // wide the button is; the button also changes its width depending
-                               // on language and its state, so the safest way to present both side
-                               // by side is with a table layout
-                               $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-table' )
-                                       .append(
-                                               $( '<div>' )
-                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-row' )
-                                                       .append(
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-content' )
-                                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell' )
-                                                                       .append( this.$content ),
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell' )
-                                                                       .append( this.resetButton.$element )
-                                                       )
-                                       )
-                       );
+               this.$handle.append( $contentWrapper );
 
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget' );
 
        /* Methods */
 
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onModelItemUpdate = function () {
+       /**
+        * Respond to model itemUpdate event
+        *
+        * @param {mw.rcfilters.dm.FilterItem} item Filter item model
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onModelItemUpdate = function ( item ) {
+               if (
+                       item.isSelected() ||
+                       (
+                               this.model.isHighlightEnabled() &&
+                               item.isHighlightSupported() &&
+                               item.getHighlightColor()
+                       )
+               ) {
+                       this.addItemByName( item.getName() );
+               } else {
+                       this.removeItemByName( item.getName() );
+               }
+
                // Re-evaluate reset state
                this.reevaluateResetRestoreState();
        };
 
+       /**
+        * Respond to highlightChange event
+        *
+        * @param {boolean} isHighlightEnabled Highlight is enabled
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onModelHighlightChange = function ( isHighlightEnabled ) {
+               var highlightedItems = this.model.getHighlightedItems();
+
+               if ( isHighlightEnabled ) {
+                       // Add capsule widgets
+                       highlightedItems.forEach( function ( filterItem ) {
+                               this.addItemByName( filterItem.getName() );
+                       }.bind( this ) );
+               } else {
+                       // Remove capsule widgets if they're not selected
+                       highlightedItems.forEach( function ( filterItem ) {
+                               if ( !filterItem.isSelected() ) {
+                                       this.removeItemByName( filterItem.getName() );
+                               }
+                       }.bind( this ) );
+               }
+       };
+
        /**
         * Respond to click event on the reset button
         */
                this.emptyFilterMessage.toggle( currFiltersAreEmpty );
        };
 
+       /**
+        * Mark an item widget as selected
+        *
+        * @param {mw.rcfilters.ui.CapsuleItemWidget} item Capsule widget
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.select = function ( item ) {
+               if ( this.selected !== item ) {
+                       // Unselect previous
+                       if ( this.selected ) {
+                               this.selected.toggleSelected( false );
+                       }
+
+                       // Select new one
+                       this.selected = item;
+                       if ( this.selected ) {
+                               item.toggleSelected( true );
+                       }
+               }
+       };
+
+       /**
+        * Reset selection and remove selected states from all items
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.resetSelection = function () {
+               if ( this.selected !== null ) {
+                       this.selected = null;
+                       this.getItems().forEach( function ( capsuleWidget ) {
+                               capsuleWidget.toggleSelected( false );
+                       } );
+               }
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.createItemWidget = function ( data ) {
+               var item = this.model.getItemByName( data );
+
+               if ( !item ) {
+                       return;
+               }
+
+               return new mw.rcfilters.ui.CapsuleItemWidget(
+                       this.controller,
+                       item,
+                       { $overlay: this.$overlay }
+               );
+       };
+
+       /**
+        * Add items by their filter name
+        *
+        * @param {string} name Filter name
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.addItemByName = function ( name ) {
+               var item = this.model.getItemByName( name );
+
+               if ( !item ) {
+                       return;
+               }
+
+               // Check that the item isn't already added
+               if ( !this.getItemFromData( name ) ) {
+                       this.addItems( [ this.createItemWidget( name ) ] );
+               }
+       };
+
+       /**
+        * Remove items by their filter name
+        *
+        * @param {string} name Filter name
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItemByName = function ( name ) {
+               this.removeItemsFromData( [ name ] );
+       };
+
        /**
         * @inheritdoc
         */
                this.focus();
        };
 
-       /**
-        * @inheritdoc
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
-               // Parent
-               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items );
-
-               this.emit( 'remove', items.map( function ( item ) { return item.getData(); } ) );
-       };
-
        /**
         * @inheritdoc
         */
                this.menu.selectItem();
                this.menu.highlightItem();
        };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
+               // Parent call
+               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items );
+
+               // Destroy the item widget when it is removed
+               // This is done because we re-add items by recreating them, rather than hiding them
+               // and items include popups, that will just continue to be created and appended
+               // unnecessarily.
+               items.forEach( function ( widget ) {
+                       widget.destroy();
+               } );
+       };
+
+       /**
+        * Override 'editItem' since it tries to use $input which does
+        * not exist when a popup is available.
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.editItem = function () {};
 }( mediaWiki, jQuery ) );
index 2723258..a750c44 100644 (file)
@@ -7,25 +7,37 @@
         * @mixins OO.ui.mixin.LabelElement
         *
         * @constructor
-        * @param {string} name Group name
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FilterGroup} model Filter group model
         * @param {Object} config Configuration object
         */
-       mw.rcfilters.ui.FilterGroupWidget = function MwRcfiltersUiFilterGroupWidget( name, config ) {
+       mw.rcfilters.ui.FilterGroupWidget = function MwRcfiltersUiFilterGroupWidget( controller, model, config ) {
                config = config || {};
 
                // Parent
                mw.rcfilters.ui.FilterGroupWidget.parent.call( this, config );
+
+               this.controller = controller;
+               this.model = model;
+               this.filters = {};
+
                // 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' )
                } ) );
+               this.$overlay = config.$overlay || this.$element;
+
+               // Populate
+               this.populateFromModel();
 
-               this.name = name;
+               this.model.connect( this, { update: 'onModelUpdate' } );
 
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterGroupWidget' )
+                       .addClass( 'mw-rcfilters-ui-filterGroupWidget-name-' + this.model.getName() )
                        .append(
                                this.$label,
                                this.$group
        OO.mixinClass( mw.rcfilters.ui.FilterGroupWidget, OO.ui.mixin.LabelElement );
 
        /**
-        * Get the group name
-        *
-        * @return {string} Group name
+        * Respond to model update event
         */
-       mw.rcfilters.ui.FilterGroupWidget.prototype.getName = function () {
-               return this.name;
+       mw.rcfilters.ui.FilterGroupWidget.prototype.onModelUpdate = function () {
+               this.$element.toggleClass(
+                       'mw-rcfilters-ui-filterGroupWidget-active',
+                       this.model.isActive()
+               );
        };
 
        /**
-        * Toggle the active state of this group
+        * Get an item widget from its filter name
         *
-        * @param {boolean} isActive The group is active
+        * @param {string} filterName Filter name
+        * @return {mw.rcfilters.ui.FilterItemWidget} Item widget
+        */
+       mw.rcfilters.ui.FilterGroupWidget.prototype.getItemWidget = function ( filterName ) {
+               return this.filters[ filterName ];
+       };
+
+       /**
+        * Populate data from the model
         */
-       mw.rcfilters.ui.FilterGroupWidget.prototype.toggleActiveState = function ( isActive ) {
-               this.$element.toggleClass( 'mw-rcfilters-ui-filterGroupWidget-active', isActive );
+       mw.rcfilters.ui.FilterGroupWidget.prototype.populateFromModel = function () {
+               var widget = this;
+
+               this.clearItems();
+               this.filters = {};
+
+               this.addItems(
+                       this.model.getItems().map( function ( filterItem ) {
+                               var groupWidget = new mw.rcfilters.ui.FilterItemWidget(
+                                       widget.controller,
+                                       filterItem,
+                                       {
+                                               label: filterItem.getLabel(),
+                                               description: filterItem.getDescription(),
+                                               $overlay: widget.$overlay
+                                       }
+                               );
+
+                               widget.filters[ filterItem.getName() ] = groupWidget;
+
+                               return groupWidget;
+                       } )
+               );
        };
 
+       /**
+        * Get the group name
+        *
+        * @return {string} Group name
+        */
+       mw.rcfilters.ui.FilterGroupWidget.prototype.getName = function () {
+               return this.model.getName();
+       };
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
new file mode 100644 (file)
index 0000000..17aad51
--- /dev/null
@@ -0,0 +1,73 @@
+( function ( mw, $ ) {
+       /**
+        * A button to configure highlight for a filter item
+        *
+        * @extends OO.ui.PopupButtonWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller RCFilters controller
+        * @param {mw.rcfilters.dm.FilterItem} model Filter item model
+        * @param {Object} [config] Configuration object
+        */
+       mw.rcfilters.ui.FilterItemHighlightButton = function MwRcfiltersUiFilterItemHighlightButton( controller, model, config ) {
+               config = config || {};
+
+               this.colorPickerWidget = new mw.rcfilters.ui.HighlightColorPickerWidget( controller, model );
+
+               // Parent
+               mw.rcfilters.ui.FilterItemHighlightButton.parent.call( this, $.extend( {}, config, {
+                       icon: 'highlight',
+                       indicator: 'down',
+                       popup: {
+                               anchor: false,
+                               padded: true,
+                               align: 'backwards',
+                               horizontalPosition: 'end',
+                               $floatableContainer: this.$element,
+                               width: 290,
+                               $content: this.colorPickerWidget.$element
+                       }
+               } ) );
+
+               this.controller = controller;
+               this.model = model;
+
+               // Event
+               this.model.connect( this, { update: 'onModelUpdate' } );
+               this.colorPickerWidget.connect( this, { chooseColor: 'onChooseColor' } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterItemHighlightButton' );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterItemHighlightButton, OO.ui.PopupButtonWidget );
+
+       /* Methods */
+
+       /**
+        * Respond to item model update event
+        */
+       mw.rcfilters.ui.FilterItemHighlightButton.prototype.onModelUpdate = function () {
+               var currentColor = this.model.getHighlightColor(),
+                       widget = this;
+
+               this.$icon.toggleClass(
+                       'mw-rcfilters-ui-filterItemHighlightButton-circle',
+                       currentColor !== null
+               );
+
+               mw.rcfilters.HighlightColors.forEach( function ( c ) {
+                       widget.$icon
+                               .toggleClass(
+                                       'mw-rcfilters-ui-filterItemHighlightButton-circle-color-' + c,
+                                       c === currentColor
+                               );
+               } );
+       };
+
+       mw.rcfilters.ui.FilterItemHighlightButton.prototype.onChooseColor = function () {
+               this.popup.toggle( false );
+       };
+}( mediaWiki, jQuery ) );
index f353051..81b856d 100644 (file)
@@ -21,8 +21,9 @@
 
                this.controller = controller;
                this.model = model;
+               this.selected = false;
 
-               this.checkboxWidget = new OO.ui.CheckboxInputWidget( {
+               this.checkboxWidget = new mw.rcfilters.ui.CheckboxInputWidget( {
                        value: this.model.getName(),
                        selected: this.model.isSelected()
                } );
                        );
                }
 
+               this.highlightButton = new mw.rcfilters.ui.FilterItemHighlightButton(
+                       this.controller,
+                       this.model,
+                       {
+                               $overlay: config.$overlay || this.$element
+                       }
+               );
+               this.highlightButton.toggle( this.model.isHighlightEnabled() );
+
                layout = new OO.ui.FieldLayout( this.checkboxWidget, {
                        label: $label,
                        align: 'inline'
                } );
 
                // Event
-               this.checkboxWidget.connect( this, { change: 'onCheckboxChange' } );
+               this.checkboxWidget.connect( this, { userChange: 'onCheckboxChange' } );
                this.model.connect( this, { update: 'onModelUpdate' } );
+               this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } );
 
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterItemWidget' )
                        .append(
-                               layout.$element
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-table' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-filterItemWidget-filterCheckbox' )
+                                                                       .append( layout.$element ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-filterItemWidget-highlightButton' )
+                                                                       .append( this.highlightButton.$element )
+                                                       )
+                                       )
                        );
        };
 
@@ -70,7 +94,7 @@
         * @param {boolean} isSelected The checkbox is selected
         */
        mw.rcfilters.ui.FilterItemWidget.prototype.onCheckboxChange = function ( isSelected ) {
-               this.controller.updateFilter( this.model.getName(), isSelected );
+               this.controller.toggleFilterSelect( this.model.getName(), isSelected );
        };
 
        /**
        mw.rcfilters.ui.FilterItemWidget.prototype.onModelUpdate = function () {
                this.checkboxWidget.setSelected( this.model.isSelected() );
 
+               this.setCurrentMuteState();
+       };
+
+       /**
+        * Respond to item group model update event
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.onGroupModelUpdate = function () {
+               this.setCurrentMuteState();
+       };
+
+       /**
+        * Set selected state on this widget
+        *
+        * @param {boolean} [isSelected] Widget is selected
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-filterItemWidget-selected', this.selected );
+               }
+       };
+
+       /**
+        * Set the current mute state for this item
+        */
+       mw.rcfilters.ui.FilterItemWidget.prototype.setCurrentMuteState = function () {
                this.$element.toggleClass(
-                       'mw-rcfilters-ui-filterItemWidget-inactive',
-                       !this.model.isActive()
+                       'mw-rcfilters-ui-filterItemWidget-muted',
+                       this.model.isConflicted() ||
+                       this.model.isIncluded() ||
+                       (
+                               // Item is also muted when any of the items in its group is active
+                               this.model.getGroupModel().isActive() &&
+                               // But it isn't selected
+                               !this.model.isSelected()
+                       )
                );
+
+               this.highlightButton.toggle( this.model.isHighlightEnabled() );
        };
 
        /**
        mw.rcfilters.ui.FilterItemWidget.prototype.getName = function () {
                return this.model.getName();
        };
-
 }( mediaWiki, jQuery ) );
index 34cc240..886dc43 100644 (file)
@@ -8,10 +8,12 @@
         * @constructor
         * @param {mw.rcfilters.Controller} controller Controller
         * @param {mw.rcfilters.dm.FiltersViewModel} model View model
-        * @param {Object} config Configuration object
+        * @param {Object} [config] Configuration object
         * @cfg {Object} [filters] A definition of the filter groups in this list
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
+               var $footer = $( '<div>' );
                config = config || {};
 
                // Parent
 
                this.controller = controller;
                this.model = model;
-               this.filtersInCapsule = [];
+               this.$overlay = config.$overlay || this.$element;
 
                this.filterPopup = new mw.rcfilters.ui.FiltersListWidget(
                        this.controller,
                        this.model,
                        {
-                               label: mw.msg( 'rcfilters-filterlist-title' )
+                               label: mw.msg( 'rcfilters-filterlist-title' ),
+                               $overlay: this.$overlay
                        }
                );
 
+               $footer.append(
+                       new OO.ui.ButtonWidget( {
+                               framed: false,
+                               icon: 'feedback',
+                               flags: [ 'progressive' ],
+                               label: mw.msg( 'rcfilters-filterlist-feedbacklink' ),
+                               href: 'https://www.mediawiki.org/wiki/Help_talk:New_filters_for_edit_review'
+                       } ).$element
+               );
+
                this.textInput = new OO.ui.TextInputWidget( {
                        classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
                        icon: 'search',
                } );
 
                this.capsule = new mw.rcfilters.ui.FilterCapsuleMultiselectWidget( controller, this.model, this.textInput, {
+                       $overlay: this.$overlay,
                        popup: {
                                $content: this.filterPopup.$element,
-                               classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ]
+                               $footer: $footer,
+                               classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
+                               width: 650
                        }
                } );
 
                        itemUpdate: 'onModelItemUpdate'
                } );
                this.textInput.connect( this, {
-                       change: 'onTextInputChange'
-               } );
-               this.capsule.connect( this, {
-                       remove: 'onCapsuleRemoveItem'
+                       change: 'onTextInputChange',
+                       enter: 'onTextInputEnter'
                } );
+               this.capsule.connect( this, { capsuleItemClick: 'onCapsuleItemClick' } );
+               this.capsule.popup.connect( this, { toggle: 'onCapsulePopupToggle' } );
 
+               // Initialize
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
+                       .addClass( 'mw-rcfilters-ui-ready' )
                        .append( this.capsule.$element, this.textInput.$element );
        };
 
        OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget );
        OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement );
 
+       /**
+        * Respond to capsule item click and make the popup scroll down to the requested item
+        *
+        * @param {mw.rcfilters.ui.CapsuleItemWidget} item Clicked item
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsuleItemClick = function ( item ) {
+               var filterName = item.getData(),
+                       // Find the item in the popup
+                       filterWidget = this.filterPopup.getItemWidget( filterName );
+
+               // Highlight item
+               this.filterPopup.select( filterName );
+               this.capsule.select( item );
+
+               this.scrollToTop( filterWidget.$element );
+       };
+
+       /**
+        * 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 );
+               }
+       };
+
        /**
         * Respond to text input change
         *
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputChange = function ( newValue ) {
                // Filter the results
                this.filterPopup.filter( this.model.findMatches( newValue ) );
+
+               if ( !newValue ) {
+                       // If the value is empty, we didn't actually
+                       // filter anything. the filter method will run
+                       // and show all, but then will select the
+                       // top item - but in this case, no selection
+                       // should be made.
+                       this.filterPopup.resetSelection();
+               }
+               this.capsule.popup.clip();
        };
 
        /**
-        * Respond to an event where an item is removed from the capsule.
-        * This is the case where a user actively removes a filter box from the capsule widget.
-        *
-        * @param {string[]} filterNames An array of filter names that were removed
+        * Respond to text input enter event
         */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsuleRemoveItem = function ( filterNames ) {
-               var filterItem,
-                       widget = this;
-
-               filterNames.forEach( function ( filterName ) {
-                       // Go over filters
-                       filterItem = widget.model.getItemByName( filterName );
-                       filterItem.toggleSelected( false );
-               } );
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputEnter = function () {
+               var filter = this.filterPopup.getSelectedFilter();
+
+               // Toggle the filter
+               this.controller.toggleFilterSelect( filter );
        };
 
        /**
         * from.
         */
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelInitialize = function () {
-               var items,
-                       wrapper = this,
-                       filters = this.model.getItems();
-
-               // Reset
-               this.capsule.getMenu().clearItems();
-
-               // Insert hidden options for the capsule to get its item data from
-               items = filters.map( function ( filterItem ) {
-                       return new OO.ui.MenuOptionWidget( {
-                               data: filterItem.getName(),
-                               label: filterItem.getLabel()
-                       } );
-               } );
-
-               this.capsule.getMenu().addItems( items );
+               var wrapper = this;
 
                // Add defaults to capsule. We have to do this
                // after we added to the capsule menu, since that's
                // how the capsule multiselect widget knows which
                // object to add
-               filters.forEach( function ( filterItem ) {
+               this.model.getItems().forEach( function ( filterItem ) {
                        if ( filterItem.isSelected() ) {
-                               wrapper.addCapsuleItemFromName( filterItem.getName() );
+                               wrapper.capsule.addItemByName( filterItem.getName() );
                        }
                } );
        };
 
        /**
-        * Respond to model item update
-        *
-        * @param {mw.rcfilters.dm.FilterItem} item Filter item that was updated
+        * Respond to item update and reset the selection. This will make it so that
+        * any actual interaction with the system resets the selection state of any item.
         */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelItemUpdate = function ( item ) {
-               var widget = this;
-
-               if ( item.isSelected() ) {
-                       this.addCapsuleItemFromName( item.getName() );
-               } else {
-                       this.capsule.removeItemsFromData( [ item.getName() ] );
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelItemUpdate = function () {
+               if ( !this.textInput.getValue() ) {
+                       this.filterPopup.resetSelection();
                }
-
-               // Toggle the active state of the group
-               this.filterPopup.getItems().forEach( function ( groupWidget ) {
-                       if ( groupWidget.getName() === item.getGroup() ) {
-                               groupWidget.toggleActiveState( widget.model.isFilterGroupActive( groupWidget.getName() ) );
-                       }
-               } );
        };
 
        /**
-        * Add a capsule item by its filter name
+        * Scroll the element to top within its container
         *
-        * @param {string} itemName Filter name
+        * @private
+        * @param {jQuery} $element Element to position
+        * @param {number} [marginFromTop] When scrolling the entire widget to the top, leave this
+        *  much space (in pixels) above the widget.
         */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.addCapsuleItemFromName = function ( itemName ) {
-               var item = this.model.getItemByName( itemName );
-
-               this.capsule.addItemsFromData( [ itemName ] );
-
-               // Deal with active/inactive capsule filter items
-               this.capsule.getItemFromData( itemName ).$element
-                       .toggleClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-item-inactive', !item.isActive() );
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.scrollToTop = function ( $element, marginFromTop ) {
+               var container = OO.ui.Element.static.getClosestScrollableContainer( $element[ 0 ], 'y' ),
+                       pos = OO.ui.Element.static.getRelativePosition( $element, $( container ) ),
+                       containerScrollTop = $( container ).is( 'body' ) ? 0 : $( container ).scrollTop();
+
+               // Scroll to item
+               $( container ).animate( {
+                       scrollTop: containerScrollTop + pos.top - ( marginFromTop || 0 )
+               } );
        };
 }( mediaWiki ) );
index f5ec1fc..cefe749 100644 (file)
 
                this.controller = controller;
                this.model = model;
+               this.$overlay = config.$overlay || this.$element;
+               this.groups = {};
+               this.selected = null;
+
+               this.highlightButton = new OO.ui.ButtonWidget( {
+                       label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
+                       classes: [ 'mw-rcfilters-ui-filtersListWidget-hightlightButton' ]
+               } );
 
                this.noResultsLabel = new OO.ui.LabelWidget( {
                        label: mw.msg( 'rcfilters-filterlist-noresults' ),
                } );
 
                // Events
+               this.highlightButton.connect( this, { click: 'onHighlightButtonClick' } );
                this.model.connect( this, {
-                       initialize: 'onModelInitialize'
+                       initialize: 'onModelInitialize',
+                       highlightChange: 'onHighlightChange'
                } );
 
                // Initialize
                this.$element
                        .addClass( 'mw-rcfilters-ui-filtersListWidget' )
                        .append(
-                               this.$label,
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-table' )
+                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-header' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-header-title' )
+                                                                       .append( this.$label ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-filtersListWidget-header-highlight' )
+                                                                       .append( this.highlightButton.$element )
+                                                       )
+                                       ),
+                               // this.$label,
                                this.$group
                                        .addClass( 'mw-rcfilters-ui-filtersListWidget-group' ),
                                this.noResultsLabel.$element
         * Respond to initialize event from the model
         */
        mw.rcfilters.ui.FiltersListWidget.prototype.onModelInitialize = function () {
-               var i, group, groupWidget,
-                       itemWidgets = [],
-                       groupWidgets = [],
-                       groups = this.model.getFilterGroups();
+               var widget = this;
 
                // Reset
                this.clearItems();
+               this.groups = {};
+
+               this.addItems(
+                       Object.keys( this.model.getFilterGroups() ).map( function ( groupName ) {
+                               var groupWidget = new mw.rcfilters.ui.FilterGroupWidget(
+                                       widget.controller,
+                                       widget.model.getGroup( groupName ),
+                                       {
+                                               $overlay: widget.$overlay
+                                       }
+                               );
 
-               for ( group in groups ) {
-                       groupWidget = new mw.rcfilters.ui.FilterGroupWidget( group, {
-                               label: groups[ group ].title
-                       } );
-                       groupWidgets.push( groupWidget );
-
-                       itemWidgets = [];
-                       if ( groups[ group ].filters ) {
-                               for ( i = 0; i < groups[ group ].filters.length; i++ ) {
-                                       itemWidgets.push(
-                                               new mw.rcfilters.ui.FilterItemWidget(
-                                                       this.controller,
-                                                       groups[ group ].filters[ i ],
-                                                       {
-                                                               label: groups[ group ].filters[ i ].getLabel(),
-                                                               description: groups[ group ].filters[ i ].getDescription()
-                                                       }
-                                               )
-                                       );
-                               }
+                               widget.groups[ groupName ] = groupWidget;
+                               return groupWidget;
+                       } )
+               );
+       };
+
+       mw.rcfilters.ui.FiltersListWidget.prototype.onHighlightChange = function ( highlightEnabled ) {
+               this.highlightButton.setActive( highlightEnabled );
+       };
+
+       /**
+        * Respond to highlight button click
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.onHighlightButtonClick = function () {
+               this.controller.toggleHighlight();
+       };
+
+       /**
+        * Find the filter item widget that corresponds to the item name
+        *
+        * @param {string} itemName Filter name
+        * @return {mw.rcfilters.ui.FilterItemWidget} Filter widget
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.getItemWidget = function ( itemName ) {
+               var filterItem = this.model.getItemByName( itemName ),
+                       // Find the group
+                       groupWidget = this.groups[ filterItem.getGroupName() ];
+
+               // Find the item inside the group
+               return groupWidget.getItemWidget( itemName );
+       };
 
-                               groupWidget.addItems( itemWidgets );
+       /**
+        * Get the current selection
+        *
+        * @return {string|null} Selected filter. Null if none is selected.
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.getSelectedFilter = function () {
+               return this.selected;
+       };
+
+       /**
+        * Mark an item widget as selected
+        *
+        * @param {string} itemName Filter name
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.select = function ( itemName ) {
+               var filterWidget;
+
+               if ( this.selected !== itemName ) {
+                       // Unselect previous
+                       if ( this.selected ) {
+                               filterWidget = this.getItemWidget( this.selected );
+                               filterWidget.toggleSelected( false );
+                       }
+
+                       // Select new one
+                       this.selected = itemName;
+                       if ( this.selected ) {
+                               filterWidget = this.getItemWidget( this.selected );
+                               filterWidget.toggleSelected( true );
                        }
                }
+       };
 
-               this.addItems( groupWidgets );
+       /**
+        * Reset selection and remove selected states from all items
+        */
+       mw.rcfilters.ui.FiltersListWidget.prototype.resetSelection = function () {
+               if ( this.selected !== null ) {
+                       this.selected = null;
+                       this.getItems().forEach( function ( groupWidget ) {
+                               groupWidget.getItems().forEach( function ( filterItemWidget ) {
+                                       filterItemWidget.toggleSelected( false );
+                               } );
+                       } );
+               }
        };
 
        /**
         *  arranged by their group names
         */
        mw.rcfilters.ui.FiltersListWidget.prototype.filter = function ( groupItems ) {
-               var i, j, groupName, itemWidgets,
+               var i, j, groupName, itemWidgets, topItem, isVisible,
                        groupWidgets = this.getItems(),
                        hasItemWithName = function ( itemArr, name ) {
                                return !!itemArr.filter( function ( item ) {
                                } ).length;
                        };
 
+               this.resetSelection();
+
                if ( $.isEmptyObject( groupItems ) ) {
                        // No results. Hide everything, show only 'no results'
                        // message
                        // We have items to show
                        itemWidgets = groupWidgets[ i ].getItems();
                        for ( j = 0; j < itemWidgets.length; j++ ) {
+                               isVisible = hasItemWithName( groupItems[ groupName ], itemWidgets[ j ].getName() );
                                // Only show items that are in the filtered list
-                               itemWidgets[ j ].toggle(
-                                       hasItemWithName( groupItems[ groupName ], itemWidgets[ j ].getName() )
-                               );
+                               itemWidgets[ j ].toggle( isVisible );
+
+                               if ( !topItem && isVisible ) {
+                                       topItem = itemWidgets[ j ];
+                               }
                        }
                }
+
+               // Select the first item
+               if ( topItem ) {
+                       this.select( topItem.getName() );
+               }
        };
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
new file mode 100644 (file)
index 0000000..51311e1
--- /dev/null
@@ -0,0 +1,156 @@
+( function ( mw ) {
+       /**
+        * Wrapper for the RC form with hide/show links
+        * Must be constructed after the model is initialized.
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Changes list view model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changeListModel Changes list view model
+        * @param {mw.rcfilters.Controller} controller RCfilters controller
+        * @param {jQuery} $formRoot Root element of the form to attach to
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( filtersModel, changeListModel, controller, $formRoot, config ) {
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, {
+                       $element: $formRoot
+               } ) );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               this.changeListModel = changeListModel;
+               this.filtersModel = filtersModel;
+               this.controller = controller;
+               this.$submitButton = this.$element.find( 'form input[type=submit]' );
+
+               this.$element
+                       .on( 'click', 'a[data-params]', this.onLinkClick.bind( this ) );
+
+               this.$element
+                       .on( 'submit', 'form', this.onFormSubmit.bind( this ) );
+
+               // Events
+               this.changeListModel.connect( this, {
+                       invalidate: 'onChangesModelInvalidate',
+                       update: 'onChangesModelUpdate'
+               } );
+
+               // Initialize
+               this.cleanUpFieldset();
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-FormWrapperWidget' )
+                       .addClass( 'mw-rcfilters-ui-ready' );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Respond to link click
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onLinkClick = function ( e ) {
+               this.controller.updateChangesList( $( e.target ).data( 'params' ) );
+               return false;
+       };
+
+       /**
+        * Respond to form submit event
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onFormSubmit = function ( e ) {
+               var data = {};
+
+               // Collect all data from form
+               $( e.target ).find( 'input:not([type="hidden"],[type="submit"]), select' ).each( function () {
+                       if ( !$( this ).is( ':checkbox' ) || $( this ).is( ':checked' ) ) {
+                               data[ $( this ).prop( 'name' ) ] = $( this ).val();
+                       }
+               } );
+
+               this.controller.updateChangesList( data );
+               return false;
+       };
+
+       /**
+        * Respond to model invalidate
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelInvalidate = function () {
+               this.pushPending();
+               this.$submitButton.prop( 'disabled', true );
+       };
+
+       /**
+        * Respond to model update, replace the show/hide links with the ones from the
+        * server so they feature the correct state.
+        *
+        * @param {jQuery|string} $changesList Updated changes list
+        * @param {jQuery} $fieldset Updated fieldset
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset ) {
+               this.$submitButton.prop( 'disabled', false );
+
+               // Replace the entire fieldset
+               this.$element.empty().append( $fieldset.contents() );
+
+               this.cleanUpFieldset();
+
+               this.popPending();
+       };
+
+       /**
+        * Clean up the old-style show/hide that we have implemented in the filter list
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.cleanUpFieldset = function () {
+               var widget = this;
+
+               // HACK: Remove old-style filter links for filters handled by the widget
+               // Ideally the widget would handle all filters and we'd just remove .rcshowhide entirely
+               this.$element.find( '.rcshowhide' ).children().each( function () {
+                       // HACK: Interpret the class name to get the filter name
+                       // This should really be set as a data attribute
+                       var i,
+                               name = null,
+                               // Some of the older browsers we support don't have .classList,
+                               // so we have to interpret the class attribute manually.
+                               classes = this.getAttribute( 'class' ).split( ' ' );
+                       for ( i = 0; i < classes.length; i++ ) {
+                               if ( classes[ i ].substr( 0, 'rcshow'.length ) === 'rcshow' ) {
+                                       name = classes[ i ].substr( 'rcshow'.length );
+                                       break;
+                               }
+                       }
+                       if ( name === null ) {
+                               return;
+                       }
+                       if ( name === 'hidemine' ) {
+                               // HACK: the span for hidemyself is called hidemine
+                               name = 'hidemyself';
+                       }
+
+                       // This span corresponds to a filter that's in our model, so remove it
+                       if ( widget.filtersModel.getItemByName( name ) ) {
+                               // HACK: Remove the text node after the span.
+                               // If there isn't one, we're at the end, so remove the text node before the span.
+                               // This would be unnecessary if we added separators with CSS.
+                               if ( this.nextSibling && this.nextSibling.nodeType === Node.TEXT_NODE ) {
+                                       this.parentNode.removeChild( this.nextSibling );
+                               } else if ( this.previousSibling && this.previousSibling.nodeType === Node.TEXT_NODE ) {
+                                       this.parentNode.removeChild( this.previousSibling );
+                               }
+                               // Remove the span itself
+                               this.parentNode.removeChild( this );
+                       }
+               } );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js
new file mode 100644 (file)
index 0000000..570647e
--- /dev/null
@@ -0,0 +1,112 @@
+( function ( mw, $ ) {
+       /**
+        * A widget representing a filter item highlight color picker
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.LabelElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller RCFilters controller
+        * @param {mw.rcfilters.dm.FilterItem} model Filter item model
+        * @param {Object} [config] Configuration object
+        */
+       mw.rcfilters.ui.HighlightColorPickerWidget = function MwRcfiltersUiHighlightColorPickerWidget( controller, model, config ) {
+               var colors = [ 'none' ].concat( mw.rcfilters.HighlightColors );
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.HighlightColorPickerWidget.parent.call( this, config );
+               // Mixin constructors
+               OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
+                       label: mw.message( 'rcfilters-highlightmenu-title' ).text()
+               } ) );
+
+               this.controller = controller;
+               this.model = model;
+
+               this.currentSelection = '';
+               this.buttonSelect = new OO.ui.ButtonSelectWidget( {
+                       items: colors.map( function ( color ) {
+                               return new OO.ui.ButtonOptionWidget( {
+                                       icon: color === 'none' ? 'check' : null,
+                                       data: color,
+                                       classes: [
+                                               'mw-rcfilters-ui-highlightColorPickerWidget-buttonSelect-color',
+                                               'mw-rcfilters-ui-highlightColorPickerWidget-buttonSelect-color-' + color
+                                       ],
+                                       framed: false
+                               } );
+                       } ),
+                       classes: 'mw-rcfilters-ui-highlightColorPickerWidget-buttonSelect'
+               } );
+               this.selectColor( 'none' );
+
+               // Event
+               this.model.connect( this, { update: 'onModelUpdate' } );
+               this.buttonSelect.connect( this, { choose: 'onChooseColor' } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-highlightColorPickerWidget' )
+                       .append(
+                               this.$label
+                                       .addClass( 'mw-rcfilters-ui-highlightColorPickerWidget-label' ),
+                               this.buttonSelect.$element
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.HighlightColorPickerWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.HighlightColorPickerWidget, OO.ui.mixin.LabelElement );
+
+       /* Events */
+
+       /**
+        * @event chooseColor
+        * @param {string} The chosen color
+        *
+        * A color has been chosen
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to item model update event
+        */
+       mw.rcfilters.ui.HighlightColorPickerWidget.prototype.onModelUpdate = function () {
+               this.selectColor( this.model.getHighlightColor() || 'none' );
+       };
+
+       /**
+        * Select the color for this widget
+        *
+        * @param {string} color Selected color
+        */
+       mw.rcfilters.ui.HighlightColorPickerWidget.prototype.selectColor = function ( color ) {
+               var previousItem = this.buttonSelect.getItemFromData( this.currentSelection ),
+                       selectedItem = this.buttonSelect.getItemFromData( color );
+
+               if ( this.currentSelection !== color ) {
+                       this.currentSelection = color;
+
+                       this.buttonSelect.selectItem( selectedItem );
+                       if ( previousItem ) {
+                               previousItem.setIcon( null );
+                       }
+
+                       if ( selectedItem ) {
+                               selectedItem.setIcon( 'check' );
+                       }
+               }
+       };
+
+       mw.rcfilters.ui.HighlightColorPickerWidget.prototype.onChooseColor = function ( button ) {
+               var color = button.data;
+               if ( color === 'none' ) {
+                       this.controller.clearHighlightColor( this.model.getName() );
+               } else {
+                       this.controller.setHighlightColor( this.model.getName(), color );
+               }
+               this.emit( 'chooseColor', color );
+       };
+}( mediaWiki, jQuery ) );
index 87e209e..5ded184 100644 (file)
@@ -35,7 +35,7 @@
 
        /* IE7 and earlier */
        zoom: 1;
-       *display: inline;
+       *display: inline; /* stylelint-disable declaration-block-no-duplicate-properties */
 
        padding: 7px;
 }
@@ -55,7 +55,7 @@ table.toc td {
 #toc h2,
 .toc h2 {
        display: inline;
-       border: none;
+       border: 0;
        padding: 0;
        font-size: 100%;
        font-weight: bold;
@@ -121,16 +121,20 @@ table.toc td {
 }
 
 /* Images */
-/* @noflip */div.floatright, table.floatright {
-       margin: 0 0 .5em .5em;
+/* @noflip */
+div.floatright,
+table.floatright {
+       margin: 0 0 0.5em 0.5em;
 }
 
 div.floatright p {
        font-style: italic;
 }
 
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0 .5em .5em 0;
+/* @noflip */
+div.floatleft,
+table.floatleft {
+       margin: 0 0.5em 0.5em 0;
 }
 
 div.floatleft p {
@@ -139,7 +143,7 @@ div.floatleft p {
 
 /* Thumbnails */
 div.thumb {
-       margin-bottom: .5em;
+       margin-bottom: 0.5em;
        width: auto;
        background-color: transparent;
 }
@@ -161,7 +165,7 @@ html .thumbimage {
 }
 
 html .thumbcaption {
-       border: none;
+       border: 0;
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
@@ -245,12 +249,12 @@ img.thumbborder {
 
 /* @noflip */
 div.tright {
-       margin: .5em 0 1.3em 1.4em;
+       margin: 0.5em 0 1.3em 1.4em;
 }
 
 /* @noflip */
 div.tleft {
-       margin: .5em 1.4em 1.3em 0;
+       margin: 0.5em 1.4em 1.3em 0;
 }
 
 /* Hide elements that are marked as "empty" according to legacy Tidy rules,
index b7cc6ed..b392259 100644 (file)
@@ -2,7 +2,7 @@
  * Icons and colors for external links.
  */
 
-/* Bug 66091 is blocking is from converting this file to LESS
+/* T68091 is blocking is from converting this file to LESS
  * and using the .background-image-svg mixin. */
 
 /* SVG support using a transparent gradient to guarantee cross-browser
@@ -19,7 +19,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="mailto:"],
+.mw-body a.external[href^='mailto:'],
 .link-mailto {
        background: url( images/mail.png ) center right no-repeat;
        /* @embed */
@@ -27,7 +27,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="ftp://"],
+.mw-body a.external[href^='ftp://'],
 .link-ftp {
        background: url( images/ftp-ltr.png ) center right no-repeat;
        /* @embed */
@@ -35,8 +35,8 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="irc://"],
-.mw-body a.external[href^="ircs://"],
+.mw-body a.external[href^='irc://'],
+.mw-body a.external[href^='ircs://'],
 .link-irc {
        background: url( images/chat-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogg"], .mw-body a.external[href$=".OGG"],
-.mw-body a.external[href$=".mid"], .mw-body a.external[href$=".MID"],
-.mw-body a.external[href$=".midi"], .mw-body a.external[href$=".MIDI"],
-.mw-body a.external[href$=".mp3"], .mw-body a.external[href$=".MP3"],
-.mw-body a.external[href$=".wav"], .mw-body a.external[href$=".WAV"],
-.mw-body a.external[href$=".wma"], .mw-body a.external[href$=".WMA"],
+.mw-body a.external[href$='.ogg'],
+.mw-body a.external[href$='.OGG'],
+.mw-body a.external[href$='.mid'],
+.mw-body a.external[href$='.MID'],
+.mw-body a.external[href$='.midi'],
+.mw-body a.external[href$='.MIDI'],
+.mw-body a.external[href$='.mp3'],
+.mw-body a.external[href$='.MP3'],
+.mw-body a.external[href$='.wav'],
+.mw-body a.external[href$='.WAV'],
+.mw-body a.external[href$='.wma'],
+.mw-body a.external[href$='.WMA'],
 .link-audio {
        background: url( images/audio-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogm"], .mw-body a.external[href$=".OGM"],
-.mw-body a.external[href$=".avi"], .mw-body a.external[href$=".AVI"],
-.mw-body a.external[href$=".mpeg"], .mw-body a.external[href$=".MPEG"],
-.mw-body a.external[href$=".mpg"], .mw-body a.external[href$=".MPG"],
+.mw-body a.external[href$='.ogm'],
+.mw-body a.external[href$='.OGM'],
+.mw-body a.external[href$='.avi'],
+.mw-body a.external[href$='.AVI'],
+.mw-body a.external[href$='.mpeg'],
+.mw-body a.external[href$='.MPEG'],
+.mw-body a.external[href$='.mpg'],
+.mw-body a.external[href$='.MPG'],
 .link-video {
        background: url( images/video.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".pdf"], .mw-body a.external[href$=".PDF"],
-.mw-body a.external[href*=".pdf#"], .mw-body a.external[href*=".PDF#"],
-.mw-body a.external[href*=".pdf?"], .mw-body a.external[href*=".PDF?"],
+.mw-body a.external[href$='.pdf'],
+.mw-body a.external[href$='.PDF'],
+.mw-body a.external[href*='.pdf#'],
+.mw-body a.external[href*='.PDF#'],
+.mw-body a.external[href*='.pdf?'],
+.mw-body a.external[href*='.PDF?'],
 .link-document {
        background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
index 346771f..b3d1613 100644 (file)
  * automatically when content is modified.
  */
 .mw-body-content {
-       counter-reset: mw-NumberedExtLink;
+       counter-reset: mw-numbered-ext-link;
 }
 
-.mw-body-content a[rel~="mw:ExtLink"]:empty:after {
-       content: "[" counter( mw-NumberedExtLink ) "]";
-       counter-increment: mw-NumberedExtLink;
+.mw-body-content a[rel~='mw:ExtLink']:empty:after {
+       content: '[' counter( mw-numbered-ext-link ) ']';
+       counter-increment: mw-numbered-ext-link;
 }
 
 /**
@@ -38,7 +38,8 @@ span.reference {
        unicode-bidi: isolate;
 }
 
-sup, sub {
+sup,
+sub {
        line-height: 1;
 }
 
@@ -54,7 +55,7 @@ figure[typeof*='mw:Image'] {
 
        &.mw-halign-right {
                /* @noflip */
-               margin: .5em 0 1.3em 1.4em;
+               margin: 0.5em 0 1.3em 1.4em;
                /* @noflip */
                clear: right;
                /* @noflip */
@@ -63,7 +64,7 @@ figure[typeof*='mw:Image'] {
 
        &.mw-halign-left {
                /* @noflip */
-               margin: .5em 1.4em 1.3em 0;
+               margin: 0.5em 1.4em 1.3em 0;
                /* @noflip */
                clear: left;
                /* @noflip */
@@ -77,7 +78,7 @@ figure[typeof*='mw:Image'] {
        }
 
        &.mw-halign-center {
-               margin: 0 auto .5em auto;
+               margin: 0 auto 0.5em auto;
                display: table;
                clear: none;
                float: none;
@@ -87,8 +88,8 @@ 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
-                  caption results in the same behavior. */
+                * and again 94% in thumbcaption. 88% for font size of the
+                * caption results in the same behavior. */
                font-size: 88%;
                line-height: 1.4em;
                text-align: left;
@@ -118,7 +119,7 @@ figure[typeof~='mw:Image/Frame'] {
        background-color: #f9f9f9;
        // Default to right alignment. This is needed since Parsoid only specifies the
        // alignment class when the alignment is explicitly set.
-       margin: .5em 0 1.3em 1.4em;
+       margin: 0.5em 0 1.3em 1.4em;
        clear: right;
        float: right;
 }
@@ -128,8 +129,11 @@ figure[typeof~='mw:Image/Frame'] > *:first-child > img,
 .mw-image-border > *:first-child > img {
        border: 1px solid #ccc;
        margin: 3px;
+       background: #fff;
 }
 
 /* Hide the caption for frameless and plain floated images */
-figure[typeof~="mw:Image/Frameless"] > figcaption,
-figure[typeof~="mw:Image"] > figcaption { display: none }
+figure[typeof~='mw:Image/Frameless'] > figcaption,
+figure[typeof~='mw:Image'] > figcaption {
+       display: none;
+}
index 7d096f9..46de7b5 100644 (file)
@@ -25,15 +25,16 @@ a:active {
        color: #faa700;
 }
 
-a:hover, a:focus {
+a:hover,
+a:focus {
        text-decoration: underline;
 }
 
-a:lang(ar),
-a:lang(kk-arab),
-a:lang(mzn),
-a:lang(ps),
-a:lang(ur) {
+a:lang( ar ),
+a:lang( kk-arab ),
+a:lang( mzn ),
+a:lang( ps ),
+a:lang( ur ) {
        text-decoration: none;
 }
 
@@ -41,11 +42,13 @@ a.stub {
        color: #723;
 }
 
-a.new, #p-personal a.new {
+a.new,
+#p-personal a.new {
        color: #ba0000;
 }
 
-a.new:visited, #p-personal a.new:visited {
+a.new:visited,
+#p-personal a.new:visited {
        color: #a55858;
 }
 
@@ -69,7 +72,7 @@ a.new:visited, #p-personal a.new:visited {
 }
 
 .mw-body a.external:visited {
-       color: #636; /* bug 3112 */
+       color: #636; /* T5112 */
 }
 
 .mw-body a.external:active {
@@ -82,7 +85,7 @@ a.new:visited, #p-personal a.new:visited {
 
 /* Inline Elements */
 img {
-       border: none;
+       border: 0;
        vertical-align: middle;
 }
 
@@ -91,7 +94,7 @@ hr {
        color: #a2a9b1;
        background-color: #a2a9b1;
        border: 0;
-       margin: .2em 0;
+       margin: 0.2em 0;
 }
 
 /* Structural Elements */
@@ -106,8 +109,8 @@ h6 {
        font-weight: normal;
        margin: 0;
        overflow: hidden;
-       padding-top: .5em;
-       padding-bottom: .17em;
+       padding-top: 0.5em;
+       padding-bottom: 0.17em;
        border-bottom: 1px solid #a2a9b1;
 }
 
@@ -123,7 +126,7 @@ h3,
 h4,
 h5,
 h6 {
-       border-bottom: none;
+       border-bottom: 0;
        font-weight: bold;
 }
 
@@ -146,17 +149,17 @@ h6 {
 /* Some space under the headers in the content area */
 h1,
 h2 {
-       margin-bottom: .6em;
+       margin-bottom: 0.6em;
 }
 
 h3,
 h4,
 h5 {
-       margin-bottom: .3em;
+       margin-bottom: 0.3em;
 }
 
 p {
-       margin: .4em 0 .5em 0;
+       margin: 0.4em 0 0.5em 0;
 }
 
 p img {
@@ -165,36 +168,41 @@ p img {
 
 ul {
        list-style-type: square;
-       margin: .3em 0 0 1.6em;
+       margin: 0.3em 0 0 1.6em;
        padding: 0;
 }
 
 ol {
-       margin: .3em 0 0 3.2em;
+       margin: 0.3em 0 0 3.2em;
        padding: 0;
        list-style-image: none;
 }
 
 li {
-       margin-bottom: .1em;
+       margin-bottom: 0.1em;
 }
 
 dt {
        font-weight: bold;
-       margin-bottom: .1em;
+       margin-bottom: 0.1em;
 }
 
 dl {
-       margin-top: .2em;
-       margin-bottom: .5em;
+       margin-top: 0.2em;
+       margin-bottom: 0.5em;
 }
 
 dd {
        margin-left: 1.6em;
-       margin-bottom: .1em;
+       margin-bottom: 0.1em;
 }
 
-pre, code, tt, kbd, samp, .mw-code {
+pre,
+code,
+tt,
+kbd,
+samp,
+.mw-code {
        /*
         * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
         * Specifying any valid, second value will trigger correct behavior without forcing a different font.
@@ -238,18 +246,18 @@ fieldset.nested {
 }
 
 legend {
-       padding: .5em;
+       padding: 0.5em;
        font-size: 95%;
 }
 
 form {
-       border: none;
+       border: 0;
        margin: 0;
 }
 
 textarea {
        width: 100%;
-       padding: .1em;
+       padding: 0.1em;
        display: block;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
index 7dbcd4d..2be3bb2 100644 (file)
 
 textarea {
        /* Support Firefox: Border rule required to override system appearance on Linux */
-       border: 1px solid #c0c0c0;
+       border: 1px solid #a2a9b1;
 }
 
 .editOptions {
-       background-color: #f0f0f0;
-       border: 1px solid #c0c0c0;
-       border-top: none;
+       background-color: #f8f9fa;
+       border: 1px solid #c8ccd1;
+       border-top: 0;
        padding: 1em 1em 1.5em 1em;
        margin-bottom: 2em;
 }
@@ -34,7 +34,7 @@ textarea {
        color: #000;
        font-weight: bold;
        margin: 2em 0 1em;
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        vertical-align: middle;
 }
 
@@ -49,9 +49,9 @@ textarea {
 }
 
 .firstHeading {
-       margin-bottom: .1em;
-       /* These two rules hack around bug 2013 (fix for more limited bug 11325).
-        * When bug 2013 is fixed properly, they should be removed. */
+       margin-bottom: 0.1em;
+       /* These two rules hack around T4013 (fix for more limited T13325).
+        * When T4013 is fixed properly, they should be removed. */
        line-height: 1.2em;
        padding-bottom: 0;
 }
diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.png b/resources/src/mediawiki.special/images/special.search/book-icon.png
new file mode 100644 (file)
index 0000000..07e3ec7
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/book-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.svg b/resources/src/mediawiki.special/images/special.search/book-icon.svg
new file mode 100644 (file)
index 0000000..6c3fa5f
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikisource-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <path d="M25.9612634,4.16259168 C25.9612634,3.05318514 26.8209364,1.88015355 27.8804771,1.5831456 C27.8804771,1.5831456 45.019739,-4.60039908 52.9189989,7.7430239 C52.8276879,7.87091176 53.3244937,43.6894771 53.0961715,43.801598 C38.1346526,39.2213878 27.8617804,43.2196252 27.8617804,43.2196252 C26.8121538,43.5410399 25.9612634,42.9124575 25.9612634,41.7928397 L25.9612634,4.16259168 Z" id="path-1"></path>
+        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="27.195528" height="43.7625003" fill="white">
+            <use xlink:href="#path-1"></use>
+        </mask>
+        <path d="M1.08483248,4.15020908 C1.08483248,3.04080253 1.94450542,1.86777094 3.00404616,1.57076299 C3.00404616,1.57076299 20.1433081,-4.61278168 28.0425679,7.73064129 C27.951257,7.85852916 28.4480627,43.6770945 28.2197406,43.7892154 C13.2582217,39.2090052 2.98534945,43.2072426 2.98534945,43.2072426 C1.93572291,43.5286573 1.08483248,42.9000749 1.08483248,41.7804571 L1.08483248,4.15020908 Z" id="path-3"></path>
+        <mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="27.195528" height="43.7625003" fill="white">
+            <use xlink:href="#path-3"></use>
+        </mask>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikisource">
+            <g id="Group-2" transform="translate(3.000000, 7.000000)">
+                <g id="Group">
+                    <rect id="Rectangle-3" fill="#000000" x="19.5269846" y="36.730429" width="15.1876547" height="9.47882039" rx="4.7394102"></rect>
+                    <rect id="Rectangle" fill="#000000" x="0" y="8.29396785" width="55.3264563" height="35.5455765" rx="2"></rect>
+                    <use id="Rectangle-2" stroke="#000000" mask="url(#mask-2)" stroke-width="4" fill="#FFFFFF" transform="translate(39.559027, 21.920348) scale(-1, 1) translate(-39.559027, -21.920348) " xlink:href="#path-1"></use>
+                    <use id="Rectangle-2" stroke="#000000" mask="url(#mask-4)" stroke-width="4" fill="#FFFFFF" xlink:href="#path-3"></use>
+                </g>
+                <path d="M5.94322419,22.653192 C15.2672322,19.3261075 22.9765332,23.990418 22.9765332,23.990418" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M5.94322419,16.7331266 C15.2672322,13.4060421 22.9765332,18.0703525 22.9765332,18.0703525" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M5.94322419,11.0846878 C15.2672322,7.75760327 22.9765332,12.4219137 22.9765332,12.4219137" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M5.94322419,28.5732575 C15.2672322,25.246173 22.9765332,29.9104834 22.9765332,29.9104834" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M5.94322419,34.4933229 C15.2672322,31.1662384 22.9765332,35.8305489 22.9765332,35.8305489" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M31.8963536,26.2991517 C41.2203616,22.7867165 48.9296626,27.2977748 48.9296626,27.2977748" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M31.8963536,32.2192172 C41.2203616,28.7067819 48.9296626,33.2178402 48.9296626,33.2178402" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
+                <path d="M32.1957977,11.8254134 C32.1957977,11.8254134 34.7092977,10.1127027 40.1604435,10.1337008 C45.6115894,10.1546989 47.8024685,11.8254134 47.8024685,11.8254134 L47.8024685,21.3219156 C47.8024685,21.3219156 43.8085467,20.1940894 39.931856,20.1940894 C36.0551653,20.1940894 32.1957977,21.3219156 32.1957977,21.3219156 L32.1957977,11.8254134 Z" id="Rectangle-4" fill="#000000"></path>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/course-icon.png b/resources/src/mediawiki.special/images/special.search/course-icon.png
new file mode 100644 (file)
index 0000000..9aad230
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/course-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/course-icon.svg b/resources/src/mediawiki.special/images/special.search/course-icon.svg
new file mode 100644 (file)
index 0000000..4fab1f3
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikiversity-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <path d="M1.79361627,13.3306367 C-0.140465792,12.4757391 -0.144839204,11.0916093 1.78234628,10.2397601 L23.5026391,0.639016247 C25.4304969,-0.213130142 28.5529839,-0.214539335 30.4952998,0.64399778 L52.8863837,10.5412429 C54.8204658,11.3961405 54.8248392,12.7802702 52.8976537,13.6321195 L31.1773609,23.2328633 C29.2495031,24.0850097 26.1270161,24.0864189 24.1847002,23.2278818 L1.79361627,13.3306367 Z" id="path-1"></path>
+        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="-5" y="-5" width="64" height="33.8718796">
+            <rect x="-4.66" y="-5" width="64" height="33.8718796" fill="white"></rect>
+            <use xlink:href="#path-1" fill="black"></use>
+        </mask>
+        <circle id="path-3" cx="7" cy="27" r="5"></circle>
+        <mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="-3" y="-3" width="16" height="16">
+            <rect x="-1" y="19" width="16" height="16" fill="white"></rect>
+            <use xlink:href="#path-3" fill="black"></use>
+        </mask>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikiversity">
+            <g id="Group-2" transform="translate(3.000000, 11.000000)">
+                <path d="M8,16 L47,16 L47,31.89585 C47,31.89585 42.2783874,38.5113751 27.5,38.8710875 C12.7216126,39.2307999 8,31.89585 8,31.89585 L8,22.2392885 L8,16 Z" id="Rectangle-3" fill="#000000"></path>
+                <g id="Rectangle">
+                    <use fill="#000000" fill-rule="evenodd" xlink:href="#path-1"></use>
+                    <use stroke="#F2F4F7" mask="url(#mask-2)" stroke-width="10" xlink:href="#path-1"></use>
+                </g>
+                <path d="M6.1310053,41.2112479 C5.27479784,42.0096083 10.4373919,43.6053602 11.2296387,43.6053602 C13.2555121,37.7460829 11.8321108,35.5517452 11.8321108,29.1181019 L11.8321108,21.2930015 C11.8321108,21.2930015 16.5515035,18.1566713 21.2216931,16.0206053 C25.8918828,13.8845392 31.215528,12.2538646 31.3550046,12.2096604 C32.1176432,11.9679575 31.2752162,9.09848389 30.5125776,9.34018676 C30.3644648,9.38712813 27.3667572,9.04545881 26.6057472,9.30621378 C24.4302064,10.0516482 11.7945726,16.3687146 9.43776817,19.1164347 C7.08096377,21.8641549 8.67910884,38.8352994 6.1310053,41.2112479 Z" id="Path-3" fill="#F2F4F7"></path>
+                <g id="Oval-3">
+                    <use fill="#000000" fill-rule="evenodd" xlink:href="#path-3"></use>
+                    <use stroke="#F2F4F7" mask="url(#mask-4)" stroke-width="6" xlink:href="#path-3"></use>
+                </g>
+                <path d="M1.13550659,38.2112479 C0.245905063,39.0096083 7.57084983,40.6053602 8.39399608,40.6053602 C9.78724127,36.7270479 9.71041095,34.4853149 9.49920479,31.5470605 C9.43416647,30.6422615 9.35638589,29.6714145 9.30486594,28.5663921 C9.27092907,27.8384991 9.24838677,27.052387 9.24838677,26.1885838 C9.24838677,21.7929074 8.92187195,20.3988432 10.0589683,18.8611032 C10.5891389,18.1441327 14.9624282,15.1566713 19.814766,13.0206053 C24.6671038,10.8845392 30.1983835,9.25386462 30.3432999,9.20966036 C31.1356832,8.96795749 30.2603996,6.09848389 29.4680164,6.34018676 C29.3141268,6.38712813 27.238504,7.04545881 26.4478128,7.30621378 C24.187421,8.05164822 9.84272127,11.7529088 7.39399608,14.500629 C4.94527088,17.2483492 3.78299204,35.8352994 1.13550659,38.2112479 Z" id="Path-3" fill="#000000"></path>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/definition-icon.png b/resources/src/mediawiki.special/images/special.search/definition-icon.png
new file mode 100644 (file)
index 0000000..b279f4e
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/definition-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/definition-icon.svg b/resources/src/mediawiki.special/images/special.search/definition-icon.svg
new file mode 100644 (file)
index 0000000..1d58906
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wiktionary-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <rect id="path-1" x="0" y="0" width="38.7837838" height="45.5813953" rx="3"></rect>
+        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="38.7837838" height="45.5813953" fill="white">
+            <use xlink:href="#path-1"></use>
+        </mask>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wiktionary">
+            <g id="Group" transform="translate(9.000000, 4.000000)">
+                <rect id="Rectangle-5" fill="#000000" x="2.21621622" y="4.55813953" width="38.7837838" height="44.4418605" rx="3"></rect>
+                <use id="Rectangle-5" stroke="#FFFFFF" mask="url(#mask-2)" stroke-width="4" fill="#000000" xlink:href="#path-1"></use>
+                <rect id="Rectangle-5" fill="#000000" x="2.21621622" y="2.27906977" width="3.32432432" height="45.5813953" rx="1.66216216"></rect>
+                <path d="M9.96584688,24.0254991 L12.5526201,16.7046287 L12.5953767,16.7046287 L15.1393934,24.0254991 L9.96584688,24.0254991 Z M11.4837056,14.8139535 L5.54054054,30.5109549 L7.61423481,30.5109549 L9.32449813,25.7842668 L15.7807422,25.7842668 L17.4482489,30.5109549 L19.6929695,30.5109549 L13.7284262,14.8139535 L11.4837056,14.8139535 Z M19.9922656,28.7521872 L19.9922656,30.5109549 L32.1351351,30.5109549 L32.1351351,28.7521872 L22.4080125,28.7521872 L31.8785956,16.5727212 L31.8785956,14.8139535 L20.7191275,14.8139535 L20.7191275,16.5727212 L29.484227,16.5727212 L19.9922656,28.7521872 Z" id="AZ" fill="#FFFFFF"></path>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/dna-icon.png b/resources/src/mediawiki.special/images/special.search/dna-icon.png
new file mode 100644 (file)
index 0000000..76ae7b9
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/dna-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/dna-icon.svg b/resources/src/mediawiki.special/images/special.search/dna-icon.svg
new file mode 100644 (file)
index 0000000..b6472d2
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikispecies-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <path d="M30.7731558,0.186194824 C30.7731558,0.186194824 35.1530541,17.902764 16.3205992,24.2966289 C-2.5118558,30.6904937 1.3758711,49.1033824 1.3758711,49.1033824" id="path-1"></path>
+        <path d="M30.7473572,49.159218 C30.7473572,49.159218 35.6539441,38.982551 16.3205992,25.0539186 C-3.01274582,11.1252862 1.37060607,0.169606006 1.37060607,0.169606006" id="path-2"></path>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikispecies">
+            <g id="Group-3" transform="translate(29.651065, 29.732290) rotate(-18.000000) translate(-29.651065, -29.732290) translate(3.651065, -0.267710)">
+                <g id="Group-2" transform="translate(-0.000000, 0.000000)">
+                    <path d="M16.0550183,26.1396841 L28.2093366,18.8733993" id="Line"></path>
+                    <path d="M8.04887438,16.7717325 L25.4345247,6.48465118" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
+                    <path d="M25.407947,53.9559038 L42.7935973,43.6688225" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
+                    <path d="M15.372315,23.3571115 L32.7579654,13.0700302" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
+                    <path d="M23.3476093,40.6564377 L35.5019275,33.3901529" id="Line"></path>
+                    <path d="M23.587979,44.4357028 L40.6040246,34.7578672" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
+                    <g id="Group" transform="translate(26.088934, 30.408062) rotate(-27.000000) translate(-26.088934, -30.408062) translate(10.088934, 5.408062)">
+                        <g id="Path-2">
+                            <use stroke="#FFFFFF" stroke-width="10" xlink:href="#path-1"></use>
+                            <use stroke="#000000" stroke-width="5" xlink:href="#path-1"></use>
+                        </g>
+                        <g id="Path-2">
+                            <use stroke="#FFFFFF" stroke-width="10" xlink:href="#path-2"></use>
+                            <use stroke="#000000" stroke-width="5" xlink:href="#path-2"></use>
+                        </g>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/image-icon.png b/resources/src/mediawiki.special/images/special.search/image-icon.png
new file mode 100644 (file)
index 0000000..1ebbc74
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/image-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/image-icon.svg b/resources/src/mediawiki.special/images/special.search/image-icon.svg
new file mode 100644 (file)
index 0000000..b68762e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>commons-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="commons">
+            <g id="Group" transform="translate(7.000000, 10.000000)">
+                <rect id="Rectangle-3" fill="#000000" x="0" y="7" width="47" height="32" rx="3"></rect>
+                <path d="M12.5575779,0.983966166 C12.6781522,0.440536658 13.228439,0 13.7774775,0 L33.4411152,0 C33.9942728,0 34.5376987,0.428179934 34.6610148,0.983966166 L36.1940854,7.89352671 C36.3146597,8.43695622 35.9679607,8.87749288 35.4086105,8.87749288 L11.8099821,8.87749288 C11.255602,8.87749288 10.9011913,8.44931294 11.0245073,7.89352671 L12.5575779,0.983966166 Z" id="Rectangle-3" fill="#000000"></path>
+                <ellipse id="Oval" stroke="#FFFFFF" stroke-width="3" cx="23.1981132" cy="23.2091168" rx="10.1981132" ry="10.2091168"></ellipse>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/news-icon.png b/resources/src/mediawiki.special/images/special.search/news-icon.png
new file mode 100644 (file)
index 0000000..6b79590
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/news-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/news-icon.svg b/resources/src/mediawiki.special/images/special.search/news-icon.svg
new file mode 100644 (file)
index 0000000..996bc84
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikinews-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <rect id="path-1" x="0" y="0" width="40.3125" height="44.3773585" rx="3"></rect>
+        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="40.3125" height="44.3773585" fill="white">
+            <use xlink:href="#path-1"></use>
+        </mask>
+    </defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikinews">
+            <g id="Group-2" transform="translate(7.000000, 2.000000)">
+                <g id="Group">
+                    <use id="Rectangle" stroke="#000000" mask="url(#mask-2)" stroke-width="8" xlink:href="#path-1"></use>
+                    <rect id="Rectangle-2" fill="#000000" x="5.87890625" y="7.10037736" width="14.2773438" height="15.0883019" rx="1"></rect>
+                    <path d="M23.9355469,8.32075472 L33.2060822,8.32075472" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M23.9355469,13.8679245 L33.2060822,13.8679245" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M23.9355469,19.4150943 L33.2060822,19.4150943" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M22.5550667,30.509434 L33.1506715,30.509434" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M7.17212403,30.509434 L17.1811761,30.509434" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M7.17212403,35.1320755 L17.1811761,35.1320755" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M22.5550667,35.1320755 L33.1506715,35.1320755" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                    <path d="M7.12514628,24.9622642 L33.2060822,24.9622642" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
+                </g>
+                <path d="M42.1813257,4.62264151 C43.7380365,4.62264151 45,5.85586295 45,7.39864403 L45,46.2239975 C45,47.7571413 43.7493218,49 42.1813257,49 L7.50617429,49 C5.94946346,49 4.6875,47.7667786 4.6875,46.2239975" id="Rectangle" stroke="#000000" stroke-width="4"></path>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/quotation-icon.png b/resources/src/mediawiki.special/images/special.search/quotation-icon.png
new file mode 100644 (file)
index 0000000..9d3ade3
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/quotation-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/quotation-icon.svg b/resources/src/mediawiki.special/images/special.search/quotation-icon.svg
new file mode 100644 (file)
index 0000000..0a24b3e
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikiquote-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikiquote" fill="#000000">
+            <path d="M25.6795093,50 L25.6795093,29.5241523 L16.904146,29.5241523 C16.904146,26.2444546 17.52462,23.4744813 18.7655867,21.2141491 C20.0065533,18.9538169 22.3111712,17.2475134 25.6795093,16.0951872 L25.6795093,7.31982385 C22.9316545,7.67438575 20.383279,8.49429786 18.0343064,9.77958478 C15.6853338,11.0648717 13.6687932,12.6825361 11.9846241,14.6326266 C10.300455,16.5827171 8.99302762,18.8430154 8.06230261,21.4135892 C7.13157761,23.984163 6.71054166,26.7319766 6.79918214,29.6571123 L6.79918214,50 L25.6795093,50 Z M54,50 L54,29.5241523 L45.2246367,29.5241523 C45.2246367,26.2444546 45.8451107,23.4744813 47.0860774,21.2141491 C48.3270441,18.9538169 50.6316619,17.2475134 54,16.0951872 L54,7.31982385 C51.2521452,7.67438575 48.7037697,8.49429786 46.3547971,9.77958478 C44.0058245,11.0648717 41.9892839,12.6825361 40.3051148,14.6326266 C38.6209458,16.5827171 37.3135183,18.8430154 36.3827933,21.4135892 C35.4520683,23.984163 35.0310324,26.7319766 35.1196729,29.6571123 L35.1196729,50 L54,50 Z" id="“"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/textbook-icon.png b/resources/src/mediawiki.special/images/special.search/textbook-icon.png
new file mode 100644 (file)
index 0000000..0de2821
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/textbook-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/textbook-icon.svg b/resources/src/mediawiki.special/images/special.search/textbook-icon.svg
new file mode 100644 (file)
index 0000000..52446b8
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikibooks-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikibooks">
+            <g id="Group-2" transform="translate(7.000000, 6.000000)">
+                <rect id="Rectangle" fill="#000000" x="0" y="0" width="13.4872062" height="46.9333333" rx="1"></rect>
+                <rect id="Rectangle" fill="#000000" x="16.3773218" y="0" width="13.4872062" height="46.9333333" rx="1"></rect>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="18.3040656" y="3.2" width="9.63371872" height="2.13333333" rx="1"></rect>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="18.3040656" y="7.46666667" width="9.63371872" height="2.13333333" rx="1"></rect>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="18.3040656" y="42.6666667" width="9.63371872" height="2.13333333" rx="1"></rect>
+                <g id="Group" transform="translate(41.629197, 24.582549) rotate(-15.000000) translate(-41.629197, -24.582549) translate(36.629197, 2.082549)">
+                    <rect id="Rectangle" fill="#000000" x="-9.14823772e-14" y="1.0658141e-14" width="9.63371872" height="44.8" rx="1"></rect>
+                    <rect id="Rectangle-2" fill="#FFFFFF" x="1.37624553" y="3.05454545" width="6.88122765" height="2.03636364" rx="1"></rect>
+                    <rect id="Rectangle-2" fill="#FFFFFF" x="4.12873659" y="18.3272727" width="2.0643683" height="8.14545455" rx="1"></rect>
+                    <rect id="Rectangle-2" fill="#FFFFFF" x="1.37624553" y="40.7272727" width="6.88122765" height="2.03636364" rx="1"></rect>
+                </g>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="1.92674374" y="42.6666667" width="9.63371872" height="2.13333333" rx="1"></rect>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="3.85348749" y="21.3333333" width="5.78023123" height="6.4" rx="1"></rect>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="20.2308093" y="21.3333333" width="5.78023123" height="6.4" rx="1"></rect>
+                <rect id="Rectangle-2" fill="#FFFFFF" x="1.92674374" y="2.13333333" width="9.63371872" height="6.4" rx="1"></rect>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/travel-icon.png b/resources/src/mediawiki.special/images/special.search/travel-icon.png
new file mode 100644 (file)
index 0000000..9540e5b
Binary files /dev/null and b/resources/src/mediawiki.special/images/special.search/travel-icon.png differ
diff --git a/resources/src/mediawiki.special/images/special.search/travel-icon.svg b/resources/src/mediawiki.special/images/special.search/travel-icon.svg
new file mode 100644 (file)
index 0000000..c61da34
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
+    <title>wikivoyage-icon</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="wikivoyage">
+            <circle id="Oval" stroke="#000000" stroke-width="5" cx="30.5" cy="29.5" r="22.5"></circle>
+            <polygon id="Line" fill="#000000" points="7.94117647 26 51.7647059 26 51.7647059 21 7.94117647 21"></polygon>
+            <polygon id="Line" fill="#000000" points="11 41 51.7647059 41 51.7647059 36 11 36"></polygon>
+            <path d="M33.3291453,53.239081 C33.3291453,53.239081 36.1487341,50.645866 37.4655139,48.564933 C41.2810931,42.5350981 43.5882353,36.2426616 43.5882353,29.9411765 C43.5882353,23.6228427 41.2687791,17.4752409 37.4345128,11.7108181 C36.1106408,9.72051335 34.6944337,8.91628537 33.2755423,7.32564334 C32.4145319,6.36041143 26.8207622,5.36041143 25.9597518,6.32564334 C24.5408604,7.91628537 23.1246533,9.72051335 21.8007813,11.7108181 C17.9665151,17.4752409 15.6470588,23.6228427 15.6470588,29.9411765 C15.6470588,36.2426616 17.954201,42.5350981 21.7697802,48.564933 C23.08656,50.645866 26.9061488,53.239081 26.9061488,53.239081 L33.3291453,53.239081 Z M25.9949257,45.8913313 C22.6413872,40.5916685 20.6470588,35.1523918 20.6470588,29.9411765 C20.6470588,24.7468098 22.6290732,19.4935807 25.9639246,14.4799765 C27.1264205,12.7322841 28.3724952,11.1396672 29.6176471,9.73642318 C30.8627989,11.1396672 32.1088737,12.7322841 33.2713695,14.4799765 C36.6062209,19.4935807 38.5882353,24.7468098 38.5882353,29.9411765 C38.5882353,35.1523918 36.5939069,40.5916685 33.2403685,45.8913313 C32.0874519,47.7133081 30.8528466,49.389908 29.6176471,50.8822433 C28.3824475,49.389908 27.1478422,47.7133081 25.9949257,45.8913313 Z" id="Oval" fill="#000000"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
index 59a03f3..7f54b90 100644 (file)
@@ -43,7 +43,7 @@
 }
 
 .mw-apisandbox-help-field:last-child {
-       border-bottom: none;
+       border-bottom: 0;
 }
 
 .mw-apisandbox-optionalWidget {
index ad58583..97659ed 100644 (file)
                                                                                booklet.setPage( '|results|' );
                                                                        } ).setDisabled( !paramsAreForced ) ).$element,
                                                                        new OO.ui.PopupButtonWidget( {
+                                                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                                                framed: false,
                                                                                icon: 'info',
                                                                                popup: {
 
                                if ( page.tokenWidget ) {
                                        k = page.apiModule + page.tokenWidget.paramInfo.name;
-                                       tokenWait[ k ] = page.tokenWidget.fetchToken()
+                                       tokenWait[ k ] = page.tokenWidget.fetchToken();
+                                       tokenWait[ k ]
                                                .done( success.bind( page.tokenWidget, k ) )
                                                .fail( failure.bind( page.tokenWidget, k ) );
                                }
 
                Util.fetchModuleInfo( this.apiModule )
                        .done( function ( pi ) {
-                               var prefix, i, j, dl, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
+                               var prefix, i, j, descriptionContainer, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
                                        items = [],
                                        deprecatedItems = [],
                                        buttons = [],
 
                                if ( pi.helpurls.length ) {
                                        buttons.push( new OO.ui.PopupButtonWidget( {
+                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                label: mw.message( 'apisandbox-helpurls' ).text(),
                                                icon: 'help',
                                                popup: {
 
                                if ( pi.examples.length ) {
                                        buttons.push( new OO.ui.PopupButtonWidget( {
+                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                label: mw.message( 'apisandbox-examples' ).text(),
                                                icon: 'code',
                                                popup: {
                                                        that.tokenWidget = widget;
                                                }
 
-                                               dl = $( '<dl>' );
-                                               dl.append( $( '<dd>', {
+                                               descriptionContainer = $( '<div>' );
+                                               descriptionContainer.append( $( '<div>', {
                                                        addClass: 'description',
                                                        append: Util.parseHTML( pi.parameters[ i ].description )
                                                } ) );
                                                if ( pi.parameters[ i ].info && pi.parameters[ i ].info.length ) {
                                                        for ( j = 0; j < pi.parameters[ i ].info.length; j++ ) {
-                                                               dl.append( $( '<dd>', {
+                                                               descriptionContainer.append( $( '<div>', {
                                                                        addClass: 'info',
                                                                        append: Util.parseHTML( pi.parameters[ i ].info[ j ] )
                                                                } ) );
 
                                                        case 'limit':
                                                                if ( pi.parameters[ i ].highmax !== undefined ) {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: [
                                                                                        Util.parseMsg(
                                                                                ]
                                                                        } ) );
                                                                } else {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: [
                                                                                        Util.parseMsg( 'api-help-param-limit', pi.parameters[ i ].max ),
                                                                        tmp += 'max';
                                                                }
                                                                if ( tmp !== '' ) {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: Util.parseMsg(
                                                                                        'api-help-param-integer-' + tmp,
                                                                );
                                                        }
                                                        if ( tmp.length ) {
-                                                               dl.append( $( '<dd>', {
+                                                               descriptionContainer.append( $( '<div>', {
                                                                        addClass: 'info',
                                                                        append: Util.parseHTML( tmp.join( ' ' ) )
                                                                } ) );
                                                        } ), {
                                                                align: 'inline',
                                                                classes: [ 'mw-apisandbox-help-field' ],
-                                                               label: dl
+                                                               label: descriptionContainer
                                                        }
                                                );
 
index a30a15d..ae557b4 100644 (file)
@@ -2,7 +2,7 @@
  * Styling for Special:Block
  */
 
-label[for="mw-input-wpConfirm"] {
+label[for='mw-input-wpConfirm'] {
        font-weight: bold;
 }
 
index 4b8eced..3ad8005 100644 (file)
@@ -16,7 +16,8 @@
 }
 
 /* Common for Special:Allpages and Special:PrefixIndex */
-.mw-allpages-body, .mw-prefixindex-body {
+.mw-allpages-body,
+.mw-prefixindex-body {
        columns: 22em 3;
        -moz-columns: 22em 3;
        -webkit-columns: 22em 3;
index 163e85d..0fa6610 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var $preftoc, $preferences, $fieldsets, labelFunc,
+               var $preftoc, $preferences, $fieldsets, labelFunc, previousTab,
                        $tzSelect, $tzTextbox, $localtimeHolder, servertime, allowCloseWindow,
                        convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
 
                        updateTimezoneSelection();
                }
 
-               // Preserve the tab after saving the preferences
-               // Not using cookies, because their deletion results are inconsistent.
-               // Not using jStorage due to its enormous size (for this feature)
-               if ( window.sessionStorage ) {
-                       if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
-                               switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
-                       }
+               // Restore the active tab after saving the preferences
+               previousTab = mw.storage.session.get( 'mwpreferences-prevTab' );
+               if ( previousTab ) {
+                       switchPrefTab( previousTab, 'noHash' );
                        // Deleting the key, the tab states should be reset until we press Save
-                       sessionStorage.removeItem( 'mediawikiPreferencesTab' );
-
-                       $( '#mw-prefs-form' ).submit( function () {
-                               var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
-                               sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
-                       } );
+                       mw.storage.session.remove( previousTab );
                }
 
+               $( '#mw-prefs-form' ).on( 'submit', function () {
+                       var value = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+                       mw.storage.session.set( 'mwpreferences-prevTab', value );
+               } );
+
                // Check if all of the form values are unchanged
                function isPrefsChanged() {
                        var inputs = $( '#mw-prefs-form :input[name]' ),
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js b/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js
new file mode 100644 (file)
index 0000000..3810ac1
--- /dev/null
@@ -0,0 +1,80 @@
+( function ( mw, $ ) {
+
+       var api = new mw.Api(),
+               pageUrl = new mw.Uri(),
+               imagesText = new mw.Message( mw.messages, 'searchprofile-images' ),
+               moreResultsText = new mw.Message( mw.messages, 'search-interwiki-more' );
+
+       function itemTemplate( results ) {
+
+               var resultOutput = '', i, result, imageCaption, imageThumbnailSrc;
+
+               for ( i = 0; i < results.length; i++ ) {
+                       result = results[ i ],
+                       imageCaption = mw.html.element( 'span', { 'class': 'iw-result__mini-gallery__caption' }, result.title );
+                       imageThumbnailSrc = ( result.thumbnail ) ? result.thumbnail.source : '';
+                       resultOutput += '<div class="iw-result__mini-gallery">' +
+                                               /* escaping response content */
+                                               mw.html.element( 'a', {
+                                                       href: '/wiki/' + result.title,
+                                                       'class': 'iw-result__mini-gallery__image',
+                                                       style: 'background-image: url(' + imageThumbnailSrc + ');'
+                                               }, new mw.html.Raw( imageCaption ) ) +
+                                       '</div>';
+               }
+
+               return resultOutput;
+       }
+
+       function itemWrapperTemplate( pageQuery, itemTemplateOutput ) {
+
+               return '<li class="iw-resultset iw-resultset--image" data-iw-resultsset-pos="0">' +
+                               '<div class="iw-result__header">' +
+                                       '<span class="iw-result__icon iw-result__icon--image"></span>' +
+                                       '<strong>' + imagesText.escaped() + '</strong>' +
+                               '</div>' +
+                               '<div class="iw-result__content">' +
+                               /* template output has been sanitized by mw.html.element */
+                               itemTemplateOutput +
+                               '</div>' +
+                               '<div class="iw-result__footer">' +
+                                       '<a href="/w/index.php?title=Special:Search&search=' + encodeURIComponent( pageQuery ) + '&fulltext=1&profile=images">' +
+                                               moreResultsText.escaped() +
+                                       '</a>' +
+                               '</div>' +
+                       '</li>';
+
+       }
+
+       api.get( {
+               action: 'query',
+               generator: 'search',
+               gsrsearch: pageUrl.query.search,
+               gsrnamespace: mw.config.get( 'wgNamespaceIds' ).file,
+               gsrlimit: 3,
+               prop: 'pageimages',
+               pilimit: 3,
+               piprop: 'thumbnail',
+               pithumbsize: 300,
+               formatversion: 2
+       } )
+       .done( function ( resp ) {
+               var results = ( resp.query && resp.query.pages ) ? resp.query.pages : false,
+                       multimediaWidgetTemplate;
+
+               if ( !results ) {
+                       return;
+               }
+
+               results.sort( function( a, b ) {
+                       return b.index - a.index;
+               } );
+
+               multimediaWidgetTemplate = itemWrapperTemplate( pageUrl.query.search, itemTemplate( results ) );
+               /* we really only need to wait for document ready for DOM manipulation */
+               $( function () {
+                       $( '.iw-results' ).prepend( multimediaWidgetTemplate );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less b/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less
new file mode 100644 (file)
index 0000000..5504883
--- /dev/null
@@ -0,0 +1,226 @@
+/* interwiki search results */
+/*==========================*/
+
+#mw-interwiki-results {
+       float: right;
+       width: 30%;
+}
+
+.iw-headline {
+       font-weight: bold;
+       font-size: 1rem;
+       font-size: 16px;
+       opacity: 0.7;
+}
+
+.iw-results {
+       list-style: none;
+       margin: 0;
+}
+
+.iw-resultset {
+       margin-bottom: 1.2em;
+       background-color: #f2f4f7;
+       vertical-align: top;
+       width: 100%;
+       float: left;
+       list-style-type: none;
+}
+
+/* clearfix */
+.iw-result:after {
+       visibility: hidden;
+       display: block;
+       font-size: 0;
+       content: ' ';
+       clear: both;
+       height: 0;
+}
+
+* html .interwiki-result { /* IE6 */
+       zoom: 1;
+}
+*:first-child + html .iw-resultset { /* IE7 */
+       zoom: 1;
+}
+
+/* padding each .iw-resultset section seperately.
+This allows us greater flexibility in the design.
+For example changing the background color on the
+header and footer. */
+.iw-result__header,
+.iw-result__title,
+.iw-result__content,
+.iw-result__footer {
+       padding: 0.25em 0.85em;
+}
+
+/* definition titles appear inline,
+to resemble a traditional dictionary definition */
+.iw-resultset--definition .iw-result__title {
+       display: inline;
+       padding: 0;
+}
+
+.iw-resultset > div:first-child {
+       padding-top: 0.85em;
+}
+
+.iw-resultset > div:last-child {
+       padding-bottom: 0.85em;
+}
+
+.iw-result__title {
+       font-size: 16px; /* rem fallback */
+       font-size: 1rem;
+}
+
+.iw-result__title a.extiw {
+       color: #252525;
+       font-weight: bold;
+}
+
+.iw-result__content:after { /* clearfix */
+       visibility: hidden;
+       display: block;
+       font-size: 0;
+       content: ' ';
+       clear: both;
+       height: 0;
+}
+
+.iw-result__footer {
+       float: right;
+}
+
+.iw-result__icon {
+       display: inline-block;
+       width: 24px;
+       height: 24px;
+       vertical-align: middle;
+       margin-right: 0.25em;
+       background: url( images/special.search/definition-icon.svg ) no-repeat 0 0;
+       background-size: 100% 100%;
+}
+
+@interwikiContentTypes: definition, travel, quotation, book, course, news, textbook, image;
+
+.generate-iwIcons();
+
+.generate-iwIcons( @i:1 ) when ( @i =< length( @interwikiContentTypes ) ) {
+       @iwIcon: extract( @interwikiContentTypes, @i );
+
+       .iw-result__icon--@{iwIcon} {
+               /*  stylelint-disable-next-line function-url-quotes */
+               background-image: url( 'images/special.search/@{iwIcon}-icon.png' );
+               /*  stylelint-disable-next-line function-url-quotes */
+               background-image: url( 'images/special.search/@{iwIcon}-icon.svg' );
+       }
+
+       .generate-iwIcons( @i + 1 );
+}
+
+/* image search result */
+.iw-result__mini-gallery {
+       position: relative;
+       float: left;
+       width: 60%;
+       height: 200px;
+       box-sizing: border-box;
+       padding: 0.25rem;
+}
+
+/* second and third images are small */
+.iw-result__mini-gallery:nth-child( 2 ),
+.iw-result__mini-gallery:nth-child( 3 ) { /* stylelint-disable-line indentation */
+       width: 40%;
+       height: 100px;
+}
+
+.iw-result__mini-gallery__image {
+       display: block;
+       position: relative;
+       width: 100%;
+       height: 100%;
+       background-size: cover;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+
+.iw-result__mini-gallery__image > .iw-result__mini-gallery__caption { /* image gallery text */
+       visibility: hidden;
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       text-align: center;
+       color: #fff;
+       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 );
+}
+
+.iw-result__mini-gallery__image:hover > .iw-result__mini-gallery__caption {
+       visibility: visible;
+}
+
+/* different types of interwiki result boxes */
+/* quotation box */
+.iw-resultset--quotation .iw-result__content {
+       border-left: 4px solid #afb1b5;
+       margin-left: 1em;
+       padding-top: 0;
+       margin-top: 0.25em;
+}
+.iw-resultset--quotation .iw-result__title {
+       margin-left: 1em;
+}
+.iw-result--quotation .iw-result__title:before {
+       content: ' — ';
+       display: inline-block;
+}
+.iw-result--quotation .iw-result__footer {
+       text-align: right;
+}
+
+/* no results
+span the interwiki results across the bottom of the page.
+*/
+
+.mw-search-nonefound ~ #mw-search-interwiki {
+       width: 100%;
+}
+
+.mw-search-nonefound ~ #mw-search-interwiki .iw-resultset {
+       width: 30%;
+       max-width: 300px;
+       margin-left: 0.5em;
+       margin-right: 0.5em;
+}
+
+/* mobile */
+/* stylelint-disable declaration-no-important */
+@media only screen and ( max-width: 768px ) {
+       #mw-interwiki-results {
+               width: 100%;
+       }
+       .mw-search-results {
+               max-width: none !important;
+       }
+       .iw-resultset {
+               width: 45% !important;
+               margin-left: 0.5em !important;
+               margin-right: 0.5em !important;
+       }
+
+}
+
+@media only screen and ( max-width: 600px ) {
+       .iw-resultset {
+               width: 100% !important;
+               margin-left: 0 !important;
+               margin-right: 0 !important;
+               max-width: none !important;
+       }
+}
+/* stylelint-enable declaration-no-important */
index ebe9ed9..89f5132 100644 (file)
@@ -15,7 +15,7 @@
        display: inline !ie;
 }
 .searchresults {
-       margin: 1em 0 1em .4em;
+       margin: 1em 0 1em 0.4em;
 }
 /* needs extra specificity to override `.mw-body p` selector */
 .mw-body .mw-search-nonefound {
 .mw-search-nonefound + .mw-search-interwiki-header {
        margin-top: 0;
 }
-.searchresult {
-       font-size: 95%;
-       max-width: 38em;
-}
+
 .mw-search-results {
-       margin-left: 0;
+       margin: 0;
        float: left;
+       max-width: 60%;
 }
 .mw-search-visualclear {
        clear: both;
        float: left;
        width: 100%;
 }
+
+/* Advanced options menu */
+/*==========================*/
+
 #mw-searchoptions {
        margin: 0;
        padding: 0.5em 0.75em 0.75em 0.75em;
        padding-left: 6em;
        font-size: 85%;
 }
+
 #mw-search-interwiki {
        float: right;
        width: 18em;
        border: 1px solid #a2a9b1;
        margin-top: 2ex;
 }
+
 .searchalttitle,
 #mw-search-interwiki li {
        font-size: 95%;
        background-color: #eaecf0;
        border-top: 1px solid #c8ccd1;
 }
+
 .searchdidyoumean {
        font-size: 127%;
        margin-top: 0.8em;
index f818096..0ddf7fe 100644 (file)
                                // Output result
                                if ( $( '#wpDestFile' ).length ) {
                                        // Call decodeURIComponent function to remove possible URL-encoded characters
-                                       // from the file name (bug 30390). Especially likely with upload-form-url.
+                                       // from the file name (T32390). Especially likely with upload-form-url.
                                        // decodeURIComponent can throw an exception if input is invalid utf-8
                                        try {
                                                $( '#wpDestFile' ).val( decodeURIComponent( fname ) );
index 283df85..626a7e8 100644 (file)
@@ -3,7 +3,7 @@
  */
 .mw-destfile-warning {
        border: 1px solid #fde29b;
-       padding: .5em 1em;
+       padding: 0.5em 1em;
        margin-bottom: 1em;
        color: #705000;
        background-color: #fdf1d1;
index d65b284..93ea294 100644 (file)
@@ -1,42 +1,42 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-editbutton-bold {
-       .background-image("images/@{button-bold}");
+       .background-image('images/@{button-bold}');
 }
 
 #mw-editbutton-italic {
-       .background-image("images/@{button-italic}");
+       .background-image('images/@{button-italic}');
 }
 
 #mw-editbutton-link {
-       .background-image("images/@{button-link}");
+       .background-image('images/@{button-link}');
 }
 
 #mw-editbutton-extlink {
-       .background-image("images/@{button-extlink}");
+       .background-image('images/@{button-extlink}');
 }
 
 #mw-editbutton-headline {
-       .background-image("images/@{button-headline}");
+       .background-image('images/@{button-headline}');
 }
 
 #mw-editbutton-image {
-       .background-image("images/@{button-image}");
+       .background-image('images/@{button-image}');
 }
 
 #mw-editbutton-media {
-       .background-image("images/@{button-media}");
+       .background-image('images/@{button-media}');
 }
 
 #mw-editbutton-nowiki {
-       .background-image("images/@{button-nowiki}");
+       .background-image('images/@{button-nowiki}');
 }
 
 // Who decided to make only this single one different than the name of the data item?
 #mw-editbutton-signature {
-       .background-image("images/@{button-sig}");
+       .background-image('images/@{button-sig}');
 }
 
 #mw-editbutton-hr {
-       .background-image("images/@{button-hr}");
+       .background-image('images/@{button-hr}');
 }
index ff38d0d..8e97c3e 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Helpers
 .mixin-mw-ui-anchor-styles( @mainColor ) {
@@ -29,7 +29,6 @@ The anchor base type can be applied to `a` elements when a basic context styling
 having to assign it as a button type. `.mw-ui-anchor` only changes the text color, and should not be used in combination
 with other base classes, such as `.mw-ui-button`.
 
-
 Markup:
 <a href="#" class="mw-ui-anchor mw-ui-progressive">Progressive</a>
 <a href="#" class="mw-ui-anchor mw-ui-destructive">Destructive</a>
index 85795f4..abe7c46 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Buttons
 //
 //
 // Styleguide 2.1.
 .mw-ui-button {
-       // Inherit the font rather than apply user agent stylesheet (bug 70072)
+       // Inherit the font rather than apply user agent stylesheet (T72072)
        font-family: inherit;
        font-size: 1em;
        // Container layout
        display: inline-block;
        min-width: 4em;
        max-width: 28.75em; // equivalent to 460px, @see T95367
-       padding: .5em 1em;
+       padding: 0.546875em 1em;
+       line-height: 1.286;
        margin: 0;
        border-radius: @borderRadius;
        .box-sizing( border-box );
@@ -43,7 +44,7 @@
 
        // IE 6 & 7 hack
        // https://stackoverflow.com/a/5838575/365238
-       *display: inline;
+       *display: inline; /* stylelint-disable-line declaration-block-no-duplicate-properties */
        zoom: 1;
 
        // Ensure that buttons and inputs are nicely aligned when they have differing heights
        }
 }
 
+input.mw-ui-button,
+button.mw-ui-button {
+       // Buttons in Firefox have extra height
+       &::-moz-focus-inner {
+               margin-top: -1px;
+               margin-bottom: -1px;
+       }
+}
+
 a.mw-ui-button {
        text-decoration: none;
 
@@ -219,12 +229,6 @@ a.mw-ui-button {
        &:focus {
                text-decoration: none;
        }
-
-       // a-tags behave different to inputs if the line-height attribute is inherited
-       // from another element (e.g. mw-body-content). They appear bigger as input
-       // tags. See Bug T116427. To fix that, apply the correct line-height (used
-       // for inputs) to a-tags, too.
-       line-height: normal;
 }
 
 // Button groups
index b0fbf51..2ca20a5 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Checkbox
 //
        display: table;
 
        * {
-               // reset font sizes (see bug 72727)
+               // reset font sizes (see T74727)
                font: inherit;
                vertical-align: middle;
        }
 
-       input[type="checkbox"] {
+       input[type='checkbox'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
-               // Render "on top of" the label, so that it's still clickable (T98905)
+               // Render *on top of* the label, so that it's still clickable (T98905)
                z-index: 1;
                position: relative;
                // ensure the invisible checkbox takes up the required width
                width: @checkboxSize;
                height: @checkboxSize;
-               // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
+               // This is needed for Firefox mobile (See T73750 to workaround default Firefox stylesheet)
                max-width: none;
                margin: 0 0.4em 0 0;
                display: table-cell;
@@ -68,7 +68,7 @@
                }
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/checked.svg', 'images/checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked checkbox
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled checkboxes have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        cursor: default;
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                }
 
                // disabled and checked checkboxes have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/checked_disabled.svg', 'images/checked_disabled.png' );
                }
        }
index 2327efc..d3c76d0 100644 (file)
@@ -1,8 +1,8 @@
 // Form elements and layouts
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // --------------------------------------------------------------------------
 // Layouts
@@ -66,7 +66,7 @@
        }
 
        // Override input styling just for checkboxes and radio inputs.
-       input[type="radio"] {
+       input[type='radio'] {
                display: inline;
                .box-sizing( content-box );
                width: auto;
index 0035601..f169d1b 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Mixins
 .mixin-mw-ui-icon-bgimage( @iconSvg, @iconPng ) {
@@ -90,4 +90,4 @@
        &.mw-ui-icon-small:before {
                background-size: 66.67% auto; // 66.67% of 24px equals 16px
        }
-}
\ No newline at end of file
+}
index 87ce7be..cc9c65a 100644 (file)
@@ -1,8 +1,8 @@
 // Inputs
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Text inputs
 //
        width: 100%;
        border: 1px solid @colorFieldBorder;
        border-radius: @borderRadius;
-       padding: 0.3em 0.3em 0.3em 0.6em;
+       padding: 0.625em 0.546875em 0.546875em;
        // necessary for smooth transition
        box-shadow: inset 0 0 0 0.1em #fff;
        font-family: inherit;
        font-size: inherit;
-       line-height: inherit;
+       line-height: 1.172em;
        vertical-align: middle;
 
        // Normalize & style placeholder text, see T139034
-       // Placeholder styles can't be grouped, otherwise they're ignored as invalid.
-
-       // Placeholder mixin
-       .mixin-placeholder() {
+       /* stylelint-disable indentation */
+       .mixin-placeholder( {
                color: @colorGray7;
-               font-style: italic;
-       }
-       // Firefox 4-18
-       &:-moz-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
-               opacity: 1;
-       }
-       // Firefox 19-
-       &::-moz-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
                opacity: 1;
-       }
-       // Internet Explorer 10-11
-       &:-ms-input-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
-       }
-       // WebKit, Blink, Edge
-       // Don't set `opacity < 1`, see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/3901363/
-       &::-webkit-input-placeholder { // stylelint-disable-line selector-no-vendor-prefix
-               .mixin-placeholder;
-       }
-       // W3C Standard Selectors Level 4
-       &:placeholder-shown {
-               .mixin-placeholder;
-       }
+       } );
+       /* stylelint-enable indentation */
 
        // Firefox: Remove red outline when `required` attribute set and invalid content.
        // See https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid
@@ -97,7 +73,7 @@
        }
 
        // Normalize styling for `<input type="search">`
-       &[type="search"] {
+       &[type='search'] {
                // Correct the odd appearance in Chrome and Safari 5
                -webkit-appearance: textfield;
 
                // Remove the inner padding and cancel buttons in Chrome on OS X and Safari on OS X
                &::-webkit-search-cancel-button,
                &::-webkit-search-decoration {
-                       -webkit-appearance: none;
+                       -webkit-appearance: none;
                }
        }
 }
@@ -127,7 +103,7 @@ textarea.mw-ui-input {
 // <button class="mw-ui-button mw-ui-progressive">Submit</button>
 //
 // Styleguide 1.2.
-input[type="number"],
+input[type='number'],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
@@ -167,4 +143,5 @@ input.mw-ui-input-large {
        font-size: 1.75em;
        font-weight: bold;
        line-height: 1.25em;
+       padding: 0.3673em 0.3265em 0.3265em;
 }
index 53c22b4..7cb2849 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Radio
 //
        line-height: @radioSize;
 
        * {
-               // reset font sizes (see bug 72727)
+               // reset font sizes (see T74727)
                font: inherit;
                vertical-align: middle;
        }
 
-       input[type="radio"] {
+       input[type='radio'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
                // ensure the invisible radio takes up the required width
                width: @radioSize;
                height: @radioSize;
-               // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
+               // This is needed for Firefox mobile (See T73750 to workaround default Firefox stylesheet)
                max-width: none;
                margin-right: 0.4em;
 
                // the pseudo before element of the label after the radio now looks like a radio
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/radio_checked.svg', 'images/radio_checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked radio
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled radios have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                        cursor: default;
                }
 
                // disabled and checked radios have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/radio_disabled.svg', 'images/radio_disabled.png' );
                }
        }
index 30593bf..a07aa68 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 /*
 Text & Anchors
@@ -33,4 +33,4 @@ Styleguide 6.1.
        &.mw-ui-destructive {
                color: @colorDestructive;
        }
-}
\ No newline at end of file
+}
index c9d6208..0589d39 100644 (file)
@@ -1,5 +1,5 @@
 /**
  * Provide Agora appearance for mw-ui-* classes.
  */
-@import "components/forms";
-@import "components/utilities";
+@import 'components/forms';
+@import 'components/utilities';
index 77f87f7..093c58b 100644 (file)
@@ -1,10 +1,11 @@
-@import "mediawiki.widgets.datetime.definitions";
+/* stylelint-disable no-duplicate-selectors */
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-calendarWidget {
        display: inline-block;
        position: relative;
        vertical-align: middle;
-       padding: .5em;
+       padding: 0.5em;
 
        &.mw-widgets-datetime-calendarWidget-dependent {
                display: block;
@@ -51,7 +52,7 @@
 
                        .oo-ui-buttonElement-button {
                                width: 100%;
-                               border: 1px dotted rgba( 255, 255, 255, 0.0 );
+                               border: 1px dotted rgba( 255, 255, 255, 0 );
                                .oo-ui-box-sizing( border-box );
                        }
 
index 84788d2..f205da3 100644 (file)
@@ -1,4 +1,5 @@
-@import "mediawiki.widgets.datetime.definitions";
+/* stylelint-disable no-duplicate-selectors */
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-dateTimeInputWidget {
        display: inline-block;
@@ -52,7 +53,6 @@
                margin: 0;
                background-color: #fff;
                color: #000;
-               border: solid 1px #ccc;
                box-shadow: inset 0 0 0 0 @progressive;
                border-radius: 0.1em;
                .oo-ui-transition(box-shadow @quick-ease);
@@ -92,7 +92,7 @@
                font-family: inherit;
                background-color: transparent;
                color: inherit;
-               border: none;
+               border: 0;
                box-shadow: none;
                text-align: center;
                vertical-align: middle;
index bdade36..fa45d5a 100644 (file)
@@ -25,7 +25,7 @@
 }
 
 .oo-ui-transition( @value1, @value2: X, ... ) {
-       @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after
+       @value: ~`'@{arguments}'.replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after, value-keyword-case
        -webkit-transition: @value;
        -moz-transition: @value;
        transition: @value;
index 2fe5d3d..395f80b 100644 (file)
@@ -5,6 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 
+/* stylelint-disable no-duplicate-selectors */
 @import 'mediawiki.mixins';
 
 @calendarWidth: 21em;
 .mw-widget-calendarWidget-header .mw-widget-calendarWidget-labelButton {
        margin: 0 auto;
        display: block;
-       width: @calendarWidth - 2*3em;
+       width: @calendarWidth - 2 * 3em;
 
        .oo-ui-buttonElement-button {
-               width: @calendarWidth - 2*3em;
+               width: @calendarWidth - 2 * 3em;
                text-align: center;
        }
 }
@@ -67,8 +68,8 @@
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
-               margin-top: -@calendarHeight;
-               margin-left: -@calendarWidth;
+               margin-top: -@calendarHeight; /* stylelint-disable-line value-keyword-case */
+               margin-left: -@calendarWidth; /* stylelint-disable-line value-keyword-case */
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
@@ -82,8 +83,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-top: 0 !important;
-               margin-left: 0 !important;
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
@@ -93,8 +94,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: -@calendarWidth !important;
-               margin-top: 0 !important;
+               margin-left: -@calendarWidth !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: 0 !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: -@calendarHeight !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: -@calendarHeight !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
index 7f5e608..0ec6a4c 100644 (file)
@@ -72,6 +72,8 @@
         *     while the widget is inactive. Should be as unambiguous as possible (for example, prefer to
         *     spell out the month, rather than rely on the order), even if that makes it longer. When not
         *     given, the default is language-specific.
+        * @cfg {boolean} [longDisplayFormat=false] If a custom displayFormat is not specified, use
+        *     unabbreviated day of the week and month names in the default language-specific displayFormat.
         * @cfg {string} [placeholderLabel=No date selected] Placeholder text shown when the widget is not
         *     selected. Default text taken from message `mw-widgets-dateinput-no-date`.
         * @cfg {string} [placeholderDateFormat] User-visible date format string displayed in the textual input
@@ -92,6 +94,7 @@
                // Config initialization
                config = $.extend( {
                        precision: 'day',
+                       longDisplayFormat: false,
                        required: false,
                        placeholderLabel: mw.msg( 'mw-widgets-dateinput-no-date' )
                }, config );
                this.inTextInput = 0;
                this.inputFormat = config.inputFormat;
                this.displayFormat = config.displayFormat;
+               this.longDisplayFormat = config.longDisplayFormat;
                this.required = config.required;
                this.placeholderLabel = config.placeholderLabel;
 
                        ll = localeData.longDateFormat( 'll' );
                        format = llll.replace( lll.replace( ll, '' ), '' );
 
+                       if ( this.longDisplayFormat ) {
+                               format = format.replace( 'MMM', 'MMMM' ).replace( 'ddd', 'dddd' );
+                       }
+
                        return format;
                }
        };
index ecfc880..4a59dae 100644 (file)
@@ -1,3 +1,5 @@
+@import 'mediawiki.mixins';
+
 .mw-widgets-stashedFileWidget {
        display: inline-block;
        vertical-align: middle;
        vertical-align: middle;
        position: relative;
        overflow: hidden;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
+       .box-sizing( border-box );
 
        > .mw-widgets-stashedFileWidget-label {
                line-height: 2.3em;
                margin: 0;
                overflow: hidden;
                white-space: nowrap;
-               -webkit-box-sizing: border-box;
-                  -moz-box-sizing: border-box;
-                               box-sizing: border-box;
+               .box-sizing( border-box );
                text-overflow: ellipsis;
                left: 0.5em;
                right: 2.375em;
        }
 
        .mw-widgets-stashedFileWidget-info {
-               border: none;
+               border: 0;
                background: none;
                display: block;
                height: 100%;
        }
 }
 
-
 .mw-widgets-stashedFileWidget-empty {
        .mw-widgets-stashedFileWidget-thumbnail-container {
                text-align: center;
index 3a4581d..9703eea 100644 (file)
                } );
 
                // If not found, run value through mw.Title to avoid treating a match as a
-               // mismatch where normalisation would make them matching (bug 48476)
+               // mismatch where normalisation would make them matching (T50476)
 
                pageExistsExact = (
                        Object.prototype.hasOwnProperty.call( pageData, this.getQueryValue() ) &&
index 86d4cfe..bbffe28 100644 (file)
@@ -48,7 +48,8 @@
                                }
                        }
 
-                       &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
+                       &.oo-ui-optionWidget-highlighted,
+                       &.oo-ui-optionWidget-selected {
                                &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
                                        opacity: 1;
                                }
@@ -71,7 +72,7 @@
                }
        }
 
-       &:not(&-withDescriptions) {
+       &:not( &-withDescriptions ) {
                .mw-widget-titleOptionWidget-description {
                        display: none;
                }
diff --git a/resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js b/resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js
new file mode 100644 (file)
index 0000000..70d7cb5
--- /dev/null
@@ -0,0 +1,163 @@
+/*!
+ * MediaWiki Widgets - UsersMultiselectWidget class.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * UsersMultiselectWidget can be used to input list of users in a single
+        * line.
+        *
+        * If used inside HTML form the results will be sent as the list of
+        * newline-separated usernames.
+        *
+        * @class
+        * @extends OO.ui.CapsuleMultiselectWidget
+        *
+        * @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] Number of results to show in autocomplete menu
+        * @cfg {string} [name] Name of input to submit results (when used in HTML forms)
+        */
+       mw.widgets.UsersMultiselectWidget = function MwWidgetsUsersMultiselectWidget( config ) {
+               // Config initialization
+               config = $.extend( {
+                       limit: 10
+               }, config, {
+                       // Because of using autocomplete (constantly changing menu), we need to
+                       // allow adding usernames, which do not present in the menu.
+                       allowArbitrary: true
+               } );
+
+               // Parent constructor
+               mw.widgets.UsersMultiselectWidget.parent.call( this, $.extend( {}, config, {} ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
+               // Properties
+               this.limit = config.limit;
+
+               if ( 'name' in config ) {
+                       // If used inside HTML form, then create hidden input, which will store
+                       // the results.
+                       this.hiddenInput = $( '<input>' )
+                               .attr( 'type', 'hidden' )
+                               .attr( 'name', config.name )
+                               .appendTo( this.$element );
+
+                       // Update with preset values
+                       this.updateHiddenInput();
+               }
+
+               this.menu = this.getMenu();
+
+               // Events
+               // Update contents of autocomplete menu as user types letters
+               this.$input.on( {
+                       keyup: this.updateMenuItems.bind( this )
+               } );
+               // When option is selected from autocomplete menu, update the menu
+               this.menu.connect( this, {
+                       select: 'updateMenuItems'
+               } );
+               // When list of selected usernames changes, update hidden input
+               this.connect( this, {
+                       change: 'updateHiddenInput'
+               } );
+
+               // API init
+               this.api = config.api || new mw.Api();
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.UsersMultiselectWidget, OO.ui.CapsuleMultiselectWidget );
+       OO.mixinClass( mw.widgets.UsersMultiselectWidget, OO.ui.mixin.PendingElement );
+
+       /* Methods */
+
+       /**
+        * Get currently selected usernames
+        *
+        * @return {Array} usernames
+        */
+       mw.widgets.UsersMultiselectWidget.prototype.getSelectedUsernames = function() {
+               return this.getItemsData();
+       };
+
+       /**
+        * Update autocomplete menu with items
+        *
+        * @private
+        */
+       mw.widgets.UsersMultiselectWidget.prototype.updateMenuItems = function() {
+               var inputValue = this.$input.val();
+
+               if ( inputValue === this.inputValue ) {
+                       // Do not restart api query if nothing has changed in the input
+                       return;
+               } else {
+                       this.inputValue = inputValue;
+               }
+
+               this.api.abort(); // Abort all unfinished api requests
+
+               if ( inputValue.length > 0 ) {
+                       this.pushPending();
+
+                       this.api.get( {
+                               action: 'query',
+                               list: 'allusers',
+                               // Prefix of list=allusers is case sensitive. Normalise first
+                               // character to uppercase so that "fo" may yield "Foo".
+                               auprefix: inputValue[ 0 ].toUpperCase() + inputValue.slice( 1 ),
+                               aulimit: this.limit
+                       } ).done( function( response ) {
+                               var suggestions = response.query.allusers,
+                                       selected = this.getSelectedUsernames();
+
+                               // Remove usernames, which are already selected from suggestions
+                               suggestions = suggestions.map( function ( user ) {
+                                       if ( selected.indexOf( user.name ) === -1 ) {
+                                               return new OO.ui.MenuOptionWidget( {
+                                                       data: user.name,
+                                                       label: user.name
+                                               } );
+                                       }
+                               } ).filter( function( item ) {
+                                       return item !== undefined;
+                               } );
+
+                               // Remove all items from menu add fill it with new
+                               this.menu.clearItems();
+
+                               // Additional check to prevent bug of autoinserting first suggestion
+                               // while removing user from the list
+                               if ( inputValue.length > 1 || suggestions.length > 1 ) {
+                                       this.menu.addItems( suggestions );
+                               }
+
+                               this.popPending();
+                       }.bind( this ) ).fail( this.popPending.bind( this ) );
+               } else {
+                       this.menu.clearItems();
+               }
+       };
+
+       /**
+        * If used inside HTML form, then update hiddenInput with list o
+        * newline-separated usernames.
+        *
+        * @private
+        */
+       mw.widgets.UsersMultiselectWidget.prototype.updateHiddenInput = function() {
+               if ( 'hiddenInput' in this ) {
+                       this.hiddenInput.val( this.getSelectedUsernames().join( '\n' ) );
+               }
+       };
+
+}( jQuery, mediaWiki ) );
index d5032da..37c0c9b 100644 (file)
@@ -51,7 +51,7 @@
        }
 
        // Pre-populate with fake ajax promises to save http requests for tokens
-       // we already have on the page via the user.tokens module (bug 34733).
+       // we already have on the page via the user.tokens module (T36733).
        promises[ defaultOptions.ajax.url ] = {};
        $.each( mw.user.tokens.get(), function ( key, value ) {
                // This requires #getToken to use the same key as user.tokens.
                /**
                 * Massage parameters from the nice format we accept into a format suitable for the API.
                 *
+                * NOTE: A value of undefined/null in an array will be represented by Array#join()
+                * as the empty string. Should we filter silently? Warn? Leave as-is?
+                *
                 * @private
                 * @param {Object} parameters (modified in-place)
                 * @param {boolean} useUS Whether to use U+001F when joining multi-valued parameters.
                'stashwrongowner',
                'stashnosuchfilekey'
        ];
-       mw.log.deprecate( mw.Api, 'errors', mw.Api.errors );
+       mw.log.deprecate( mw.Api, 'errors', mw.Api.errors, null, 'mw.Api.errors' );
 
        /**
         * @static
                'duplicate',
                'exists'
        ];
-       mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings );
+       mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings, null, 'mw.Api.warnings' );
 
 }( mediaWiki, jQuery ) );
index 40f4f52..dbf2b6b 100644 (file)
@@ -1,16 +1,33 @@
 /* OOUIHTMLForm styles */
 
-.mw-htmlform-ooui .mw-htmlform-submit-buttons {
-       margin-top: 1em;
+.mw-htmlform-ooui .mw-htmlform-field-HTMLCheckMatrix {
+       width: 100%;
 }
 
-.mw-htmlform-ooui .mw-htmlform-field-HTMLCheckMatrix,
-.mw-htmlform-ooui .mw-htmlform-matrix,
-.mw-htmlform-ooui .mw-htmlform-matrix tr {
-       width: 100%;
+.mw-htmlform-ooui .mw-htmlform-matrix {
+       border-spacing: 0;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix td {
+       padding: 0.35em 0.7em;
+       -webkit-transition: background-color 250ms;
+       -moz-transition: background-color 250ms;
+       transition: background-color 250ms;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:nth-child( even ) td {
+       background-color: #f8f9fa;
 }
 
-.mw-htmlform-ooui .mw-htmlform-matrix tr td.first {
+.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:not( :first-child ):hover td {
+       background-color: #eaecf0;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix tbody tr:first-child td {
+       background-color: #fff;
+}
+
+.mw-htmlform-ooui .mw-htmlform-matrix td.first {
        margin-right: 5%;
        width: 39%;
 }
@@ -23,3 +40,8 @@
        display: inline-block;
        margin-right: 1em;
 }
+
+.mw-htmlform-ooui .htmlform-tip,
+.mw-htmlform-ooui .mw-htmlform-submit-buttons {
+       margin-top: 1em;
+}
index 1b9d2fb..a36b379 100644 (file)
@@ -26,7 +26,7 @@ table.mw-htmlform-nolabel td.mw-label {
 }
 
 tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
+       text-align: left !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-icon-question {
@@ -44,9 +44,10 @@ tr.mw-htmlform-vertical-label td.mw-label {
        margin-left: 4px;
 }
 
-.mw-icon-question:lang(ar),
-.mw-icon-question:lang(fa),
-.mw-icon-question:lang(ur) {
+/* stylelint-disable indentation */
+.mw-icon-question:lang( ar ),
+.mw-icon-question:lang( fa ),
+.mw-icon-question:lang( ur ) {
        -webkit-transform: scaleX( -1 );
        -ms-transform: scaleX( -1 );
        transform: scaleX( -1 );
index 03df086..72ce9f0 100644 (file)
@@ -1,7 +1,7 @@
 .mw-upload-bookletLayout-filePreview {
        width: 100%;
        height: 1em;
-       background-color: #eee;
+       background-color: #eaecf0;
        background-size: cover;
        background-position: center center;
        padding: 1.5em;
@@ -20,7 +20,7 @@
 }
 
 .mw-upload-bookletLayout-filePreview .oo-ui-progressBarWidget {
-       border: none;
+       border: 0;
        border-radius: 0;
        background-color: transparent;
        position: absolute;
@@ -30,6 +30,5 @@
 }
 
 .mw-upload-bookletLayout-filePreview .oo-ui-progressBarWidget-bar {
-       background-color: #36c;
        height: 0.5em;
-}
\ No newline at end of file
+}
index 0c47dbe..95263ec 100644 (file)
                 *  override each other (`true`) or automagically convert them to an array (`false`).
                 */
                function Uri( uri, options ) {
-                       var prop,
+                       var prop, hrefCur,
+                               hasOptions = ( options !== undefined ),
                                defaultUri = getDefaultUri();
 
                        options = typeof options === 'object' ? options : { strictMode: !!options };
                                                this.query = {};
                                        }
                                }
+                       } else if ( hasOptions ) {
+                               // We didn't get a URI in the constructor, but we got options.
+                               hrefCur = typeof documentLocation === 'string' ? documentLocation : documentLocation();
+                               this.parse( hrefCur, options );
                        } else {
-                               // If we didn't get a URI in the constructor, use the default one.
+                               // We didn't get a URI or options in the constructor, use the default instance.
                                return defaultUri.clone();
                        }
 
index 365e988..9a5a66f 100644 (file)
@@ -33,7 +33,8 @@ div.apihelp-linktrail {
        width: 20em;
 }
 
-.apihelp-deprecated, .apihelp-flag-deprecated,
+.apihelp-deprecated,
+.apihelp-flag-deprecated,
 .apihelp-flag-internal strong {
        font-weight: bold;
        color: #f00;
@@ -68,7 +69,7 @@ div.apihelp-linktrail {
 }
 
 .apihelp-parameters dt:after {
-       content: ':\A0'
+       content: ':\A0';
 }
 
 .apihelp-parameters dd {
index 3cca6eb..dec0571 100644 (file)
@@ -8,7 +8,7 @@
                padding: 0;
                margin: 0;
                background: none;
-               border: none;
+               border: 0;
        }
 
        table {
@@ -37,7 +37,7 @@
                tr {
                        background-color: #fff;
 
-                       &:nth-child(even) {
+                       &:nth-child( even ) {
                                background-color: #f9f9f9;
                        }
                }
@@ -63,9 +63,6 @@
        display: inline-block;
        padding: 10px 5px;
        font-size: 13px;
-       /* IE-hack for display: inline-block */
-       zoom: 1;
-       *display: inline;
 }
 
 .mw-debug-panelink {
@@ -185,6 +182,6 @@ a.mw-debug-panelabel:visited {
 }
 
 /* Cheapo hack to hide the first 3 lines of the backtrace */
-.mw-debug-backtrace li:nth-child(-n+3) {
+.mw-debug-backtrace li:nth-child( -n+3 ) {
        display: none;
 }
index 327c9c8..f93df3c 100644 (file)
@@ -2,7 +2,7 @@
  * Diff rendering
  */
 table.diff {
-       border: none;
+       border: 0;
        border-spacing: 4px;
        margin: 0;
        width: 100%;
@@ -115,6 +115,6 @@ td.diff-deletedline .diffchange {
 .diff-otitle,
 .diff-ntitle,
 .diff-lineno {
-       direction: ltr !important;
+       direction: ltr !important; /* stylelint-disable-line declaration-no-important */
        unicode-bidi: embed;
 }
index c392f2a..6a93fdd 100644 (file)
@@ -1,7 +1,7 @@
 .feedback-spinner {
        display: inline-block;
        zoom: 1;
-       *display: inline; /* IE7 and below */
+       *display: inline; /* IE7 and below */ /* stylelint-disable declaration-block-no-duplicate-properties */
        /* @embed */
        background: url( mediawiki.feedback.spinner.gif );
        width: 18px;
index 89efae3..2c3e137 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.ui/variables";
+@import 'mediawiki.ui/variables';
 
 .mediawiki-filewarning {
        visibility: hidden;
index dd6bf74..4eed90a 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-indicator-mw-helplink a {
        .background-image-svg('images/help.svg', 'images/help.png');
index 1662f0f..9c7064f 100644 (file)
        display: inline;
 }
 /* Display nested lists inline */
-.hlist dl dl, .hlist dl ol, .hlist dl ul,
-.hlist ol dl, .hlist ol ol, .hlist ol ul,
-.hlist ul dl, .hlist ul ol, .hlist ul ul {
+.hlist dl dl,
+.hlist dl ol,
+.hlist dl ul,
+.hlist ol dl,
+.hlist ol ol,
+.hlist ol ul,
+.hlist ul dl,
+.hlist ul ol,
+.hlist ul ul {
        display: inline;
 }
 /* Generate interpuncts */
 .hlist dt:after {
-       content: ":";
+       content: ':';
 }
 .hlist dd:after,
 .hlist li:after {
-       content: " ·";
+       content: ' ·';
        font-weight: bold;
 }
 .hlist dd:last-child:after,
        content: none;
 }
 /* Add parentheses around nested lists */
-.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,
-.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,
-.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {
-       content: "(";
+.hlist dd dd:first-child:before,
+.hlist dd dt:first-child:before,
+.hlist dd li:first-child:before,
+.hlist dt dd:first-child:before,
+.hlist dt dt:first-child:before,
+.hlist dt li:first-child:before,
+.hlist li dd:first-child:before,
+.hlist li dt:first-child:before,
+.hlist li li:first-child:before {
+       content: '(';
        font-weight: normal;
 }
-.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,
-.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,
-.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {
-       content: ")";
+.hlist dd dd:last-child:after,
+.hlist dd dt:last-child:after,
+.hlist dd li:last-child:after,
+.hlist dt dd:last-child:after,
+.hlist dt dt:last-child:after,
+.hlist dt li:last-child:after,
+.hlist li dd:last-child:after,
+.hlist li dt:last-child:after,
+.hlist li li:last-child:after {
+       content: ')';
        font-weight: normal;
 }
 /* For IE8 */
-.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,
-.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,
-.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {
-       content: ")";
+.hlist dd dd.hlist-last-child:after,
+.hlist dd dt.hlist-last-child:after,
+.hlist dd li.hlist-last-child:after,
+.hlist dt dd.hlist-last-child:after,
+.hlist dt dt.hlist-last-child:after,
+.hlist dt li.hlist-last-child:after,
+.hlist li dd.hlist-last-child:after,
+.hlist li dt.hlist-last-child:after,
+.hlist li li.hlist-last-child:after {
+       content: ')';
        font-weight: normal;
 }
 /* Put ordinals in front of ordered list items */
        counter-increment: list-item;
 }
 .hlist ol > li:before {
-       content: counter( list-item ) " ";
+       content: counter( list-item ) ' ';
 }
 .hlist dd ol > li:first-child:before,
 .hlist dt ol > li:first-child:before,
 .hlist li ol > li:first-child:before {
-       content: "(" counter( list-item ) " ";
+       content: '(' counter( list-item ) ' ';
 }
index 49f0f70..c692538 100644 (file)
@@ -1,6 +1,6 @@
 /* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* For the collapsed and expanded arrows, we also provide selectors to make it
  * easy to use them with jquery.makeCollapsible. */
index fdaa989..5c2f83f 100644 (file)
                 */
                getModuleSize: function ( moduleName ) {
                        var module = mw.loader.moduleRegistry[ moduleName ],
-                               payload = 0;
+                               args, i, size;
 
-                       if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+                       if ( module.state !== 'ready' ) {
                                return null;
                        }
 
                        if ( !module.style && !module.script ) {
-                               return null;
+                               return 0;
                        }
 
-                       // Tally CSS
-                       if ( module.style && $.isArray( module.style.css ) ) {
-                               $.each( module.style.css, function ( i, stylesheet ) {
-                                       payload += $.byteLength( stylesheet );
-                               } );
+                       function getFunctionBody( func ) {
+                               return String( func )
+                                       // To ensure a deterministic result, replace the start of the function
+                                       // declaration with a fixed string. For example, in Chrome 55, it seems
+                                       // V8 seemingly-at-random decides to sometimes put a line break between
+                                       // the opening brace and first statement of the function body. T159751.
+                                       .replace( /^\s*function\s*\([^)]*\)\s*{\s*/, 'function(){' )
+                                       .replace( /\s*}\s*$/, '}' );
+                       }
+
+                       // Based on the load.php response for this module.
+                       // For example: `mw.loader.implement("example", function(){}, {"css":[".x{color:red}"]});`
+                       // @see mw.loader.store.set().
+                       args = [
+                               moduleName,
+                               module.script,
+                               module.style,
+                               module.messages,
+                               module.templates
+                       ];
+                       // Trim trailing null or empty object, as load.php would have done.
+                       // @see ResourceLoader::makeLoaderImplementScript and ResourceLoader::trimArray.
+                       i = args.length;
+                       while ( i-- ) {
+                               if ( args[ i ] === null || ( $.isPlainObject( args[ i ] ) && $.isEmptyObject( args[ i ] ) ) ) {
+                                       args.splice( i, 1 );
+                               } else {
+                                       break;
+                               }
                        }
 
-                       // Tally JavaScript
-                       if ( $.isFunction( module.script ) ) {
-                               payload += $.byteLength( module.script.toString() );
+                       size = 0;
+                       for ( i = 0; i < args.length; i++ ) {
+                               if ( typeof args[ i ] === 'function' ) {
+                                       size += $.byteLength( getFunctionBody( args[ i ] ) );
+                               } else {
+                                       size += $.byteLength( JSON.stringify( args[ i ] ) );
+                               }
                        }
 
-                       return payload;
+                       return size;
                },
 
                /**
index fceeb64..33f146b 100644 (file)
@@ -8,6 +8,7 @@
  * @singleton
  */
 
+/* global mwNow */
 /* eslint-disable no-use-before-define */
 
 ( function ( $ ) {
@@ -51,6 +52,7 @@
                /* eslint-enable no-bitwise */
        }
 
+       // <https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set>
        StringSet = window.Set || ( function () {
                /**
                 * @private
@@ -63,7 +65,7 @@
                        this.set[ value ] = true;
                };
                StringSet.prototype.has = function ( value ) {
-                       return this.set.hasOwnProperty( value );
+                       return hasOwn.call( this.set, value );
                };
                return StringSet;
        }() );
@@ -81,9 +83,8 @@
         *  copied in one direction only. Changes to globals do not reflect in the map.
         */
        function Map( global ) {
-               this.internalValues = {};
+               this.values = {};
                if ( global === true ) {
-
                        // Override #set to also set the global variable
                        this.set = function ( selection, value ) {
                                var s;
                                return false;
                        };
                }
-
-               // Deprecated since MediaWiki 1.28
-               log.deprecate(
-                       this,
-                       'values',
-                       this.internalValues,
-                       'mw.Map#values is deprecated. Use mw.Map#get() instead.',
-                       'Map-values'
-               );
        }
 
        /**
         * @param {Mixed} value
         */
        function setGlobalMapValue( map, key, value ) {
-               map.internalValues[ key ] = value;
+               map.values[ key ] = value;
                log.deprecate(
                                window,
                                key,
                 *
                 * @param {string|Array} [selection] Key or array of keys to retrieve values for.
                 * @param {Mixed} [fallback=null] Value for keys that don't exist.
-                * @return {Mixed|Object| null} If selection was a string, returns the value,
+                * @return {Mixed|Object|null} If selection was a string, returns the value,
                 *  If selection was an array, returns an object of key/values.
-                *  If no selection is passed, the internal container is returned. (Beware that,
-                *  as is the default in JavaScript, the object is returned by reference.)
+                *  If no selection is passed, a new object with all key/values is returned.
                 */
                get: function ( selection, fallback ) {
                        var results, i;
-                       // If we only do this in the `return` block, it'll fail for the
-                       // call to get() from the mutli-selection block.
                        fallback = arguments.length > 1 ? fallback : null;
 
                        if ( $.isArray( selection ) ) {
-                               selection = slice.call( selection );
                                results = {};
                                for ( i = 0; i < selection.length; i++ ) {
-                                       results[ selection[ i ] ] = this.get( selection[ i ], fallback );
+                                       if ( typeof selection[ i ] === 'string' ) {
+                                               results[ selection[ i ] ] = hasOwn.call( this.values, selection[ i ] ) ?
+                                                       this.values[ selection[ i ] ] :
+                                                       fallback;
+                                       }
                                }
                                return results;
                        }
 
                        if ( typeof selection === 'string' ) {
-                               if ( !hasOwn.call( this.internalValues, selection ) ) {
-                                       return fallback;
-                               }
-                               return this.internalValues[ selection ];
+                               return hasOwn.call( this.values, selection ) ?
+                                       this.values[ selection ] :
+                                       fallback;
                        }
 
                        if ( selection === undefined ) {
-                               return this.internalValues;
+                               results = {};
+                               for ( i in this.values ) {
+                                       results[ i ] = this.values[ i ];
+                               }
+                               return results;
                        }
 
                        // Invalid selection key
-                       return null;
+                       return fallback;
                },
 
                /**
 
                        if ( $.isPlainObject( selection ) ) {
                                for ( s in selection ) {
-                                       this.internalValues[ s ] = selection[ s ];
+                                       this.values[ s ] = selection[ s ];
                                }
                                return true;
                        }
                        if ( typeof selection === 'string' && arguments.length > 1 ) {
-                               this.internalValues[ selection ] = value;
+                               this.values[ selection ] = value;
                                return true;
                        }
                        return false;
                 * @return {boolean} True if the key(s) exist
                 */
                exists: function ( selection ) {
-                       var s;
-
+                       var i;
                        if ( $.isArray( selection ) ) {
-                               for ( s = 0; s < selection.length; s++ ) {
-                                       if ( typeof selection[ s ] !== 'string' || !hasOwn.call( this.internalValues, selection[ s ] ) ) {
+                               for ( i = 0; i < selection.length; i++ ) {
+                                       if ( typeof selection[ i ] !== 'string' || !hasOwn.call( this.values, selection[ i ] ) ) {
                                                return false;
                                        }
                                }
                                return true;
                        }
-                       return typeof selection === 'string' && hasOwn.call( this.internalValues, selection );
+                       return typeof selection === 'string' && hasOwn.call( this.values, selection );
                }
        };
 
                 *
                 * @return {number} Current time
                 */
-               now: ( function () {
-                       var perf = window.performance,
-                               navStart = perf && perf.timing && perf.timing.navigationStart;
-                       return navStart && typeof perf.now === 'function' ?
-                               function () { return navStart + perf.now(); } :
-                               function () { return +new Date(); };
-               }() ),
+               now: mwNow,
+               // mwNow is defined in startup.js
 
                /**
                 * Format a string. Replace $1, $2 ... $N with positional arguments.
                                        el.media = media;
                                }
                                // If you end up here from an IE exception "SCRIPT: Invalid property value.",
-                               // see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
+                               // see #addEmbeddedCSS, T33676, and T49277 for details.
                                el.href = url;
 
                                $( getMarker() ).before( el );
                                 *     { <media>: css }
                                 *     { <media>: [url, ..] }
                                 *
-                                * The reason css strings are not concatenated anymore is bug 31676. We now check
+                                * The reason css strings are not concatenated anymore is T33676. We now check
                                 * whether it's safe to extend the stylesheet.
                                 *
                                 * @protected
                                                                // 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 bug 41331.
+                                                               // URL set though attributes - when on HTTPS. See T43331.
                                                                l = document.createElement( 'link' );
                                                                l.rel = 'stylesheet';
                                                                l.href = modules;
                                        // Whether the store is in use on this page.
                                        enabled: null,
 
+                                       // Modules whose string representation exceeds 100 kB are
+                                       // ineligible for storage. See bug T66721.
                                        MODULE_SIZE_MAX: 100 * 1000,
 
                                        // The contents of the store, mapping '[name]@[version]' keys
                        return $.when.apply( $, all );
                } );
                loading.then( function () {
+                       /* global mwPerformance */
                        mwPerformance.mark( 'mwLoadEnd' );
                        mw.hook( 'resourceloader.loadEnd' ).fire();
                } );
index 822c814..216cd5a 100644 (file)
@@ -3,7 +3,7 @@
  * in MediaWiki (used e.g. on Special:ListFiles).
  */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 .TablePager {
        min-width: 80%;
index d414232..6a6aa15 100644 (file)
         *  immediate execution after this amount of time (in milliseconds) if it didn't run
         *  by that time.
         */
-       mw.requestIdleCallback = mw.requestIdleCallbackInternal;
-       /*
-       // XXX: Polyfill disabled due to https://bugs.chromium.org/p/chromium/issues/detail?id=647870
-       mw.requestIdleCallback = window.requestIdleCallback
+       mw.requestIdleCallback = window.requestIdleCallback ?
                // Bind because it throws TypeError if context is not window
-               ? window.requestIdleCallback.bind( window )
-               : mw.requestIdleCallbackInternal;
-       */
+               window.requestIdleCallback.bind( window ) :
+               mw.requestIdleCallbackInternal;
+       // Note: Polyfill was previously disabled due to
+       // https://bugs.chromium.org/p/chromium/issues/detail?id=647870
+       // See also <http://codepen.io/Krinkle/full/XNGEvv>
 }( mediaWiki ) );
index 20f8efb..95c77f8 100644 (file)
         *
         * @class mw.SafeStorage
         * @private
-        */
-
-       /**
-        * @ignore
         * @param {Object|undefined} store The Storage instance to wrap around
         */
        function SafeStorage( store ) {
        };
 
        /**
-         * Set a value in device storage.
-         *
-         * @param {string} key Key name to store under
-         * @param {string} value Value to be stored
-         * @return {boolean} Whether the save succeeded or not
-         */
+        * Set a value in device storage.
+        *
+        * @param {string} key Key name to store under
+        * @param {string} value Value to be stored
+        * @return {boolean} Whether the save succeeded or not
+        */
        SafeStorage.prototype.set = function ( key, value ) {
                try {
                        this.store.setItem( key, value );
        };
 
        /**
-         * Remove a value from device storage.
-         *
-         * @param {string} key Key of item to remove
-         * @return {boolean} Whether the save succeeded or not
-         */
+        * Remove a value from device storage.
+        *
+        * @param {string} key Key of item to remove
+        * @return {boolean} Whether the save succeeded or not
+        */
        SafeStorage.prototype.remove = function ( key ) {
                try {
                        this.store.removeItem( key );
@@ -75,6 +71,9 @@
        };
 
        /**
+        * A wrapper for the HTML5 `localStorage` interface
+        * that is safe to call on all browsers.
+        *
         * @class
         * @singleton
         * @extends mw.SafeStorage
@@ -82,6 +81,9 @@
        mw.storage = new SafeStorage( localStorage );
 
        /**
+        * A wrapper for the HTML5 `sessionStorage` interface
+        * that is safe to call on all browsers.
+        *
         * @class
         * @singleton
         * @extends mw.SafeStorage
index c4c91f9..d1fa84a 100644 (file)
                },
 
                /**
-                * Get an automatically generated random ID (stored in a session cookie)
+                * Get an automatically generated random ID (persisted in sessionStorage)
                 *
-                * This ID is ephemeral for everyone, staying in their browser only until they close
-                * their browser.
+                * This ID is ephemeral for everyone, staying in their browser only until they
+                * close their browsing session.
                 *
                 * @return {string} Random session ID
                 */
                sessionId: function () {
-                       var sessionId = mw.cookie.get( 'mwuser-sessionId' );
-                       if ( sessionId === null ) {
+                       var sessionId = mw.storage.session.get( 'mwuser-sessionId' );
+                       if ( !sessionId ) {
                                sessionId = mw.user.generateRandomSessionId();
-                               mw.cookie.set( 'mwuser-sessionId', sessionId, { expires: null } );
+                               mw.storage.session.set( 'mwuser-sessionId', sessionId );
                        }
                        return sessionId;
                },
index a8188db..78634f6 100644 (file)
                        }
 
                        // Update tooltip for the access key after inserting into DOM
-                       // to get a localized access key label (bug 67946).
+                       // to get a localized access key label (T69946).
                        $link.updateTooltipAccessKeys();
 
                        return $item[ 0 ];
index e651c9c..6e9ff0e 100644 (file)
@@ -89,7 +89,7 @@
 
        /**
         * @property {jQuery} $container If the gallery contained in an element that is
-        *      not the main content element, then it stores that element.
+        *   not the main content element, then it stores that element.
         */
 
        /**
 
        /**
         * @property {number} imageHeight Height of the image based on viewport size
-        *      the URLs in the required size.
+        *   the URLs in the required size.
         */
 
        /* Setup */
                        .removeAttr( 'height' );
 
                // Stretch image to take up the required size
-               if ( this.$thumbnail.width() > this.$thumbnail.height() ) {
-                       this.$img.attr( 'width', this.imageWidth + 'px' );
-               } else {
-                       this.$img.attr( 'height', this.imageHeight + 'px' );
-               }
+               this.$img.attr( 'height', ( this.imageHeight - this.$imgCaption.outerHeight() ) + 'px' );
 
                // Make the image smaller in case the current image
                // size is larger than the original file size.
                var imageLi = this.getCurrentImage(),
                        caption = imageLi.find( '.gallerytext' );
 
-               // Highlight current thumbnail
+               // The order of the following is important for size calculations
+               // 1. Highlight current thumbnail
                this.$gallery
                        .find( '.gallerybox.slideshow-current' )
                        .removeClass( 'slideshow-current' );
                imageLi.addClass( 'slideshow-current' );
 
-               // Show thumbnail stretched to the right size while the image loads
+               // 2. Show thumbnail
                this.$thumbnail = imageLi.find( 'img' );
                this.$img.attr( 'src', this.$thumbnail.attr( 'src' ) );
                this.$img.attr( 'alt', this.$thumbnail.attr( 'alt' ) );
                this.$imgLink.attr( 'href', imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) );
-               this.setImageSize();
 
-               // Copy caption
+               // 3. Copy caption
                this.$imgCaption
                        .empty()
                        .append( caption.clone() );
 
-               // Load image at the required size
+               // 4. Stretch thumbnail to correct size
+               this.setImageSize();
+
+               // 5. Load image at the required size
                this.loadImage( this.$thumbnail ).done( function ( info, $img ) {
                        // Show this image to the user only if its still the current one
                        if ( this.$thumbnail.attr( 'src' ) === $img.attr( 'src' ) ) {
index b7a9132..31def27 100644 (file)
@@ -58,7 +58,7 @@ div.gallerytext {
 /* new gallery stuff */
 ul.mw-gallery-nolines li.gallerybox div.thumb {
        background-color: transparent;
-       border: none;
+       border: 0;
 }
 
 ul.mw-gallery-nolines li.gallerybox div.gallerytext {
@@ -71,7 +71,7 @@ ul.mw-gallery-packed li.gallerybox div.thumb,
 ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
 ul.mw-gallery-packed-hover li.gallerybox div.thumb {
        background-color: transparent;
-       border: none;
+       border: 0;
 }
 
 ul.mw-gallery-packed li.gallerybox div.thumb img,
@@ -95,7 +95,7 @@ ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
 ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
        position: absolute;
        background: #fff;
-       background: rgba(255, 255, 255, 0.8);
+       background: rgba( 255, 255, 255, 0.8 );
        padding: 5px 10px;
        bottom: 0;
        left: 0; /* Needed for IE */
@@ -168,7 +168,7 @@ ul.gallery.mw-gallery-slideshow .mw-gallery-slideshow-buttons .oo-ui-buttonEleme
 }
 
 ul.mw-gallery-slideshow li.gallerybox div.thumb {
-       border: none;
+       border: 0;
        background: transparent;
 }
 
index 0c14865..80fc964 100644 (file)
@@ -3,7 +3,8 @@ li.gallerybox {
        display: inline-block;
 }
 
-ul.gallery, li.gallerybox {
+ul.gallery,
+li.gallerybox {
        zoom: 1;
        *display: inline;
 }
index 6038a57..6a7d0b9 100644 (file)
                        var page, url;
 
                        // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
-                       // We avoid using the URL in the link directly since it could have been manipulated (bug 66608)
+                       // We avoid using the URL in the link directly since it could have been manipulated (T68608)
                        page = Number( mw.util.getParamValue( 'page', this.href ) );
                        url = mw.util.getUrl( mw.config.get( 'wgPageName' ), { page: page } );
 
index 7cfe058..7d35cb7 100644 (file)
                                        updateWatchLink( $link, otherAction );
 
                                        // Update the "Watch this page" checkbox on action=edit when the
-                                       // page is watched or unwatched via the tab (bug 12395).
+                                       // page is watched or unwatched via the tab (T14395).
                                        $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched === true );
                                } )
                                .fail( function () {
index 0abb957..2b7ca16 100644 (file)
@@ -2,7 +2,7 @@
 // This affects English only (and languages without localisations, that fall back to English).
 // http://momentjs.com/docs/#/customization/long-date-formats/
 /* global moment */
-moment.locale( 'en', {
+moment.updateLocale( 'en', {
        longDateFormat: {
                // Unchanged, but have to be repeated here:
                LT: 'h:mm A',
index 13f26f0..8aba831 100644 (file)
@@ -2,7 +2,7 @@
 
 // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
 // wgTranslateNumerals is respected.
-moment.locale( moment.locale(), {
+moment.updateLocale( moment.locale(), {
        preparse: function ( s ) {
                var i,
                        table = mw.language.getDigitTransformTable();
diff --git a/resources/src/polyfill-nodeTypes.js b/resources/src/polyfill-nodeTypes.js
deleted file mode 100644 (file)
index c8acc86..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Adds window.Node with node types according to:
- * https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
- */
-
-window.Node = window.Node || {
-       ELEMENT_NODE: 1,
-       ATTRIBUTE_NODE: 2,
-       TEXT_NODE: 3,
-       CDATA_SECTION_NODE: 4,
-       ENTITY_REFERENCE_NODE: 5,
-       ENTITY_NODE: 6,
-       PROCESSING_INSTRUCTION_NODE: 7,
-       COMMENT_NODE: 8,
-       DOCUMENT_NODE: 9,
-       DOCUMENT_TYPE_NODE: 10,
-       DOCUMENT_FRAGMENT_NODE: 11,
-       NOTATION_NODE: 12
-};
index 20818d2..deb280a 100644 (file)
@@ -6,11 +6,19 @@
 
 /* global mw, $VARS, $CODE */
 
-// eslint-disable-next-line no-unused-vars
-var mediaWikiLoadStart = ( new Date() ).getTime(),
-       mwPerformance = ( window.performance && performance.mark ) ? performance : {
+var mwPerformance = ( window.performance && performance.mark ) ? performance : {
                mark: function () {}
-       };
+       },
+       // Define now() here to ensure valid comparison with mediaWikiLoadEnd (T153819).
+       mwNow = ( function () {
+               var perf = window.performance,
+                       navStart = perf && perf.timing && perf.timing.navigationStart;
+               return navStart && typeof perf.now === 'function' ?
+                       function () { return navStart + perf.now(); } :
+                       function () { return +new Date(); };
+       }() ),
+       // eslint-disable-next-line no-unused-vars
+       mediaWikiLoadStart = mwNow();
 
 mwPerformance.mark( 'mwLoadStart' );
 
index 14a2d76..c13279e 100644 (file)
@@ -40,7 +40,7 @@ end
 
 Then(/^feedback should be (.+)$/) do |feedback|
   on(LoginPage) do |page|
-    page.feedback_element.when_present.click
+    page.feedback_element.click
     expect(page.feedback).to match Regexp.escape(feedback)
   end
 end
@@ -58,7 +58,7 @@ Then(/^Password element should be there$/) do
 end
 
 Then(/^there should be a link to (.+)$/) do |text|
-  expect(on(LoginPage).username_displayed_element.when_present.text).to eq text
+  expect(on(LoginPage).username_displayed_element.text).to eq text
 end
 
 Then(/^Username element should be there$/) do
index 8ffdaf1..b58f7a4 100644 (file)
@@ -1,5 +1,5 @@
 When(/^I click Appearance$/) do
-  visit(PreferencesPage).appearance_link_element.when_present.click
+  visit(PreferencesPage).appearance_link_element.click
 end
 
 When(/^I navigate to Preferences$/) do
index f691ffd..96dc491 100644 (file)
@@ -1,43 +1,43 @@
 When(/^I click Editing$/) do
-  visit(PreferencesPage).editing_link_element.when_present.click
+  visit(PreferencesPage).editing_link_element.click
 end
 
 Then(/^I can select edit area font style$/) do
-  expect(on(PreferencesEditingPage).edit_area_font_style_select_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_area_font_style_select_element).to exist
 end
 
 Then(/^I can select live preview$/) do
-  expect(on(PreferencesEditingPage).live_preview_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).live_preview_check_element).to exist
 end
 
 Then(/^I can select section editing by double clicking$/) do
-  expect(on(PreferencesEditingPage).edit_section_double_click_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_section_double_click_check_element).to exist
 end
 
 Then(/^I can select section editing by right clicking$/) do
-  expect(on(PreferencesEditingPage).edit_section_right_click_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_section_right_click_check_element).to exist
 end
 
 Then(/^I can select section editing via edit links$/) do
-  expect(on(PreferencesEditingPage).edit_section_edit_link_element.when_present).to exist
+  expect(on(PreferencesEditingPage).edit_section_edit_link_element).to exist
 end
 
 Then(/^I can select show edit toolbar$/) do
-  expect(on(PreferencesEditingPage).show_edit_toolbar_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).show_edit_toolbar_check_element).to exist
 end
 
 Then(/^I can select show preview before edit box$/) do
-  expect(on(PreferencesEditingPage).preview_on_top_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).preview_on_top_check_element).to exist
 end
 
 Then(/^I can select show preview on first edit$/) do
-  expect(on(PreferencesEditingPage).preview_on_first_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).preview_on_first_check_element).to exist
 end
 
 Then(/^I can select to prompt me when entering a blank edit summary$/) do
-  expect(on(PreferencesEditingPage).forced_edit_summary_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).forced_edit_summary_check_element).to exist
 end
 
 Then(/^I can select to warn me when I leave an edit page with unsaved changes$/) do
-  expect(on(PreferencesEditingPage).unsaved_changes_check_element.when_present).to exist
+  expect(on(PreferencesEditingPage).unsaved_changes_check_element).to exist
 end
index 5660d49..6d28ce5 100644 (file)
@@ -1,5 +1,5 @@
 When(/^I click User profile$/) do
-  visit(PreferencesPage).user_profile_link_element.when_present.click
+  visit(PreferencesPage).user_profile_link_element.click
 end
 
 Then(/^I can change my gender$/) do
index c119b38..32fc2bb 100644 (file)
@@ -3,28 +3,7 @@ require 'page-object'
 class LoginPage
   include PageObject
 
-  page_url 'Special:UserLogin'
-
   element(:error_message, css: 'div#userloginForm div.error')
-  div(:feedback, class: 'errorbox')
-  button(:login, id: 'wpLoginAttempt')
-  li(:logout, id: 'pt-logout')
-  text_field(:password, id: 'wpPassword1')
   element(:password_error, css: 'input#wpPassword1:required:invalid')
-  a(:password_strength, text: 'password strength')
-  a(:phishing, text: 'phishing')
-  text_field(:username, id: 'wpName1')
-  a(:username_displayed, title: /Your user page/)
   element(:username_error, css: 'input#wpName1:required:invalid')
-
-  def logged_in_as_element
-    @browser.div(id: 'mw-content-text').p.b
-  end
-
-  def login_with(username, password, wait_for_logout_element = true)
-    username_element.when_present.send_keys(username)
-    password_element.when_present.send_keys(password)
-    login_element.when_present.click
-    logout_element.when_present(10) if wait_for_logout_element
-  end
 end
index 38f56d2..3733e60 100644 (file)
@@ -89,7 +89,7 @@ class TestSetup {
                ];
                $wgAuth = new MediaWiki\Auth\AuthManagerAuthPlugin();
 
-               // Bug 44192 Do not attempt to send a real e-mail
+               // T46192 Do not attempt to send a real e-mail
                Hooks::clear( 'AlternateUserMailer' );
                Hooks::register(
                        'AlternateUserMailer',
index 97e24b6..35c2480 100644 (file)
@@ -295,7 +295,7 @@ class ParserTestRunner {
                        MediaWikiServices::getInstance()->resetServiceForTesting( 'MediaHandlerFactory' );
                };
 
-               // SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
+               // SqlBagOStuff broke when using temporary tables on r40209 (T17892).
                // It seems to have been fixed since (r55079?), but regressed at some point before r85701.
                // This works around it for now...
                global $wgObjectCaches;
@@ -316,7 +316,7 @@ class ParserTestRunner {
 
        private function appendNamespaceSetup( &$setup, &$teardown ) {
                // Add a namespace shadowing a interwiki link, to test
-               // proper precedence when resolving links. (bug 51680)
+               // proper precedence when resolving links. (T53680)
                $setup['wgExtraNamespaces'] = [
                        100 => 'MemoryAlpha',
                        101 => 'MemoryAlpha_talk'
@@ -974,10 +974,9 @@ class ParserTestRunner {
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgLanguageCode' => $langCode,
                        'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
-                       'wgNamespacesWithSubpages' => [
-                               0 => isset( $opts['subpage'] ),
-                               2 => isset( $opts['subpage'] ),
-                       ],
+                       'wgNamespacesWithSubpages' => array_fill_keys(
+                               MWNamespace::getValidNamespaces(), isset( $opts['subpage'] )
+                       ),
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
                        'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
@@ -1321,7 +1320,7 @@ class ParserTestRunner {
                if ( $this->useTemporaryTables ) {
                        if ( $this->db->getType() == 'sqlite' ) {
                                # Under SQLite the searchindex table is virtual and need
-                               # to be explicitly destroyed. See bug 29912
+                               # to be explicitly destroyed. See T31912
                                # See also MediaWikiTestCase::destroyDB()
                                wfDebug( __METHOD__ . " explicitly destroying sqlite virtual table parsertest_searchindex\n" );
                                $this->db->query( "DROP TABLE `parsertest_searchindex`" );
index f1a82ee..a62db5a 100644 (file)
@@ -9,4 +9,4 @@ To run parser tests via PHPUnit:
 
 You can optionally filter by title using --filter, e.g.
 
- ./phpunit.php --testsuite parsertests --filter="Bug 6200"
+ ./phpunit.php --testsuite parsertests --filter="T6400"
index 05b1216..7f64671 100644 (file)
@@ -125,7 +125,7 @@ class TestFileEditor {
                $line = $this->lines[$this->pos++];
                $heading = $this->getHeading( $line );
                $expectedEnd = 'end' . $heading;
-               $contents = $line;
+               $contents = "$line\n";
 
                do {
                        $line = $this->lines[$this->pos++];
index 6b5fb48..39c9ca5 100644 (file)
@@ -58,7 +58,7 @@ class TidySupport {
                                'tidyConfigFile' => "$IP/includes/tidy/tidy.conf",
                                'tidyCommandLine' => '',
                        ];
-                       if ( extension_loaded( 'tidy' ) && class_exists( 'tidy' ) ) {
+                       if ( extension_loaded( 'tidy' ) && ( wfIsHHVM() || class_exists( 'tidy' ) ) ) {
                                $this->config['driver'] = wfIsHHVM() ? 'RaggettInternalHHVM' : 'RaggettInternalPHP';
                        } else {
                                if ( is_executable( $wgTidyBin ) ) {
index a48087e..50d1bc9 100644 (file)
Binary files a/tests/parser/extraParserTests.txt and b/tests/parser/extraParserTests.txt differ
index 46e1012..be6e3a8 100644 (file)
@@ -609,7 +609,7 @@ Italics and bold
 
 !! end
 
-# this example taken from the [[simple:Moon]] article (bug 47326)
+# this example taken from the [[simple:Moon]] article (T49326)
 !! test
 Italics and possessives (1)
 !! wikitext
@@ -619,7 +619,7 @@ obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
 </p>
 !! end
 
-# this example taken from [[en:Flaming Pie]] (bug 49926)
+# this example taken from [[en:Flaming Pie]] (T51926)
 !! test
 Italics and possessives (2)
 !! wikitext
@@ -629,7 +629,7 @@ Italics and possessives (2)
 </p>
 !! end
 
-# this example taken from [[en:Dictionary]] (bug 49926)
+# this example taken from [[en:Dictionary]] (T51926)
 !! test
 Italics and possessives (3)
 !! wikitext
@@ -1178,7 +1178,7 @@ Non-html5 tags should be accepted
 !! end
 
 !! test
-<wbr> is valid wikitext (bug 52468)
+<wbr> is valid wikitext (T54468)
 !! wikitext
 <wbr>
 !! html
@@ -1293,7 +1293,7 @@ Ruby markup (W3C-style)
 
 # The next two test different paths in the sanitizer.
 !! test
-Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
+Non-word characters don't terminate tag names (T19663, T42670, T54022)
 !! wikitext
 <blockquote|>a</blockquote>
 
@@ -1364,7 +1364,7 @@ array (
 !! end
 
 !! test
-Isolated close tags should be treated as literal text (bug 52760)
+Isolated close tags should be treated as literal text (T54760)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -1382,7 +1382,7 @@ parsoid=wt2html
 ###
 
 !! test
-Bare pipe character (bug 52363)
+Bare pipe character (T54363)
 !! wikitext
 |
 !! html
@@ -1391,7 +1391,7 @@ Bare pipe character (bug 52363)
 !! end
 
 !! test
-Bare pipe character from a template (bug 52363)
+Bare pipe character from a template (T54363)
 !! wikitext
 {{pipe}}
 !! html
@@ -1488,9 +1488,11 @@ nowiki 3
 Entities inside <nowiki>
 !! wikitext
 <nowiki>&lt;</nowiki>
-!! html
+!! html/php
 <p>&lt;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki"><span typeof="mw:Entity" data-parsoid='{"src":"&amp;lt;","srcContent":"&lt;"}'>&lt;</span></span></p>
 !! end
 
 !! test
@@ -2162,7 +2164,7 @@ Regression with preformatted in <center>
 !! end
 
 !! test
-Bug 52763: Preformatted in <blockquote>
+T54763: Preformatted in <blockquote>
 !! wikitext
 <blockquote>
  Blah
@@ -2186,7 +2188,7 @@ Bug 52763: Preformatted in <blockquote>
 !! end
 
 !! test
-Bug 51086: Double newlines in blockquotes should be turned into paragraphs
+T53086: Double newlines in blockquotes should be turned into paragraphs
 !! wikitext
 <blockquote>
 Foo
@@ -2203,7 +2205,7 @@ Bar
 !! end
 
 !! test
-Bug 15491: <ins>/<del> in blockquote
+T17491: <ins>/<del> in blockquote
 !! wikitext
 <blockquote>
 Foo <del>bar</del> <ins>baz</ins> quux
@@ -2218,9 +2220,9 @@ Foo <del>bar</del> <ins>baz</ins> quux
 
 # Note that the p-wrapping is newline sensitive, which could be
 # considered a bug: tidy will wrap only the 'Foo' in the example
-# below in a <p> tag. (see comment 23-25 of bug #6200)
+# below in a <p> tag. (see comment 23-25 of T8200)
 !! test
-Bug 15491: <ins>/<del> in blockquote (2)
+T17491: <ins>/<del> in blockquote (2)
 !! wikitext
 <blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
@@ -2235,7 +2237,7 @@ Bug 15491: <ins>/<del> in blockquote (2)
 !! end
 
 !! test
-<pre> with attributes (bug 3202)
+<pre> with attributes (T5202)
 !! wikitext
 <pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
 !! html
@@ -2244,7 +2246,7 @@ Bug 15491: <ins>/<del> in blockquote (2)
 !! end
 
 !! test
-<pre> with width attribute (bug 3202)
+<pre> with width attribute (T5202)
 !! wikitext
 <pre width="8">Narrow screen goodies</pre>
 !! html
@@ -2253,7 +2255,7 @@ Bug 15491: <ins>/<del> in blockquote (2)
 !! end
 
 !! test
-<pre> with forbidden attribute (bug 3202)
+<pre> with forbidden attribute (T5202)
 !! wikitext
 <pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre>
 !! html
@@ -2271,7 +2273,7 @@ Entities inside <pre>
 !! end
 
 !! test
-<pre> with forbidden attribute values (bug 3202)
+<pre> with forbidden attribute values (T5202)
 !! wikitext
 <pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre>
 !! html
@@ -2280,7 +2282,7 @@ Entities inside <pre>
 !! end
 
 !! test
-<nowiki> inside <pre> (bug 13238)
+<nowiki> inside <pre> (T15238)
 !! wikitext
 <pre>
 <nowiki>
@@ -2311,8 +2313,12 @@ Entities inside <pre>
 <pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"#tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
 !! end
 
+## Don't expect this to rt, Parsoid drops the unmatched closing pre tags that
+## aren't enclosed in nowikis.
 !! test
 <nowiki> and <pre> preference (first one wins)
+!! options
+parsoid=wt2html
 !! wikitext
 <pre>
 <nowiki>
@@ -2341,17 +2347,16 @@ Entities inside <pre>
 &lt;/pre&gt;
 </p>
 !! html/parsoid
-<pre data-parsoid='{"stx":"html","strippedNL":true}'>&lt;nowiki>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n&lt;nowiki>\n"}}'>&lt;nowiki>
 </pre>
-<p><span typeof="mw:Placeholder" data-parsoid='{"src":"&lt;/nowiki>"}'>&lt;/nowiki></span>
-&lt;/pre></p>
+<p>&lt;/nowiki></p>
+
 
 <p><span typeof="mw:Nowiki">
 &lt;pre>
 &lt;nowiki>
 &lt;/pre>
-</span>
-&lt;/pre></p>
+</span></p>
 !! end
 
 !! test
@@ -2365,9 +2370,7 @@ Entities inside <pre>
 
 # Parsoid doesn't strip empty tags, like Tidy does.
 !! test
-Empty pre; pre inside other HTML tags (bug 54946)
-!! options
-parsoid=wt2html,wt2wt
+Empty pre; pre inside other HTML tags (T56946)
 !! wikitext
 a
 
@@ -2392,9 +2395,9 @@ foo
 !! html/parsoid
 <p>a</p>
 
-<div><pre>foo
+<div data-parsoid='{"stx":"html"}'><pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\nfoo\n"}}'>foo
 </pre></div>
-<pre></pre>
+<pre typeof="mw:Extension/pre" about="#mwt4" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":""}}'></pre>
 !! end
 
 !! test
@@ -2410,7 +2413,7 @@ HTML pre followed by indent-pre
 
 # Note that tidy removes the empty <p> tags from the start and end.
 # Parsoid does not, by design.
-!!test
+!! test
 Block tag pre
 !! wikitext
 <p><pre>foo</pre></p>
@@ -2419,8 +2422,8 @@ Block tag pre
 foo
 </pre>
 !! html/parsoid
-<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre data-parsoid='{"stx":"html"}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
-!!end
+<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
+!! end
 
 !!test
 Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
@@ -2541,8 +2544,11 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 </pre>
 !!end
 
+## Hmm, should Parsoid rt this?
 !! test
 Pres with newline attributes
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <pre class="one
 two">hi</pre>
@@ -2550,8 +2556,7 @@ two">hi</pre>
 <pre class="one two">hi</pre>
 
 !! html/parsoid
-<pre class="one
-two" data-parsoid='{"stx":"html"}'>hi</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" class="one two" data-mw='{"name":"pre","attrs":{"class":"one two"},"body":{"extsrc":"hi"}}'>hi</pre>
 !! end
 
 !! test
@@ -2566,7 +2571,7 @@ Barack Obama <President> of the United States
 !! end
 
 !! test
-Handle broken pre-like tags (bug 64025)
+Handle broken pre-like tags (T66025)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -2583,7 +2588,7 @@ x
 </pre>
 <p>&lt;pre</p>
 !! html/parsoid
-<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"a":{"&lt;pre":null},"sa":{"&lt;pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;pre &lt;pre>x&lt;/pre>"}},"i":0}}]}'>x</pre>
+<pre about="#mwt1" typeof="mw:Transclusion mw:Extension/pre" data-parsoid='{"a":{"&lt;pre":null},"sa":{"&lt;pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;pre &lt;pre>x&lt;/pre>"}},"i":0}}]}'>x</pre>
 
 
 <p>&lt;pre </p>
@@ -2601,7 +2606,7 @@ parsoid=wt2html
 <pre style="width:50%;">{{echo|foo}}</pre>
 
 !! html/parsoid
-<pre style="width:50%;">{{echo|foo}}</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" style="width:50%;" data-mw='{"name":"pre","attrs":{"style":"width:50%;"},"body":{"extsrc":"{{echo|foo}}"}}'>{{echo|foo}}</pre>
 !! end
 
 # TODO / maybe: fix wt2wt for this
@@ -2782,7 +2787,7 @@ Templates: Handle comments in the target
 !!end
 
 !! test
-Templates: Handle comments in parameter names (bug 67657)
+Templates: Handle comments in parameter names (T69657)
 !! wikitext
 {{echo|1
 <!-- should be ignored -->
@@ -2812,7 +2817,7 @@ Templates: Handle comments in parameter names (bug 67657)
 !!end
 
 !! test
-Templates: Other wikitext in parameter names (bug 67657)
+Templates: Other wikitext in parameter names (T69657)
 !! wikitext
 {{echo|''1''=foo}}
 !! html/php
@@ -2900,7 +2905,7 @@ parsoid=html2wt,wt2wt
 </p>
 !! end
 
-## Bug 52824
+## T54824
 !! test
 Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
 !! options
@@ -2913,7 +2918,7 @@ parsoid=html2wt,wt2wt
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
 !! end
 
-## Bug 56733
+## T58733
 !! test
 Templates parameters with special tokenizing behavior dont get modified because of arg escaping
 !! wikitext
@@ -2924,7 +2929,7 @@ Templates parameters with special tokenizing behavior dont get modified because
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
 !! end
 
-## Bug T73412
+## T73412
 !! test
 Templates: Preserve blank parameter names
 !! wikitext
@@ -3041,7 +3046,7 @@ c
 !!end
 
 !!test
-2c. Indent-Pre and tables (bug 42252)
+2c. Indent-Pre and tables (T44252)
 !! wikitext
 {|
  |+ foo
@@ -3112,7 +3117,7 @@ a
 !!end
 
 !! test
-2g. Indented table markup mixed with indented pre content (proposed in bug 6200)
+2g. Indented table markup mixed with indented pre content (proposed in T8200)
 !! wikitext
  <table>
  <tr>
@@ -3266,6 +3271,17 @@ array (
  a <pre typeof="mw:Extension/tag" about="#mwt2" data-parsoid='{}' data-mw='{"name":"tag","attrs":{},"body":null}'></pre>
 !! end
 
+!! test
+5. Indent-Pre and html pre
+!! wikitext
+ <pre class="123">hi</pre>
+!! html/php
+ <pre class="123">hi</pre>
+
+!! html/parsoid
+ <pre typeof="mw:Extension/pre" about="#mwt2" class="123" data-mw='{"name":"pre","attrs":{"class":"123"},"body":{"extsrc":"hi"}}'>hi</pre>
+!! end
+
 !!test
 Render paragraphs when indent-pre is suppressed in blocklevels
 !! wikitext
@@ -3455,18 +3471,17 @@ foo
 foo
 </pre>
 !! html/parsoid
-<pre data-parsoid='{"stx":"html"}'>foo</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre>
 
-<pre data-parsoid='{"stx":"html","strippedNL":"\n"}'>
-foo
+<pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\nfoo\n"}}'>foo
 </pre>
 
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt6" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\nfoo\n"}}'>
 
 foo
 </pre>
 
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt8" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\n\nfoo\n"}}'>
 
 
 foo
@@ -3510,7 +3525,7 @@ haha
 
 </pre>
 !! html/parsoid
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\n\n\n\nhaha\n\n\n\n\nhaha\n\n\n\n\n"}}'>
 
 
 
@@ -3561,7 +3576,7 @@ HTML-pre: 3: other wikitext
 </pre>
 
 !! html/parsoid
-<pre data-parsoid='{"stx":"html","strippedNL":true}'>* foo
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n* foo\n# bar\n= no-h =\n&#39;&#39; no-italic &#39;&#39;\n[[ NoLink ]]\n"}}'>* foo
 # bar
 = no-h =
 '' no-italic ''
@@ -3683,7 +3698,33 @@ Definition lists: self-closed tag
 !! end
 
 !! test
-Bug 11748: Literal closing tags
+Definition lists: ignore colons inside tags
+!! wikitext
+;one <b>two : tag <i>fun:</i>:</b>: def
+!! html
+<dl><dt>one <b>two&#160;: tag <i>fun:</i>:</b></dt>
+<dd> def</dd></dl>
+
+!! end
+
+!! test
+Definition lists: excess closed tags
+!! wikitext
+;one</b>two : bad tag fun
+!! html/php+tidy
+<dl>
+<dt>onetwo&#160;</dt>
+<dd>bad tag fun</dd>
+</dl>
+!! html/parsoid
+<dl>
+<dt>onetwo</dt>
+<dd>bad tag fun</dd>
+</dl>
+!! end
+
+!! test
+T13748: Literal closing tags
 !! wikitext
 <dl>
 <dt>test 1</dt>
@@ -3810,7 +3851,7 @@ should be left alone
 !! end
 
 !! test
-Definition Lists: Hacky use to indent tables, with comments (bug 63979)
+Definition Lists: Hacky use to indent tables, with comments (T65979)
 !! wikitext
 <!-- foo -->
 ::{|
@@ -4516,7 +4557,7 @@ Non-bracketed: http://example.com
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
 External links: numbered
 !! wikitext
@@ -4561,7 +4602,7 @@ http://example.com/1$2345
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
 External links: dollar sign in URL (autonumber)
 !! wikitext
@@ -4574,7 +4615,7 @@ External links: dollar sign in URL (autonumber)
 !!end
 
 !! test
-External links: open square bracket forbidden in URL (bug 4377)
+External links: open square bracket forbidden in URL (T6377)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -4587,7 +4628,7 @@ http://example.com/1[2345
 !! end
 
 !! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
+External links: open square bracket forbidden in URL (named) (T6377)
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -4601,7 +4642,7 @@ parsoid=wt2html,html2html
 
 # parsoid adds a space before the link name
 !! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
+External links: open square bracket forbidden in URL (named) (T6377)
 Parsoid variant.
 !! wikitext
 [http://example.com/1 [2345]
@@ -4611,7 +4652,7 @@ Parsoid variant.
 !!end
 
 !! test
-External links: nowiki in URL link text (bug 6230)
+External links: nowiki in URL link text (T8230)
 !! wikitext
 [http://example.com/ <nowiki>''example site''</nowiki>]
 !! html
@@ -4620,7 +4661,7 @@ External links: nowiki in URL link text (bug 6230)
 !! end
 
 !! test
-External links: newline forbidden in text (bug 6230 regression check)
+External links: newline forbidden in text (T8230 regression check)
 !! wikitext
 [http://example.com/ first
 second]
@@ -4648,7 +4689,7 @@ External links: protocol-relative URL in brackets
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
 External links: protocol-relative URL in brackets without text
 !! wikitext
@@ -4670,7 +4711,7 @@ External links: protocol-relative URL in free text is left alone
 !!end
 
 !! test
-External links: protocol-relative URL in the middle of a word is left alone (bug 30269)
+External links: protocol-relative URL in the middle of a word is left alone (T32269)
 !! wikitext
 foo//example.com/Foo
 !! html
@@ -4821,7 +4862,7 @@ bitcoin:;
 !! end
 
 !! test
-External links: No preceding word characters allowed (bug 65278)
+External links: No preceding word characters allowed (T67278)
 !! wikitext
 NOPEhttp://example.com
 N0http://example.com
@@ -4966,7 +5007,7 @@ Old &amp; use: http://x&amp;y
 !! end
 
 !! test
-External links: encoded equals (bug 6102)
+External links: encoded equals (T8102)
 !! wikitext
 http://example.com/?foo&#61;bar
 !! html/php
@@ -4978,7 +5019,7 @@ http://example.com/?foo&#61;bar
 
 ##
 ## Note that parsoid doesn't explicit mark autonumbered links, nor
-## does it number them.  As discussed in bug 53505, we can identify
+## does it number them.  As discussed in T55505, we can identify
 ## autonumbered links via CSS.
 ##
 
@@ -5022,7 +5063,7 @@ External links: [raw equals]
 # note that parsoid html is identical to [raw equals] case; so html2wt
 # mode will return the [raw equals] wikitext
 !! test
-External links: [encoded equals] (bug 6102)
+External links: [encoded equals] (T8102)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -5082,7 +5123,7 @@ http://e&zwnj;xample.com/
 !! end
 
 !! test
-External links: www.jpeg.org (bug 554)
+External links: www.jpeg.org (T2554)
 !! wikitext
 http://www.jpeg.org
 !! html
@@ -5090,9 +5131,9 @@ http://www.jpeg.org
 </p>
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !! test
-External links: URL within URL (original bug 2)
+External links: URL within URL (T2002)
 !! wikitext
 [http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
 !! html/php
@@ -5103,7 +5144,7 @@ External links: URL within URL (original bug 2)
 !! end
 
 !! test
-BUG 361: URL inside bracketed URL
+T2361: URL inside bracketed URL
 !! wikitext
 [http://www.example.com/foo http://www.example.com/bar]
 !! html
@@ -5112,7 +5153,7 @@ BUG 361: URL inside bracketed URL
 !! end
 
 !! test
-BUG 361: URL within URL, not bracketed
+T2361: URL within URL, not bracketed
 !! wikitext
 http://www.example.com/foo?=http://www.example.com/bar
 !! html
@@ -5121,7 +5162,7 @@ http://www.example.com/foo?=http://www.example.com/bar
 !! end
 
 !! test
-BUG 289: ">"-token in URL-tail
+T2289: ">"-token in URL-tail
 !! wikitext
 http://www.example.com/<hello>
 !! html
@@ -5130,7 +5171,7 @@ http://www.example.com/<hello>
 !!end
 
 !! test
-BUG 289: literal ">"-token in URL-tail
+T2289: literal ">"-token in URL-tail
 !! wikitext
 http://www.example.com/<b>html</b>
 !! html/php
@@ -5141,7 +5182,7 @@ http://www.example.com/<b>html</b>
 !! end
 
 !! test
-BUG 289: ">"-token in bracketed URL
+T2289: ">"-token in bracketed URL
 !! wikitext
 [http://www.example.com/<hello> stuff]
 !! html
@@ -5150,7 +5191,7 @@ BUG 289: ">"-token in bracketed URL
 !!end
 
 !! test
-BUG 289: literal ">"-token in bracketed URL
+T2289: literal ">"-token in bracketed URL
 !! wikitext
 [http://www.example.com/<b>html</b> stuff]
 !! html
@@ -5159,7 +5200,7 @@ BUG 289: literal ">"-token in bracketed URL
 !!end
 
 !! test
-BUG 289: literal double quote at end of URL
+T2289: literal double quote at end of URL
 !! wikitext
 http://www.example.com/"hello"
 !! html
@@ -5168,7 +5209,7 @@ http://www.example.com/"hello"
 !!end
 
 !! test
-BUG 289: literal double quote in bracketed URL
+T2289: literal double quote in bracketed URL
 !! wikitext
 [http://www.example.com/"hello" stuff]
 !! html
@@ -5177,7 +5218,7 @@ BUG 289: literal double quote in bracketed URL
 !!end
 
 !! test
-External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
+External links: multiple legal whitespace is fine, Magnus. Don't break it please. (T7081)
 !! wikitext
 [http://www.example.com  test]
 !! html
@@ -5197,7 +5238,7 @@ External links: link text with spaces
 !! end
 
 !! test
-External links: wiki links within external link (Bug 3695)
+External links: wiki links within external link (T5695)
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -5210,7 +5251,7 @@ parsoid=wt2html,html2html
 !! end
 
 !! test
-BUG 787: Links with one slash after the url protocol are invalid
+T2787: Links with one slash after the url protocol are invalid
 !! wikitext
 http:/example.com
 
@@ -5231,7 +5272,7 @@ Bracketed external links with template-generated invalid target
 !! end
 
 !! test
-Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
+T4702: Mismatched <i>, <b> and <a> tags are invalid
 !! wikitext
 ''[http://example.com text'']
 [http://example.com '''text]'''
@@ -5249,7 +5290,7 @@ Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
 
 
 !! test
-Bug 4781: %26 in URL
+T6781: %26 in URL
 !! wikitext
 http://www.example.com/?title=AT%26T
 !! html/php
@@ -5262,7 +5303,7 @@ http://www.example.com/?title=AT%26T
 # According to https://www.w3.org/TR/2011/WD-html5-20110525/Overview.html#parsing-urls a plain
 # % is actually legal in HTML5. Any change in output would need testing though.
 !! test
-Bug 4781, 5267: %25 in URL
+T6781, T7267: %25 in URL
 !! wikitext
 http://www.example.com/?title=100%25_Bran
 !! html/php
@@ -5273,7 +5314,7 @@ http://www.example.com/?title=100%25_Bran
 !! end
 
 !! test
-Bug 4781, 5267: %28, %29 in URL
+T6781, T7267: %28, %29 in URL
 !! wikitext
 http://www.example.com/?title=Ben-Hur_%281959_film%29
 !! html/php
@@ -5285,7 +5326,7 @@ http://www.example.com/?title=Ben-Hur_%281959_film%29
 
 
 !! test
-Bug 4781: %26 in autonumber URL
+T6781: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=AT%26T]
 !! html/php
@@ -5296,7 +5337,7 @@ Bug 4781: %26 in autonumber URL
 !! end
 
 !! test
-Bug 4781, 5267: %26 in autonumber URL
+T6781, T7267: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran]
 !! html/php
@@ -5307,7 +5348,7 @@ Bug 4781, 5267: %26 in autonumber URL
 !! end
 
 !! test
-Bug 4781, 5267: %28, %29 in autonumber URL
+T6781, T7267: %28, %29 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29]
 !! html/php
@@ -5319,7 +5360,7 @@ Bug 4781, 5267: %28, %29 in autonumber URL
 
 
 !! test
-Bug 4781: %26 in bracketed URL
+T6781: %26 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=AT%26T link]
 !! html/php
@@ -5330,7 +5371,7 @@ Bug 4781: %26 in bracketed URL
 !! end
 
 !! test
-Bug 4781, 5267: %25 in bracketed URL
+T6781, T7267: %25 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran link]
 !! html
@@ -5339,7 +5380,7 @@ Bug 4781, 5267: %25 in bracketed URL
 !! end
 
 !! test
-Bug 4781, 5267: %28, %29 in bracketed URL
+T6781, T7267: %28, %29 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
 !! html/php
@@ -5350,7 +5391,7 @@ Bug 4781, 5267: %28, %29 in bracketed URL
 !! end
 
 !! test
-External link containing a period in the anchor. (bug 63947)
+External link containing a period in the anchor. (T65947)
 !! wikitext
 [//foo.org/bar#baz. bang]
 
@@ -5365,7 +5406,7 @@ External link containing a period in the anchor. (bug 63947)
 !! end
 
 !! test
-External link containing a single quote. (bug 63947)
+External link containing a single quote. (T65947)
 !! wikitext
 [//foo.org/bar'baz]
 
@@ -5380,7 +5421,7 @@ External link containing a single quote. (bug 63947)
 !! end
 
 !! test
-External link containing double-single-quotes in text '' (bug 4598 sanity check)
+External link containing double-single-quotes in text '' (T6598 sanity check)
 !! wikitext
 Some [http://example.com/ pretty ''italics'' and stuff]!
 !! html
@@ -5389,7 +5430,7 @@ Some [http://example.com/ pretty ''italics'' and stuff]!
 !! end
 
 !! test
-External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
+External link containing double-single-quotes in text embedded in italics (T6598 sanity check)
 !! wikitext
 ''Some [http://example.com/ pretty ''italics'' and stuff]!''
 !! html
@@ -6349,7 +6390,7 @@ Nested table
 !! end
 
 !! test
-Invalid attributes in table cell (bug 1830)
+Invalid attributes in table cell (T3830)
 !! wikitext
 {|
 |Cell:|broken
@@ -6943,12 +6984,6 @@ Wikitext table with html-syntax row
 <td>foo</td></tr></tbody></table>
 !! end
 
-## Note that Parsoid output differs from PHP and PHP+tidy here.
-## The lack of <tr> tags in the PHP output is arguably a bug in the
-## PHP parser, which tidy then compounds by fostering the content
-## entirely out of the table.  Parsoid recognizes the table context
-## and generates <tr> and <td> wrappers as needed.  Hopefully nobody
-## depends on PHP's treatment of broken table markup!
 !! test
 Implicit <td> after a |-
 !! options
 !! html/php+tidy
 <p>a</p>
 !! html/parsoid
-<table>
-<tr><td>a</td></tr>
-</table>
-!! end
-
-# Again, Parsoid adds implicit <td>s here, PHP and Tidy strip the b out.
-!! test
-<pre> tags should be recognized in an explicit <td> context, but not in an implicit <td> context
-!! options
-parsoid=wt2html,html2html
-!! wikitext
-{|
-|-
-|
- a
-|-
- b
-|}
-!! html/php
-<table>
-
-<tr>
-<td>
-<pre>a
-</pre>
-</td></tr>
- b
-</table>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'>a</p><table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
 
-!! html/php+tidy
-<p>b</p>
-<table>
-<tr>
-<td>
-<pre>
-a
-</pre></td>
-</tr>
-</table>
-!! html/parsoid
-<table>
-<tbody>
-<tr><td><pre>a</pre></td></tr>
-<tr><td> b</td></tr>
-</tbody>
-</table>
+</tr></tbody></table>
 !! end
 
-# PHP + Tidy strips the list out of the table; Parsoid wraps it.
-# Parsoid generates the missing <td>, so wt2wt won't succeed.
 !! test
 Lists should be recognized in an implicit <td> context
 !! options
@@ -7037,13 +7028,10 @@ parsoid=wt2html,html2html
 <li>a</li>
 </ul>
 !! html/parsoid
-<table>
-<tr>
-<td><ul>
-<li>a</li>
-</ul></td>
-</tr>
-</table>
+<ul data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><li>a</li></ul><table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
+
+</tr></tbody></table>
 !! end
 
 !! test
@@ -7064,12 +7052,11 @@ Table cells not properly parsed in an implicit-td context
 !! html/parsoid
 <table>
 <tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
-<td style="background-color:#DC241f;" width="10px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":["",{"template":{"target":{"wt":"table_attribs_4","href":"./Template:Table_attribs_4"},"params":{},"i":0}}," "]}'> </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> a </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> b</td></tr>
-</tbody></table>
+<td style="background-color:#DC241f;" width="10px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"table_attribs_4","href":"./Template:Table_attribs_4"},"params":{},"i":0}}," || a || b"]}'> </td><td about="#mwt1"> a </td><td about="#mwt1"> b</td></tr>
 !! end
 
 !! test
-Parsoid: Round-trip tables directly followed by content (bug 51219)
+Parsoid: Round-trip tables directly followed by content (T53219)
 !! options
 parsoid=wt2html,wt2wt
 !! wikitext
@@ -7096,7 +7083,7 @@ parsoid=wt2html,wt2wt
 !! end
 
 !! test
-Parsoid: Default to a newline after tables in new content (bug 51219)
+Parsoid: Default to a newline after tables in new content (T53219)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -7505,7 +7492,7 @@ Piped link with no link text
 !! test
 Piped link with empty link text
 !! wikitext
-[[Main Page|<nowiki />]] - empty nowiki
+[[Main Page|<nowiki/>]] - empty nowiki
 [[Main Page| ]] - empty space
 [[Main Page|&nbsp;]] - empty non breaking space
 !! html/php
@@ -7514,7 +7501,7 @@ Piped link with empty link text
 <a href="/wiki/Main_Page" title="Main Page">&#160;</a> - empty non breaking space
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki />"}'/></a> - empty nowiki
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Nowiki"></span></a> - empty nowiki
 <a rel="mw:WikiLink" href="./Main_Page" title="Main Page"> </a> - empty space
 <a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></a> - empty non breaking space</p>
 !! end
@@ -7580,7 +7567,7 @@ Some text
 !! endarticle
 
 !! test
-Bug 43661: Piped links with identical prefixes
+T45661: Piped links with identical prefixes
 !! wikitext
 [[prefixed article|prefixed articles with spaces]]
 
@@ -7659,7 +7646,7 @@ Link with multiple pipes
 !! end
 
 !! test
-Anchor containing a #. (bug 63430)
+Anchor containing a #. (T65430)
 !! wikitext
 [[Main Page#And#Link]]
 !! html/php
@@ -7695,7 +7682,7 @@ This is an article in the MemoryAlpha namespace
 !! endarticle
 
 !! test
-Namespace takes precedence over interwiki link (bug 51680)
+Namespace takes precedence over interwiki link (T53680)
 !! wikitext
 [[MemoryAlpha:AlphaTest]]
 !! html
@@ -7834,7 +7821,7 @@ Link containing a tilde
 !! end
 
 !! test
-Link containing double-single-quotes '' (bug 4598)
+Link containing double-single-quotes '' (T6598)
 !! wikitext
 [[Lista d''e paise d''o munno]]
 !! html/php
@@ -7856,7 +7843,23 @@ Link containing double quotes and spaces
 !! end
 
 !! test
-Link containing double-single-quotes '' in text (bug 4598 sanity check)
+File containing double quotes and spaces
+!! wikitext
+[[File:Cool "Gator".png]]
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Cool_%22Gator%22.png" data-parsoid='{"a":{"href":"./File:Cool_%22Gator%22.png"},"sa":{"href":"File:Cool \"Gator\".png"}}'><img resource='./File:Cool_"Gator".png' src="./Special:FilePath/Cool_%22Gator%22.png" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Cool_\"Gator\".png","height":"220","width":"220","src":"./Special:FilePath/Cool_%22Gator%22.png"},"sa":{"resource":"File:Cool \"Gator\".png","src":"./Special:FilePath/Cool_\"Gator\".png"}}'/></a></span></p>
+!! end
+
+!! test
+Redirect containing double quotes and spaces
+!! wikitext
+#REDIRECT [[Cool "Gator"]]
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Cool_%22Gator%22" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Cool_%22Gator%22"},"sa":{"href":"Cool \"Gator\""}}'/>
+!! end
+
+!! test
+Link containing double-single-quotes '' in text (T6598 sanity check)
 !! wikitext
 Some [[Link|pretty ''italics'' and stuff]]!
 !! html/php
@@ -7867,7 +7870,7 @@ Some [[Link|pretty ''italics'' and stuff]]!
 !! end
 
 !! test
-Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
+Link containing double-single-quotes '' in text embedded in italics (T6598 sanity check)
 !! wikitext
 ''Some [[Link|pretty ''italics'' and stuff]]!''
 !! html
@@ -7899,7 +7902,7 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 !! end
 
 !! test
-Broken image links with HTML captions (bug 39700)
+Broken image links with HTML captions (T41700)
 !! wikitext
 [[File:Nonexistent|<script></script>]]
 [[File:Nonexistent|100x100px|<script></script>]]
@@ -7994,7 +7997,7 @@ Piped link to URL: [[http://www.example.com|an example URL]]
 !! end
 
 !! test
-BUG 2: [[page|http://url/]] should link to page, not http://url/
+T2002: [[page|http://url/]] should link to page, not http://url/
 !! wikitext
 [[Main Page|http://url/]]
 !! html/php
@@ -8006,7 +8009,7 @@ BUG 2: [[page|http://url/]] should link to page, not http://url/
 
 # Parsoid does not mark self-links, by design.
 !! test
-BUG 337: Escaped self-links should be bold
+T2337: Escaped self-links should be bold
 !! options
 title=[[Bug462]]
 !! wikitext
@@ -8078,7 +8081,7 @@ Non-breaking spaces in title
 !!end
 
 !! test
-Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue)
+Internal link with ca linktrail, surrounded by bold apostrophes (T29473 primary issue)
 !! options
 language=ca
 !! wikitext
@@ -8089,7 +8092,7 @@ language=ca
 !! end
 
 !! test
-Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue)
+Internal link with ca linktrail, surrounded by italic apostrophes (T29473 primary issue)
 !! options
 language=ca
 !! wikitext
@@ -8100,7 +8103,7 @@ language=ca
 !! end
 
 !! test
-Internal link with en linktrail: no apostrophes (bug 27473)
+Internal link with en linktrail: no apostrophes (T29473)
 !! options
 language=en
 !! wikitext
@@ -8111,7 +8114,7 @@ language=en
 !! end
 
 !! test
-Internal link with ca linktrail with apostrophes (bug 27473)
+Internal link with ca linktrail with apostrophes (T29473)
 !! options
 language=ca
 !! wikitext
@@ -8122,7 +8125,7 @@ language=ca
 !! end
 
 !! test
-Internal link with kaa linktrail with apostrophes (bug 27473)
+Internal link with kaa linktrail with apostrophes (T29473)
 !! options
 language=kaa
 !! wikitext
@@ -8133,7 +8136,7 @@ language=kaa
 !! end
 
 !! test
-Link with multiple ":" in a subpage-supporting namespace (bug 63636)
+Link with multiple ":" in a subpage-supporting namespace (T65636)
 !! wikitext
 [[User:Foo/Test/63636:Bar|Test]]
 !! html/php
@@ -8352,7 +8355,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Inline interwiki link with empty title (bug 2372)
+Inline interwiki link with empty title (T4372)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8365,7 +8368,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Interwiki link encoding conversion (bug 1636)
+Interwiki link encoding conversion (T3636)
 !! wikitext
 *[[Wikipedia:ro:Olteni&#0355;a]]
 *[[Wikipedia:ro:Olteni&#355;a]]
@@ -8381,7 +8384,7 @@ Interwiki link encoding conversion (bug 1636)
 !! end
 
 !! test
-Interwiki link with fragment (bug 2130)
+Interwiki link with fragment (T4130)
 !! wikitext
 [[MeatBall:SoftSecurity#foo]]
 !! html
@@ -8507,7 +8510,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Local interwiki link: prefix only (bug 64167)
+Local interwiki link: prefix only (T66167)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8520,7 +8523,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Local interwiki link: with additional interwiki prefix (bug 61357)
+Local interwiki link: with additional interwiki prefix (T63357)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -8615,7 +8618,7 @@ Blah blah blah
 !! end
 
 !! test
-Escaping of interlanguage links
+Escaping of interlanguage links (T129218, T156308)
 !! wikitext
 Blah blah blah
 [[:es:Spanish]]
@@ -8626,7 +8629,8 @@ Blah blah blah
 <a href="http://zh.wikipedia.org/wiki/Chinese" class="extiw" title="zh:Chinese"> zh : Chinese </a>
 </p>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Spanish" title="es:Spanish">es:Spanish</a>
+<p>Blah blah blah
+<a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Spanish" title="es:Spanish">es:Spanish</a>
 <a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese"> zh : Chinese </a></p>
 !! end
 
@@ -8662,7 +8666,7 @@ Blah blah blah
 !! end
 
 !! test
-Double interlanguage link, with prefix links (bug 8897)
+Double interlanguage link, with prefix links (T10897)
 !! options
 language=ln
 !! wikitext
@@ -8679,7 +8683,7 @@ Blah blah blah
 !! end
 
 !! test
-"Extra" interlanguage links (bug 32189 / gerrit 111390)
+"Extra" interlanguage links (T34189 / gerrit 111390)
 !! wikitext
 Blah blah blah
 [[mul:Article]]
@@ -8731,7 +8735,7 @@ language=ln
 !! end
 
 !! test
-Parsoid bug 53221: Wikilinks should be properly entity-escaped
+Parsoid T55221: Wikilinks should be properly entity-escaped
 !! options
 parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
@@ -8808,7 +8812,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-Handle interwiki links pointing to the current wiki as plain wiki links (bug 45209)
+Handle interwiki links pointing to the current wiki as plain wiki links (T47209)
 !! wikitext
 [[mi:Foo]]
 !! html/php
@@ -8819,7 +8823,7 @@ Handle interwiki links pointing to the current wiki as plain wiki links (bug 452
 !! end
 
 !! test
-Interlanguage link with preceding local interwiki link (bug 68085)
+Interlanguage link with preceding local interwiki link (T70085)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -9066,7 +9070,7 @@ Broken br tag sanitization
 </p>
 !! end
 
-# TODO: Fix html2html mode (bug 51055)!
+# TODO: Fix html2html mode (T53055)!
 !! test
 Parsoid: Broken br tag recognition
 !! options
@@ -9450,7 +9454,7 @@ parsoid
 !! end
 
 !! test
-List items are not parsed correctly following a <pre> block (bug 785)
+List items are not parsed correctly following a <pre> block (T2785)
 !! wikitext
 * <pre>foo</pre>
 * <pre>bar</pre>
@@ -9461,8 +9465,8 @@ List items are not parsed correctly following a <pre> block (bug 785)
 <li> zar</li></ul>
 
 !! html/parsoid
-<ul><li> <pre data-parsoid='{"stx":"html"}'>foo</pre></li>
-<li> <pre data-parsoid='{"stx":"html"}'>bar</pre></li>
+<ul><li> <pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre></li>
+<li> <pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"bar"}}'>bar</pre></li>
 <li> zar</li></ul>
 !! end
 
@@ -9659,7 +9663,7 @@ Unbalanced closing block tags break a list
 !! end
 
 # Parsoid fails this test, but it might be tricky to support properly.
-# See bug 68395.
+# See T70395.
 !! test
 Unbalanced closing non-block tags don't break a list
 (php parser relies on Tidy to fix up)
@@ -9701,7 +9705,7 @@ parsoid=wt2html,wt2wt,html2html
 <li><s> b </s></li></ol>
 !! end
 
-# See bug 68395.
+# See T70395.
 !!test
 1. List embedded in a formatting tag
 !! wikitext
@@ -9893,7 +9897,7 @@ Magic Word: {{CURRENTHOUR}}
 !! end
 
 !! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
+Magic Word: {{CURRENTWEEK}} (T6594)
 !! wikitext
 {{CURRENTWEEK}}
 !! html
@@ -10240,7 +10244,7 @@ title=[['foo & bar = baz']]
 !! end
 
 !! test
-Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
+Magic Word: {{PAGENAME}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
 !! wikitext
@@ -10264,7 +10268,7 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 !! end
 
 !! test
-Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
+Magic Word: {{PAGENAMEE}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
 !! wikitext
@@ -10415,7 +10419,7 @@ Namespace 1 {{ns:01}}
 !! end
 
 !! test
-Namespace 0 {{ns:0}} (bug 4783)
+Namespace 0 {{ns:0}} (T6783)
 !! wikitext
 {{ns:0}}
 !! html
@@ -10423,7 +10427,7 @@ Namespace 0 {{ns:0}} (bug 4783)
 !! end
 
 !! test
-Namespace 0 {{ns:00}} (bug 4783)
+Namespace 0 {{ns:00}} (T6783)
 !! wikitext
 {{ns:00}}
 !! html
@@ -10567,7 +10571,7 @@ __proto__
 ### Magic links
 ###
 !! test
-Magic links: internal link to RFC (bug 479)
+Magic links: internal link to RFC (T2479)
 !! wikitext
 [[RFC 123]]
 !! html/php
@@ -10578,7 +10582,7 @@ Magic links: internal link to RFC (bug 479)
 !! end
 
 !! test
-Magic links: RFC (bug 479)
+Magic links: RFC (T2479)
 !! wikitext
 RFC 822
 !! html/php
@@ -10589,7 +10593,7 @@ RFC 822
 !! end
 
 !! test
-Magic links: RFC (bug 65278)
+Magic links: RFC (T67278)
 !! wikitext
 This is RFC 822 but thisRFC 822 is not RFC 822linked.
 !! html/php
@@ -10600,7 +10604,7 @@ This is RFC 822 but thisRFC 822 is not RFC 822linked.
 !! end
 
 !! test
-Magic links: RFC (w/ non-newline whitespace, bug 28950/29025)
+Magic links: RFC (w/ non-newline whitespace, T30950/T31025)
 !! wikitext
 RFC &nbsp;&#160;&#0160;&#xA0;&#Xa0; 822
 RFC
@@ -10617,7 +10621,7 @@ RFC
 !! end
 
 !! test
-Magic links: ISBN (bug 1937)
+Magic links: ISBN (T3937)
 !! wikitext
 ISBN 0-306-40615-2
 !! html/php
@@ -10628,7 +10632,7 @@ ISBN 0-306-40615-2
 !! end
 
 !! test
-Magic links: ISBN (bug 65278)
+Magic links: ISBN (T67278)
 !! wikitext
 This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.
 !! html/php
@@ -10639,7 +10643,7 @@ This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-
 !! end
 
 !! test
-Magic links: ISBN (w/ non-newline whitespace, bug 28950/29025)
+Magic links: ISBN (w/ non-newline whitespace, T30950/T31025)
 !! wikitext
 ISBN &nbsp;&#160;&#0160;&#xA0;&#Xa0; 978&nbsp;0&#160;316&#0160;09811&#xA0;3
 ISBN
@@ -10673,7 +10677,7 @@ PMID 1234
 !! end
 
 !! test
-Magic links: PMID (bug 65278)
+Magic links: PMID (T67278)
 !! wikitext
 This is PMID 1234 but thisPMID 1234 is not PMID 1234linked.
 !! html/php
@@ -10684,7 +10688,7 @@ This is PMID 1234 but thisPMID 1234 is not PMID 1234linked.
 !! end
 
 !! test
-Magic links: PMID (w/ non-newline whitespace, bug 28950/29025)
+Magic links: PMID (w/ non-newline whitespace, T30950/T31025)
 !! wikitext
 PMID &nbsp;&#160;&#0160;&#xA0;&#Xa0; 1234
 PMID
@@ -10775,7 +10779,7 @@ Template with invalid target containing wikilink
 !! end
 
 !! test
-Template with just whitespace in it, bug #68421
+Template with just whitespace in it, T70421
 !! wikitext
 {{echo|{{ }}}}
 !! html/parsoid
@@ -10993,7 +10997,7 @@ Template with complex arguments
 !! end
 
 !! test
-BUG 553: link with two variables in a piped link
+T2553: link with two variables in a piped link
 !! wikitext
 {|
 |[[{{{1}}}|{{{2}}}]]
@@ -11154,7 +11158,7 @@ Template:table
 !! endarticle
 
 !! test
-BUG 529: Template with table, not included at beginning of line
+T2529: Template with table, not included at beginning of line
 !! wikitext
 foo {{table}}
 !! html
@@ -11173,7 +11177,7 @@ foo {{table}}
 !! end
 
 !! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
+T2523: Template shouldn't eat newline (or add an extra one before table)
 !! wikitext
 foo
 {{table}}
@@ -11193,7 +11197,7 @@ foo
 !! end
 
 !! test
-BUG 41: Template parameters shown as broken links
+T2041: Template parameters shown as broken links
 !! wikitext
 {{{parameter}}}
 !! html
@@ -11441,7 +11445,7 @@ Template:Includeonly section
 !!endarticle
 
 !! test
-Bug 6563: Edit link generation for section shown by <includeonly>
+T8563: Edit link generation for section shown by <includeonly>
 !! wikitext
 {{includeonly section}}
 !! html
@@ -11452,7 +11456,7 @@ Bug 6563: Edit link generation for section shown by <includeonly>
 
 # Uses same input as the contents of [[Template:Includeonly section]]
 !! test
-Bug 6563: Section extraction for section shown by <includeonly>
+T8563: Section extraction for section shown by <includeonly>
 !! options
 section=T-2
 !! wikitext
@@ -11465,7 +11469,7 @@ section=T-2
 !! end
 
 !! test
-Bug 6563: Edit link generation for section suppressed by <includeonly>
+T8563: Edit link generation for section suppressed by <includeonly>
 !! wikitext
 <includeonly>
 ==Includeonly section==
@@ -11477,7 +11481,7 @@ Bug 6563: Edit link generation for section suppressed by <includeonly>
 !! end
 
 !! test
-Bug 6563: Section extraction for section suppressed by <includeonly>
+T8563: Section extraction for section suppressed by <includeonly>
 !! options
 section=1
 !! wikitext
@@ -12240,11 +12244,11 @@ Templates: HTML Tables: 5. Proper fostering of categories from inside
 parsoid=wt2html,wt2wt
 !! wikitext
 <table>[[Category:foo1]]<tr><td>foo</td></tr></table>
-<!--Two categories (Bug 50330)-->
+<!--Two categories (T52330)-->
 <table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>
 !! html
 <link rel="mw:PageProp/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table>
-<!--Two categories (Bug 50330)-->
+<!--Two categories (T52330)-->
 <link rel="mw:PageProp/Category" href="./Category:Bar1"><link rel="mw:PageProp/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
 !!end
 
@@ -12556,7 +12560,7 @@ Templates: Ugly templates: 4. newline-only template parameter inconsistency
 </p>
 !! end
 
-# Bug 64017 -- ugly wikitext with fostered content generates two template ranges that
+# T66017 -- ugly wikitext with fostered content generates two template ranges that
 # have a true overlap (T1-start - T2-start - T1-end - T2-end).
 !! test
 Templates: Ugly templates: 5. Template encapsulation test: Non-trivial overlap of template ranges is properly handled
@@ -12570,7 +12574,7 @@ Templates: Ugly templates: 5. Template encapsulation test: Non-trivial overlap o
 </table>
 !! end
 
-# Bug 64017 -- ugly wikitext with fostered content generates two template ranges
+# T66017 -- ugly wikitext with fostered content generates two template ranges
 # that are "identical" and generate nesting cycles in the algorithm
 !! test
 Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of template ranges is properly handled
@@ -12661,7 +12665,7 @@ pst
 MediaWiki
 !! end
 
-# This is bug 89, which I fixed. -- wtm
+# This is T2089, which I fixed. -- wtm
 !! test
 pre-save transform: subst: templates with parameters
 !! options
@@ -12679,7 +12683,7 @@ Template:nowikitest
 !! endarticle
 
 !! test
-pre-save transform: nowiki in subst (bug 1188)
+pre-save transform: nowiki in subst (T3188)
 !! options
 pst
 !! wikitext
@@ -12695,7 +12699,7 @@ This template has <!-- a comment --> in it.
 !! endarticle
 
 !! test
-pre-save transform: comment in subst (bug 1936)
+pre-save transform: comment in subst (T3936)
 !! options
 pst
 !! wikitext
@@ -12744,7 +12748,7 @@ Template:dangerous
 !!endarticle
 
 !!test
-(confirming safety of fix for subst bug 1936)
+(confirming safety of fix for subst T3936)
 !! wikitext
 {{Template:dangerous}}
 !! html
@@ -12753,7 +12757,7 @@ Template:dangerous
 !! end
 
 !! test
-pre-save transform: comment containing gallery (bug 5024)
+pre-save transform: comment containing gallery (T7024)
 !! options
 pst
 !! wikitext
@@ -12783,7 +12787,7 @@ pst
 !!end
 
 !! test
-pre-save transform: <noinclude> in subst (bug 3298)
+pre-save transform: <noinclude> in subst (T5298)
 !! options
 pst
 !! wikitext
@@ -12793,7 +12797,7 @@ Foobar
 !! end
 
 !! test
-pre-save transform: <onlyinclude> in subst (bug 3298)
+pre-save transform: <onlyinclude> in subst (T5298)
 !! options
 pst
 !! wikitext
@@ -12815,7 +12819,7 @@ Template:SafeSubstTest
 !! endarticle
 
 !! test
-bug 22297: safesubst: works during PST
+T24297: safesubst: works during PST
 !! options
 pst
 !! wikitext
@@ -12825,7 +12829,7 @@ FoobarFoobar
 !! end
 
 !! test
-bug 22297: safesubst: works during normal parse
+T24297: safesubst: works during normal parse
 !! wikitext
 {{SafeSubstTest}}
 !! html
@@ -12983,7 +12987,7 @@ pst title=[[Ns:Somearticle (IGNORED), Context]]
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
+pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, T32149)
 !! options
 pst
 !! wikitext
@@ -13003,7 +13007,7 @@ pst
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
+pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, T32149)
 !! options
 pst
 !! wikitext
@@ -13023,7 +13027,7 @@ pst
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
+pre-save transform: context links ("pipe trick") with parens and no space (Korean style, T32149)
 !! options
 pst
 !! wikitext
@@ -13043,7 +13047,7 @@ pst
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with commas (bug 21660)
+pre-save transform: context links ("pipe trick") with commas (T23660)
 !! options
 pst
 !! wikitext
@@ -13094,7 +13098,7 @@ pst
 
 
 !! test
-pre-save transform: Signature expansion in nowiki tags (bug 93)
+pre-save transform: Signature expansion in nowiki tags (T2093)
 !! options
 pst disabled
 !! wikitext
@@ -13217,7 +13221,7 @@ msg
 !! end
 
 !! test
-message transform: <noinclude> in transcluded template (bug 4926)
+message transform: <noinclude> in transcluded template (T6926)
 !! options
 msg
 !! wikitext
@@ -13227,7 +13231,7 @@ Foobar
 !! end
 
 !! test
-message transform: <onlyinclude> in transcluded template (bug 4926)
+message transform: <onlyinclude> in transcluded template (T6926)
 !! options
 msg
 !! wikitext
@@ -13349,7 +13353,7 @@ Image with caption
 !! end
 
 !! test
-Image with caption, bug 53312 #1
+Image with caption, T55312 #1
 !! wikitext
 [[File:Foobar.jpg|right|Caption page stuff]]
 !! html/php
@@ -13360,7 +13364,7 @@ Image with caption, bug 53312 #1
 !! end
 
 !! test
-Image with caption, bug 53312 #2
+Image with caption, T55312 #2
 !! wikitext
 [[File:Foobar.jpg|right|Caption page=]]
 !! html/php
@@ -13371,7 +13375,7 @@ Image with caption, bug 53312 #2
 !! end
 
 !! test
-Image with caption, bug 53312 #3
+Image with caption, T55312 #3
 !! wikitext
 [[File:Foobar.jpg|right|Caption page=stuff]]
 !! html/php
@@ -13382,7 +13386,7 @@ Image with caption, bug 53312 #3
 !! end
 
 !! test
-Allow empty links in image captions (Bug 60753)
+Allow empty links in image captions (T62753)
 !! options
 thumbsize=220
 !! wikitext
@@ -13544,7 +13548,7 @@ Image with multiple widths -- use last
 !! end
 
 !! test
-Image with multiple alignments -- use first (bug 48664)
+Image with multiple alignments -- use first (T50664)
 !! options
 thumbsize=220
 !! wikitext
@@ -13579,7 +13583,7 @@ Image with width attribute at different positions
 
 # a sad bit of backward-compatibility
 !! test
-Image with size specified with pxpx (bug 13500, 51628)
+Image with size specified with pxpx (T15500, T53628)
 !! options
 parsoid=wt2html,wt2wt,html2html
 !! wikitext
@@ -13604,7 +13608,7 @@ Image with link parameter, wiki target
 <p><span class="mw-default-size" typeof="mw:Image"><a href="./Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
-# parsoid bug 49293 (part 1)
+# parsoid T51293 (part 1)
 !! test
 Image with link parameter, URL target
 !! wikitext
@@ -13616,7 +13620,7 @@ Image with link parameter, URL target
 <p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></span></p>
 !! end
 
-# parsoid bug 49293 (part 2)
+# parsoid T51293 (part 2)
 !! test
 Image with link parameter, protocol-less URL target
 !! wikitext
@@ -14066,7 +14070,7 @@ Add test with existing image page
 !! end
 
 !! test
-bug 18784  Link to non-existent image page with caption should use caption as link text
+T20784  Link to non-existent image page with caption should use caption as link text
 !! wikitext
 [[:Image:test|caption]]
 !! html
@@ -14151,7 +14155,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-BUG 1887: A ISBN with a thumbnail
+T3887: A ISBN with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|ISBN 1235467890]]
 !! html/php
@@ -14162,7 +14166,7 @@ BUG 1887: A ISBN with a thumbnail
 !! end
 
 !! test
-BUG 1887: A RFC with a thumbnail
+T3887: A RFC with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|This is RFC 12354]]
 !! html/php
@@ -14173,7 +14177,7 @@ BUG 1887: A RFC with a thumbnail
 !! end
 
 !! test
-BUG 1887: A mailto link with a thumbnail
+T3887: A mailto link with a thumbnail
 !! wikitext
 [[File:Foobar.jpg|thumb|Please mailto:nobody@example.com]]
 !! html/php
@@ -14183,9 +14187,9 @@ BUG 1887: A mailto link with a thumbnail
 <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>Please <a rel="mw:ExtLink" href="mailto:nobody@example.com">mailto:nobody@example.com</a></figcaption></figure>
 !! end
 
-# Pending resolution to bug 368
+# Pending resolution to T2368
 !! test
-BUG 648: Frameless image caption with a link
+T2648: Frameless image caption with a link
 !! wikitext
 [[File:Foobar.jpg|text with a [[link]] in it]]
 !! html/php
@@ -14196,7 +14200,7 @@ BUG 648: Frameless image caption with a link
 !! end
 
 !! test
-BUG 648: Frameless image caption with a link (suffix)
+T2648: Frameless image caption with a link (suffix)
 !! wikitext
 [[File:Foobar.jpg|text with a [[link]]foo in it]]
 !! html/php
@@ -14207,7 +14211,7 @@ BUG 648: Frameless image caption with a link (suffix)
 !! end
 
 !! test
-BUG 648: Frameless image caption with an interwiki link
+T2648: Frameless image caption with an interwiki link
 !! wikitext
 [[File:Foobar.jpg|text with a [[MeatBall:Link]] in it]]
 !! html/php
@@ -14218,7 +14222,7 @@ BUG 648: Frameless image caption with an interwiki link
 !! end
 
 !! test
-BUG 648: Frameless image caption with a piped interwiki link
+T2648: Frameless image caption with a piped interwiki link
 !! wikitext
 [[File:Foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
 !! html/php
@@ -14272,7 +14276,7 @@ Entities in file name and attributes
 !! end
 
 !! test
-BUG 499: Alt text should have &#1234;, not &amp;1234;
+T2499: Alt text should have &#1234;, not &amp;1234;
 !! wikitext
 [[File:Foobar.jpg|&#9792;]]
 !! html/php
@@ -14356,7 +14360,7 @@ and some more text.]]
 !! end
 
 !! test
-Bug 3090: External links other than http: in image captions
+T5090: External links other than http: in image captions
 !! wikitext
 [[File:Foobar.jpg|thumb|200x200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
 !! html/php
@@ -14435,7 +14439,7 @@ parsoid=wt2html,wt2wt,html2html
 
 # Note that 'right' is the default alignment, despite the misspelled 'righ' below
 !! test
-Invalid image attributes (bug 62500)
+Invalid image attributes (T64500)
 !! options
 thumbsize=220
 parsoid=wt2html,wt2wt,html2html
@@ -14804,7 +14808,7 @@ Parsoid: dot-slash prefixed wikilinks
 !! end
 
 !! test
-Render invalid page names as plain text (bug 51090)
+Render invalid page names as plain text (T53090)
 !! wikitext
 [[./../foo|bar]]
 [[foo�|bar]]
@@ -14886,7 +14890,7 @@ Disabled subpages
 !! end
 
 !! test
-BUG 561: {{/Subpage}}
+T2561: {{/Subpage}}
 !! options
 subpage title=[[Page]]
 !! wikitext
@@ -15085,7 +15089,7 @@ Bar
 ##
 ## The whitespace on the empty line is part of the test. Please do not delete
 !! test
-1. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
+1. Categories and newlines: All preceding newlines should be suppressed (courtesy T2087)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -15114,7 +15118,7 @@ This
 ##
 ## The whitespace on the empty line is part of the test. Please do not delete
 !! test
-2. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
+2. Categories and newlines: All preceding newlines should be suppressed (courtesy T2087)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -15310,7 +15314,7 @@ parsoid
 !! end
 
 !! test
-Normalize hrefs properly before testing for invalid link targets (bug 70894)
+Normalize hrefs properly before testing for invalid link targets (T72894)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -15355,7 +15359,7 @@ es:Alimento fr:Nourriture zh:食品
 !! end
 
 !! test
-Duplicate interlanguage links (bug 24502)
+Duplicate interlanguage links (T26502)
 !! options
 ill
 !! wikitext
@@ -15582,7 +15586,7 @@ __FORCETOC__
 !! end
 
 !! test
-TOC with wgMaxTocLevel=3 (bug 6204)
+TOC with wgMaxTocLevel=3 (T8204)
 !! options
 wgMaxTocLevel=3
 !! wikitext
@@ -15619,7 +15623,7 @@ wgMaxTocLevel=3
 !! end
 
 !! test
-TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
+TOC with wgMaxTocLevel=3 and two level four headings (T8204)
 !! options
 wgMaxTocLevel=3
 !! wikitext
@@ -15661,7 +15665,7 @@ Resolving duplicate section names
 !! end
 
 !! test
-Resolving duplicate section names with differing case (bug 10721)
+Resolving duplicate section names with differing case (T12721)
 !! wikitext
 == Foo bar ==
 == Foo Bar ==
@@ -15740,7 +15744,7 @@ __TOC__
 !! end
 
 !! test
-BUG 1219 URL next to image (good)
+T3219 URL next to image (good)
 !! wikitext
 http://example.com [[File:Foobar.jpg]]
 !! html/php
@@ -15751,7 +15755,7 @@ http://example.com [[File:Foobar.jpg]]
 !!end
 
 !! test
-Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910)
+Short headings with trailing space should match behavior of Parser::doHeadings (T21910)
 !! wikitext
 === 
 The line above must have a trailing space!
@@ -15768,7 +15772,7 @@ But just in case it doesn't...
 !! end
 
 !! test
-Header with special characters (bug 25462)
+Header with special characters (T27462)
 !! wikitext
 The tooltips shall not show entities to the user (ie. be double escaped)
 
@@ -15911,7 +15915,7 @@ Headers with excess '=' characters
 !! end
 
 !! test
-HTML headers vs TOC (bug 23393)
+HTML headers vs TOC (T25393)
 (__NOEDITSECTION__ for clearer output, doesn't matter here)
 !! wikitext
 <h1>Header 1</h1>
@@ -15968,7 +15972,7 @@ c3-->
 !! end
 
 !! test
-BUG 1219 URL next to image (broken)
+T3219 URL next to image (broken)
 !! wikitext
 http://example.com[[File:Foobar.jpg]]
 !! html/php
@@ -15979,7 +15983,7 @@ http://example.com[[File:Foobar.jpg]]
 !!end
 
 !! test
-Bug 1186 news: in the middle of text
+T3186 news: in the middle of text
 !! wikitext
 http://en.wikinews.org/wiki/Wikinews:Workplace
 !! html
@@ -16237,10 +16241,10 @@ HTML tag with leading space is parsed as text
 !! end
 
 ###
-### Nesting tests (see bug 41545, 50604, 51081)
+### Nesting tests (see T43545, T52604, T53081)
 ###
 
-# This test case is fixed in Parsoid by domino 1.0.12. (bug 50604)
+# This test case is fixed in Parsoid by domino 1.0.12. (T52604)
 # Note that html2wt is considerably more difficult if we use <b> in
 # the test case, instead of <small>
 !! test
@@ -16252,7 +16256,7 @@ Ensure that HTML adoption agency algorithm is properly implemented.
 </p>
 !! end
 
-# This was bug 41545 in the PHP parser.
+# This was T43545 in the PHP parser.
 # Note that tidy doesn't handle this correctly.
 !! test
 Nesting of <kbd>
@@ -16263,9 +16267,9 @@ Nesting of <kbd>
 </p>
 !! end
 
-# The following cases were bug 51081 in the PHP parser.
+# The following cases were T53081 in the PHP parser.
 # Note that there are some other nestable tags (b, i, etc) which are
-# not covered; see bug 51081 for discussion.
+# not covered; see T53081 for discussion.
 
 # Note that tidy doesn't handle this correctly.
 !! test
@@ -16353,7 +16357,7 @@ Media link with nasty text
 !! end
 
 !! test
-Media link to nonexistent file (bug 1702)
+Media link to nonexistent file (T3702)
 !! wikitext
 [[Media:No such.jpg]]
 !! html
@@ -16362,7 +16366,7 @@ Media link to nonexistent file (bug 1702)
 !! end
 
 !! test
-Image link to nonexistent file (bug 1850 - good)
+Image link to nonexistent file (T3850 - good)
 !! wikitext
 [[File:No_such.jpg]]
 !! html/php
@@ -16373,7 +16377,7 @@ Image link to nonexistent file (bug 1850 - good)
 !! end
 
 !! test
-:Image link to nonexistent file (bug 1850 - bad)
+:Image link to nonexistent file (T3850 - bad)
 !! wikitext
 [[:Image:No such.jpg]]
 !! html/php
@@ -16386,7 +16390,7 @@ Image link to nonexistent file (bug 1850 - good)
 
 
 !! test
-Character reference normalization in link text (bug 1938)
+Character reference normalization in link text (T3938)
 !! wikitext
 [[Main Page|this&that]]
 !! html
@@ -16403,7 +16407,7 @@ The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 !! endarticle
 
 !! test
-(bug 19451) Links should refer to the normalized form.
+(T21451) Links should refer to the normalized form.
 !! wikitext
 [[&#xFB2E;]]
 [[&#x5d0;&#x5b7;]]
@@ -16420,7 +16424,7 @@ The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 !! end
 
 !! test
-Empty attribute crash test (bug 2067)
+Empty attribute crash test (T4067)
 !! wikitext
 <font color="">foo</font>
 !! html
@@ -16429,7 +16433,7 @@ Empty attribute crash test (bug 2067)
 !! end
 
 !! test
-Empty attribute crash test single-quotes (bug 2067)
+Empty attribute crash test single-quotes (T4067)
 !! wikitext
 <font color=''>foo</font>
 !! html
@@ -16488,7 +16492,7 @@ parsoid=wt2html,html2html
 !! end
 
 !! test
-Bug 2095: link with three closing brackets
+T4095: link with three closing brackets
 !! wikitext
 [[Main Page]]]
 !! html/php
@@ -16499,7 +16503,7 @@ Bug 2095: link with three closing brackets
 !! end
 
 !! test
-Bug 2095: link with pipe and three closing brackets
+T4095: link with pipe and three closing brackets
 !! wikitext
 [[Main Page|link]]]
 !! html/php
@@ -16510,7 +16514,7 @@ Bug 2095: link with pipe and three closing brackets
 !! end
 
 !! test
-Bug 2095: link with pipe and three closing brackets, version 2
+T4095: link with pipe and three closing brackets, version 2
 !! wikitext
 [[Main Page|[http://example.com/]]]
 !! html/php
@@ -16544,7 +16548,7 @@ Template:Div style
 !! endarticle
 
 !! test
-Bug 2304: HTML attribute safety (safe template; regression bug 2309)
+T4304: HTML attribute safety (safe template; regression T4309)
 !! wikitext
 <div title="{{test}}"></div>
 !! html/php
@@ -16556,7 +16560,7 @@ Bug 2304: HTML attribute safety (safe template; regression bug 2309)
 
 # Parsoid has enough context to handle this case
 !! test
-Bug 2304: HTML attribute safety (dangerous template; 2309)
+T4304: HTML attribute safety (dangerous template; 2309)
 !! wikitext
 <div title="{{dangerous attribute}}"></div>
 !! html/php
@@ -16567,7 +16571,7 @@ Bug 2304: HTML attribute safety (dangerous template; 2309)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (dangerous style template; 2309)
+T4304: HTML attribute safety (dangerous style template; 2309)
 !! wikitext
 <div style="{{dangerous style attribute}}"></div>
 !! html/php
@@ -16578,7 +16582,7 @@ Bug 2304: HTML attribute safety (dangerous style template; 2309)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (safe parameter; 2309)
+T4304: HTML attribute safety (safe parameter; 2309)
 !! wikitext
 {{div style|width: 200px}}
 !! html/php
@@ -16589,7 +16593,7 @@ Bug 2304: HTML attribute safety (safe parameter; 2309)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (unsafe parameter; 2309)
+T4304: HTML attribute safety (unsafe parameter; 2309)
 !! wikitext
 {{div style|width: expression(alert(document.cookie))}}
 !! html/php
@@ -16601,7 +16605,7 @@ Bug 2304: HTML attribute safety (unsafe parameter; 2309)
 
 ## Parsoid output here differs; needs investigation.
 !! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
+T4304: HTML attribute safety (unsafe breakout parameter; 2309)
 !! wikitext
 {{div style|"><script>alert(document.cookie)</script>}}
 !! html
@@ -16611,7 +16615,7 @@ Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
 
 ## Parsoid output here differs; needs investigation.
 !! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
+T4304: HTML attribute safety (unsafe breakout parameter 2; 2309)
 !! wikitext
 {{div style|" ><script>alert(document.cookie)</script>}}
 !! html
@@ -16620,7 +16624,7 @@ Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (link)
+T4304: HTML attribute safety (link)
 !! wikitext
 <div title="[[Main Page]]"></div>
 !! html
@@ -16629,7 +16633,7 @@ Bug 2304: HTML attribute safety (link)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (italics)
+T4304: HTML attribute safety (italics)
 !! wikitext
 <div title="''foobar''"></div>
 !! html
@@ -16638,7 +16642,7 @@ Bug 2304: HTML attribute safety (italics)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (bold)
+T4304: HTML attribute safety (bold)
 !! wikitext
 <div title="'''foobar'''"></div>
 !! html
@@ -16647,7 +16651,7 @@ Bug 2304: HTML attribute safety (bold)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (ISBN)
+T4304: HTML attribute safety (ISBN)
 !! wikitext
 <div title="ISBN 1234567890"></div>
 !! html
@@ -16656,7 +16660,7 @@ Bug 2304: HTML attribute safety (ISBN)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (RFC)
+T4304: HTML attribute safety (RFC)
 !! wikitext
 <div title="RFC 1234"></div>
 !! html
@@ -16665,7 +16669,7 @@ Bug 2304: HTML attribute safety (RFC)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (PMID)
+T4304: HTML attribute safety (PMID)
 !! wikitext
 <div title="PMID 1234567890"></div>
 !! html
@@ -16674,7 +16678,7 @@ Bug 2304: HTML attribute safety (PMID)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (web link)
+T4304: HTML attribute safety (web link)
 !! wikitext
 <div title="http://example.com/"></div>
 !! html
@@ -16683,7 +16687,7 @@ Bug 2304: HTML attribute safety (web link)
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (named web link)
+T4304: HTML attribute safety (named web link)
 !! wikitext
 <div title="[http://example.com/ link]"></div>
 !! html
@@ -16692,7 +16696,7 @@ Bug 2304: HTML attribute safety (named web link)
 !! end
 
 !! test
-Bug 3244: HTML attribute safety (extension; safe)
+T5244: HTML attribute safety (extension; safe)
 !! wikitext
 <div style="<nowiki>background:blue</nowiki>"></div>
 !! html/php
@@ -16703,7 +16707,7 @@ Bug 3244: HTML attribute safety (extension; safe)
 !! end
 
 !! test
-Bug 3244: HTML attribute safety (extension; unsafe)
+T5244: HTML attribute safety (extension; unsafe)
 !! wikitext
 <div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
 !! html/php
@@ -16760,7 +16764,7 @@ MSIE CSS safety test: comment in expression
 !! end
 
 !! test
-CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
+CSS safety test (all browsers): vertical tab (T57332 / CVE-2013-4567)
 !! wikitext
 <p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
 !! html/php
@@ -16771,7 +16775,7 @@ CSS safety test (all browsers): vertical tab (bug 55332 / CVE-2013-4567)
 !! end
 
 !! test
-MSIE 6 CSS safety test: Fullwidth (bug 55332)
+MSIE 6 CSS safety test: Fullwidth (T57332)
 !! wikitext
 <p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
 <div style="top:EXPRESSION(alert())">B</div>
@@ -16785,7 +16789,7 @@ MSIE 6 CSS safety test: Fullwidth (bug 55332)
 !! end
 
 !! test
-MSIE 6 CSS safety test: IPA extensions (bug 55332)
+MSIE 6 CSS safety test: IPA extensions (T57332)
 !! wikitext
 <div style="background-image:uʀʟ(javascript:alert())">A</div>
 <p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
@@ -16799,7 +16803,7 @@ MSIE 6 CSS safety test: IPA extensions (bug 55332)
 !! end
 
 !! test
-MSIE 6 CSS safety test: sup/sub script (bug 55332)
+MSIE 6 CSS safety test: sup/sub script (T57332)
 !! wikitext
 <div style="background-image:url⁽javascript:alert())">A</div>
 <div style="background-image:url₍javascript:alert())">B</div>
@@ -16831,7 +16835,7 @@ style="-o-link:attr(title);-o-link-source:current">X</div>
 !! end
 
 !! test
-MSIE 6 CSS safety test: Repetition markers (bug 55332)
+MSIE 6 CSS safety test: Repetition markers (T57332)
 !! wikitext
 <p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
 <p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
@@ -16912,7 +16916,7 @@ Template:Identity
 !! endarticle
 
 !! test
-Expansion of multi-line templates in attribute values (bug 6255)
+Expansion of multi-line templates in attribute values (T8255)
 !! wikitext
 <div style="background: {{identity|#00FF00}}">-</div>
 !! html
@@ -16921,20 +16925,20 @@ Expansion of multi-line templates in attribute values (bug 6255)
 !! end
 
 !! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check)
+Expansion of multi-line templates in attribute values (T8255 sanity check)
 !! wikitext
-<div style="background: 
+<div style="background:
 #00FF00">-</div>
 !! html/php
 <div style="background: #00FF00">-</div>
 
 !! html/parsoid
-<div style="background: 
+<div style="background:
 #00FF00">-</div>
 !! end
 
 !! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
+Expansion of multi-line templates in attribute values (T8255 sanity check 2)
 !! wikitext
 <div style="background: &#10;#00FF00">-</div>
 !! html
@@ -17110,7 +17114,7 @@ array (
 !! end
 
 !! test
-Parser hook: argument containing a forward slash (bug 5344)
+Parser hook: argument containing a forward slash (T7344)
 !! wikitext
 <tag filename="/tmp/bla"></tag>
 !! html/php
@@ -17127,7 +17131,7 @@ array (
 
 ## Don't expect parsoid to rt this form.
 !! test
-Parser hook: empty input using terminated empty elements (bug 2374)
+Parser hook: empty input using terminated empty elements (T4374)
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -17147,7 +17151,7 @@ array (
 ## </tag> should be output literally since there is no matching tag that begins it
 ## Don't expect parsoid to rt this form.
 !! test
-Parser hook: basic arguments using terminated empty elements (bug 2374)
+Parser hook: basic arguments using terminated empty elements (T4374)
 !! options
 parsoid=wt2html
 !! wikitext
@@ -17311,7 +17315,7 @@ Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=
 # In HTML5, the restrictions are that id must contain at least one character,
 # and must not contain any space characters.
 !! test
-Sanitizer: Validating the contents of the id attribute (bug 4515)
+Sanitizer: Validating the contents of the id attribute (T6515)
 !! options
 disabled
 !! wikitext
@@ -17322,7 +17326,7 @@ Something ...
 
 # In HTML5, id must be unique amongst all the ids in the element's home subtree.
 !! test
-Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
+Sanitizer: Validating id attribute uniqueness (T6515, T8301)
 !! options
 disabled
 !! wikitext
@@ -17356,7 +17360,7 @@ Sanitizer: Validating that <meta> and <link> work, but only for Microdata
 !! end
 
 !! test
-Language converter: output gets cut off unexpectedly (bug 5757)
+Language converter: output gets cut off unexpectedly (T7757)
 !! options
 language=zh
 !! wikitext
@@ -17376,7 +17380,7 @@ all additional text is vanished
 !! end
 
 !! test
-Self closed html pairs (bug 5487)
+Self closed html pairs (T7487)
 !! options
 !! wikitext
 <center><font id="bug" />Centered text</center>
@@ -17401,7 +17405,7 @@ C'est grave !
 !! end
 
 !! test
-Punctuation: CSS !important (bug 11874)
+Punctuation: CSS !important (T13874)
 !! wikitext
 <div style="width:50% !important">important</div>
 !! html
@@ -17410,7 +17414,7 @@ Punctuation: CSS !important (bug 11874)
 !!end
 
 !! test
-Punctuation: CSS ! important (bug 11874; with space after)
+Punctuation: CSS ! important (T13874; with space after)
 !! wikitext
 <div style="width:50% ! important">important</div>
 !! html
@@ -17419,7 +17423,7 @@ Punctuation: CSS ! important (bug 11874; with space after)
 !!end
 
 !! test
-HTML bullet list, closed tags (bug 5497)
+HTML bullet list, closed tags (T7497)
 !! wikitext
 <ul>
 <li>One</li>
@@ -17440,7 +17444,7 @@ HTML bullet list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML bullet list, unclosed tags (bug 5497)
+HTML bullet list, unclosed tags (T7497)
 !! wikitext
 <ul>
 <li>One
@@ -17460,7 +17464,7 @@ HTML bullet list, unclosed tags (bug 5497)
 !! end
 
 !! test
-HTML ordered list, closed tags (bug 5497)
+HTML ordered list, closed tags (T7497)
 !! wikitext
 <ol>
 <li>One</li>
@@ -17481,7 +17485,7 @@ HTML ordered list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML ordered list, unclosed tags (bug 5497)
+HTML ordered list, unclosed tags (T7497)
 !! options
 !! wikitext
 <ol>
@@ -17502,7 +17506,7 @@ HTML ordered list, unclosed tags (bug 5497)
 !! end
 
 !! test
-HTML nested bullet list, closed tags (bug 5497)
+HTML nested bullet list, closed tags (T7497)
 !! wikitext
 <ul>
 <li>One</li>
@@ -17537,7 +17541,7 @@ HTML nested bullet list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML nested bullet list, open tags (bug 5497)
+HTML nested bullet list, open tags (T7497)
 !! wikitext
 <ul>
 <li>One
@@ -17574,7 +17578,7 @@ HTML nested bullet list, open tags (bug 5497)
 !! end
 
 !! test
-HTML nested ordered list, closed tags (bug 5497)
+HTML nested ordered list, closed tags (T7497)
 !! wikitext
 <ol>
 <li>One</li>
@@ -17599,7 +17603,7 @@ HTML nested ordered list, closed tags (bug 5497)
 !! end
 
 !! test
-HTML nested ordered list, open tags (bug 5497)
+HTML nested ordered list, open tags (T7497)
 !! wikitext
 <ol>
 <li>One
@@ -17646,9 +17650,9 @@ HTML ordered list item with parameters oddity
 
 !! end
 
-# parsoid doesn't explicitly mark autonumbered links, see bug 53505
+# parsoid doesn't explicitly mark autonumbered links, see T55505
 !!test
-bug 5918: autonumbering
+T7918: autonumbering
 !! wikitext
 [http://first/] [http://second] [ftp://ftp]
 
@@ -17855,7 +17859,7 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 # <li class="&#124;&#124;">
 # }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 !!test
-Fuzz testing: Parser25 (bug 6055)
+Fuzz testing: Parser25 (T8055)
 !! wikitext
 {{{
 | 
@@ -17892,7 +17896,7 @@ http://example.com<nowiki>junk</nowiki>
 <p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a><span typeof="mw:Nowiki">junk</span></p>
 !! end
 
-!!test
+!! test
 Fuzz testing: URL adjacent extension (no space, dirty; pre)
 !! wikitext
 http://example.com<pre>junk</pre>
@@ -17905,10 +17909,10 @@ http://example.com<pre>junk</pre>
 junk
 </pre>
 !! html/parsoid
-<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre data-parsoid='{"stx":"html"}'>junk</pre>
-!!end
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"junk"}}'>junk</pre>
+!! end
 
-!!test
+!! test
 Fuzz testing: image with bogus manual thumbnail
 !! wikitext
 [[Image:foobar.jpg|thumbnail= ]]
@@ -17917,19 +17921,21 @@ Fuzz testing: image with bogus manual thumbnail
 
 !! html/parsoid
 <figure class="mw-default-size" typeof="mw:Error mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"manualthumb","ak":"thumbnail= "}]}' data-mw='{"errors":[{"key":"missing-thumbnail","message":"This thumbnail does not exist.","params":{"name":""}}],"thumb":""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="./Special:FilePath/" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"220"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure>
-!!end
+!! end
 
 !! test
-Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
+Fuzz testing: encoded newline in generated HTML replacements (T8577)
 !! wikitext
 <pre dir="&#10;"></pre>
-!! html
+!! html/php
 <pre dir="&#10;"></pre>
 
+!! html/parsoid
+<pre typeof="mw:Extension/pre" about="#mwt2" dir="&amp;#10;" data-mw='{"name":"pre","attrs":{"dir":"&amp;#10;"},"body":{"extsrc":""}}'></pre>
 !! end
 
 !! test
-Parsing optional HTML elements (Bug 6171)
+Parsing optional HTML elements (T8171)
 !! options
 !! wikitext
 <table>
@@ -17951,7 +17957,7 @@ Parsing optional HTML elements (Bug 6171)
 !! end
 
 !! test
-Correct handling of <td>, <tr> (Bug 6171)
+Correct handling of <td>, <tr> (T8171)
 !! options
 !! wikitext
 <table>
@@ -18047,7 +18053,7 @@ Special page transclusion
 !! end
 
 !! test
-Special page transclusion twice (bug 5021)
+Special page transclusion twice (T7021)
 !! options
 !! wikitext
 {{Special:Prefixindex/Xyzzyx}}
@@ -18428,7 +18434,7 @@ section=2
 ==b==
 !! end
 
-# Formerly testing for bug 2587, now resolved by the use of unmarked sections
+# Formerly testing for T4587, now resolved by the use of unmarked sections
 # instead of respecting commented sections
 !! test
 Section extraction prefixed by comment (section 1)
@@ -18452,7 +18458,7 @@ section=2
 
 !!end
 
-# Formerly testing for bug 2607, now resolved by the use of unmarked sections
+# Formerly testing for T4607, now resolved by the use of unmarked sections
 # instead of respecting HTML-style headings
 !! test
 Section extraction, mixed wiki and html (section 1)
@@ -18487,7 +18493,7 @@ two
 !! end
 
 
-# Formerly testing for bug 3342
+# Formerly testing for T5342
 !! test
 Section extraction, heading surrounded by <noinclude>
 !! options
@@ -18499,7 +18505,7 @@ section=1
 ==marked==
 !!end
 
-# Test behavior of bug 19910
+# Test behavior of T21910
 !! test
 Sectiion with all-equals
 !! options
@@ -18847,7 +18853,7 @@ xxx
 !! end
 
 !! test
-Section replacement test with initial whitespace (bug 13728)
+Section replacement test with initial whitespace (T15728)
 !! options
 replace=2,"xxx"
 !! wikitext
@@ -18862,7 +18868,7 @@ xxx
 
 
 !! test
-Section extraction, heading followed by pre with 20 spaces (bug 6398)
+Section extraction, heading followed by pre with 20 spaces (T8398)
 !! options
 section=1
 !! wikitext
@@ -18874,7 +18880,7 @@ section=1
 !! end
 
 !! test
-Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
+Section extraction, heading followed by pre with 19 spaces (T8398 sanity check)
 !! options
 section=1
 !! wikitext
@@ -18887,7 +18893,7 @@ section=1
 
 
 !! test
-Section extraction, <pre> around bogus header (bug 10309)
+Section extraction, <pre> around bogus header (T12309)
 !! options
 section=2
 !! wikitext
@@ -18904,7 +18910,7 @@ stuff
 !! end
 
 !! test
-Section replacement, <pre> around bogus header (bug 10309)
+Section replacement, <pre> around bogus header (T12309)
 !! options
 replace=2,"xxx"
 !! wikitext
@@ -19623,7 +19629,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 !! test
-HTML Hex character encoding bogus encoding (bug 26437 regression check)
+HTML Hex character encoding bogus encoding (T28437 regression check)
 !! wikitext
 &#xsee;&#XSEE;
 !! html/php
@@ -19762,7 +19768,7 @@ ISBN 1234567890
 !! end
 
 !! test
-Bug 22905: <abbr> followed by ISBN followed by </a>
+T24905: <abbr> followed by ISBN followed by </a>
 !! wikitext
 <abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
 !! html/php
@@ -20197,7 +20203,7 @@ ISBN 12345678901
 
 
 !! test
-ISBN with trailing year (bug 8110)
+ISBN with trailing year (T9110)
 !! wikitext
 ISBN 1-234-56789-0 - 2006
 
@@ -20246,7 +20252,7 @@ anchorencode deals with templates
 !! end
 
 !! test
-anchorencode encodes like the TOC generator: (bug 18431)
+anchorencode encodes like the TOC generator: (T20431)
 !! wikitext
 === _ +:.3A%3A&&amp;]] ===
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
@@ -20258,7 +20264,7 @@ __NOEDITSECTION__
 !! end
 
 !! test
-Bug 6200: blockquotes and paragraph formatting
+T8200: blockquotes and paragraph formatting
 !! wikitext
 <blockquote>
 foo
@@ -20279,7 +20285,7 @@ bar
 !! end
 
 !! test
-Bug 8293: Use of center tag ruins paragraph formatting
+T10293: Use of center tag ruins paragraph formatting
 !! wikitext
 <center>
 foo
@@ -20441,7 +20447,7 @@ blah
 ## This wikitext usage is going to be fairly uncommon in production and
 ## selser will take care of preserving formatting in those scenarios.
 !! test
-Don't convert blue categorylinks to another variant (bug 33210)
+Don't convert blue categorylinks to another variant (T35210)
 !! options
 cat
 language=zh
@@ -20610,7 +20616,7 @@ Should be stripped<span title="Exclamation">!</span>
 !! end
 
 !! test
-Bug 24072: more test on conversion rule for title
+T26072: more test on conversion rule for title
 !! options
 language=zh variant=zh-tw showtitle
 !! wikitext
@@ -20724,9 +20730,6 @@ Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiw
 </p>
 !! end
 
-# Since Parsoid is starting to emit canonical wikitext for links,
-# [http://example.com http://example.com] will not RT back to that
-# form anymore.
 !! test
 HTML markups with conversion syntax in attribs, nested in other conversion blocks
 !! options
@@ -20749,6 +20752,9 @@ language=zh variant=zh-cn disabled
 </p>
 !! end
 
+# Since Parsoid is starting to emit canonical wikitext for links,
+# [http://example.com http://example.com] will not RT back to that
+# form anymore.
 !! test
 Proper conversion of text in external links
 !! options
@@ -20893,19 +20899,61 @@ File:foobar.jpg|{{Test|unamedParam|alt=-{R|param}-}}|alt=galleryalt
 
 !! end
 
-# FIXME: This test is currently broken in the PHP parser (bug 52661)
 !! test
-Don't break list handling if language converter markup is in the item.
+T153135: Don't break list handling if language converter markup is in the item.
 !! options
 language=zh variant=zh-cn
 !! wikitext
 ;-{zh-cn:AAA;zh-tw:BBB}-
+;-{R|foo:bar}-
+!! html/php
+<dl><dt>AAA</dt>
+<dt>foo:bar</dt></dl>
+
+!! html/parsoid
+<dl>
+<dt><span typeof="mw:LanguageVariant" data-mw='{"bidir":[{"l":"zh-cn","t":"AAA"},{"l":"zh-tw","t":"BBB"}],"show":true}'></span></dt>
+<dt><span typeof="mw:LanguageVariant" data-mw='{"disabled":true,"show":true,"text":"foo:bar"}'></span></dt>
+</dl>
+!! end
+
+// Note that parsoid does not protect colons unless language converter
+// markup is properly nested, because it is a backtracking parser.
+!! test
+T153135: Unclosed markup in definition list (code coverage)
+!! options
+language=zh variant=zh-cn
+!! wikitext
+;<b>foo:bar
+;-{zh-cn:AAA
+!! html/php
+<dl><dt><b>foo:bar</dt>
+<dt>-{zh-cn:AAA</b></dt></dl>
+
+!! html/parsoid
+<dl>
+<dt><b>foo:bar</b></dt>
+<b>
+<dt>-{zh-cn</dt>
+<dd>AAA</dd>
+</b></dl>
+!! end
+
+!! test
+T153135: Nested language converter markup in definition list (code coverage)
+!! options
+language=zh variant=zh-cn
+!! wikitext
+;-{zh-cn:AAA -{zh-hans|foo:bar}- -{R|bat:baz}-}-:def
 !! html/php
-<dl><dt><span class="error">在手动语言转换规则中检测到错误</span></dd></dl>
+<dl><dt>AAA foo:bar bat:baz</dt>
+<dd>def</dd></dl>
 
 !! html/parsoid
-<dl><dt>AAA
-</dt></dl>
+<dl>
+<dt><span typeof="mw:LanguageVariant" data-mw='{"bidir":[{"l":"zh-cn","t":"AAA &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"zh-hans\"],\"dsr\":[13,32,null,2]}&#39; data-mw=&#39;{\"filter\":[\"zh-hans\"],\"text\":\"bar\"}&#39;>&lt;/span> &lt;span typeof=\"mw:LanguageVariant\" data-parsoid=&#39;{\"fl\":[\"R\"],\"dsr\":[33,46,null,2]}&#39; data-mw=&#39;{\"disabled\":true,\"show\":true,\"text\":\"bat:baz\"}&#39;>&lt;/span>"}],"show":true}'></span></dt>
+<dd>def</dd>
+</dl>
 !! end
 
 !! test
@@ -20934,7 +20982,7 @@ language=sr variant=sr-ec
 !! end
 
 !! test
-Bug 529: Uncovered bullet
+T2529: Uncovered bullet
 !! wikitext
 * Foo {{bullet}}
 !! html
@@ -20950,7 +20998,7 @@ Bug 529: Uncovered bullet
 # To test realistic parsing behavior, apply a tidy-like transformation to both
 # the expected output and your parser's output.
 !! test
-Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
+T2529: Uncovered bullet leaving empty list, normally removed by tidy
 !! wikitext
 ******* Foo {{bullet}}
 !! html
@@ -20960,7 +21008,7 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 !! end
 
 !! test
-Bug 529: Uncovered table already at line-start
+T2529: Uncovered table already at line-start
 !! wikitext
 x
 
 !! end
 
 !! test
-Bug 529: Uncovered bullet in parser function result
+T2529: Uncovered bullet in parser function result
 !! wikitext
 * Foo {{lc:{{bullet}} }}
 !! html
@@ -20993,7 +21041,7 @@ Bug 529: Uncovered bullet in parser function result
 !! end
 
 !! test
-Bug 5678: Double-parsed template argument
+T7678: Double-parsed template argument
 !! wikitext
 {{lc:{{{1}}}|hello}}
 !! html
@@ -21002,7 +21050,7 @@ Bug 5678: Double-parsed template argument
 !! end
 
 !! test
-Bug 5678: Double-parsed template invocation
+T7678: Double-parsed template invocation
 !! wikitext
 {{lc:{{paramtest {{!}} param = hello }} }}
 !! html
@@ -21011,7 +21059,7 @@ Bug 5678: Double-parsed template invocation
 !! end
 
 !! test
-Case insensitivity of parser functions for non-ASCII characters (bug 8143)
+Case insensitivity of parser functions for non-ASCII characters (T10143)
 !! options
 language=cs
 title=[[Main Page]]
@@ -21156,9 +21204,9 @@ B</strong>
 </p>
 !! end
 
-# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
+# T8200: <blockquote> should behave like <div> with respect to line breaks
 !! test
-Bug 6200: paragraphs inside blockquotes (no extra line breaks)
+T8200: paragraphs inside blockquotes (no extra line breaks)
 !! wikitext
 <blockquote>Line one
 
@@ -21174,7 +21222,7 @@ Line two</blockquote>
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open)
+T8200: paragraphs inside blockquotes (extra line break on open)
 !! wikitext
 <blockquote>
 Line one
@@ -21193,7 +21241,7 @@ Line two</blockquote>
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on close)
+T8200: paragraphs inside blockquotes (extra line break on close)
 !! wikitext
 <blockquote>Line one
 
@@ -21213,7 +21261,7 @@ Line two
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
+T8200: paragraphs inside blockquotes (extra line break on open and close)
 !! wikitext
 <blockquote>
 Line one
@@ -21318,7 +21366,7 @@ Free external link invading image caption
 !! end
 
 !! test
-Bug 15196: localised external link numbers
+T17196: localised external link numbers
 !! options
 language=fa
 !! wikitext
@@ -21455,7 +21503,7 @@ comment local title=[[Main Page]]
 !!end
 
 !! test
-Edit comment with subpage link (bug 14080)
+Edit comment with subpage link (T16080)
 !! options
 comment
 subpage
@@ -21467,7 +21515,7 @@ Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/su
 !!end
 
 !! test
-Edit comment with subpage link and link text (bug 14080)
+Edit comment with subpage link and link text (T16080)
 !! options
 comment
 subpage
@@ -21479,7 +21527,7 @@ Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">nea
 !!end
 
 !! test
-Edit comment with bogus subpage link in non-subpage NS (bug 14080)
+Edit comment with bogus subpage link in non-subpage NS (T16080)
 !! options
 comment
 title=[[Subpage test]]
@@ -21555,7 +21603,7 @@ Created page with &quot;&lt;noinclude&gt;<a href="/index.php?title=Category:Requ
 !! end
 
 !! test
-Space normalisation on autocomment (bug 22784)
+Space normalisation on autocomment (T24784)
 !! options
 comment
 title=[[Main Page]]
@@ -21566,7 +21614,7 @@ title=[[Main Page]]
 !! end
 
 !! test
-percent-encoding and + signs in comments (Bug 26410)
+percent-encoding and + signs in comments (T28410)
 !! options
 comment
 !! wikitext
@@ -21575,7 +21623,7 @@ comment
 <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
 !! end
 
-# Parsoid doesn't support this yet: see bug 73581
+# Parsoid doesn't support this yet: see T75581
 # but it *should* omit the 'src' attribute if the image is bad.
 # PHP side of tests was disabled in
 # mediawiki/core:6bd31e7d95161a6e88fa86df60871051da997c3c
@@ -21591,7 +21639,7 @@ Bad images - basic functionality
 !! end
 
 !! test
-Bad images - bug 16039: text after bad image disappears
+Bad images - T18039: text after bad image disappears
 !! wikitext
 Foo bar
 [[File:Bad.jpg]]
@@ -21607,7 +21655,7 @@ Bar foo</p>
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) no displaytitle
+Verify that displaytitle works (T24501) no displaytitle
 !! options
 showtitle
 !! config
@@ -21622,7 +21670,7 @@ Parser test
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=false
+Verify that displaytitle works (T24501) RestrictDisplayTitle=false
 !! options
 showtitle
 title=[[Screen]]
@@ -21639,7 +21687,7 @@ whatever
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true mismatch
+Verify that displaytitle works (T24501) RestrictDisplayTitle=true mismatch
 !! options
 showtitle
 title=[[Screen]]
@@ -21656,7 +21704,7 @@ Screen
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true matching
+Verify that displaytitle works (T24501) RestrictDisplayTitle=true matching
 !! options
 showtitle
 title=[[Screen]]
@@ -21673,7 +21721,7 @@ screen
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false
+Verify that displaytitle works (T24501) AllowDisplayTitle=false
 !! options
 showtitle
 title=[[Screen]]
@@ -21690,7 +21738,7 @@ Screen
 !! end
 
 !! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false no DISPLAYTITLE
+Verify that displaytitle works (T24501) AllowDisplayTitle=false no DISPLAYTITLE
 !! options
 showtitle
 title=[[Screen]]
@@ -21705,7 +21753,7 @@ Screen
 !! end
 
 !! test
-Verify that displaytitle handles inline CSS styles (bug 26547) - rejected value
+Verify that displaytitle handles inline CSS styles (T28547) - rejected value
 !! options
 showtitle
 title=[[Screen]]
@@ -21722,7 +21770,7 @@ this is not the the title
 !! end
 
 !! test
-Verify that displaytitle handles inline CSS styles (bug 26547) - accepted value
+Verify that displaytitle handles inline CSS styles (T28547) - accepted value
 !! options
 showtitle
 title=[[Screen]]
@@ -21855,7 +21903,7 @@ preload
 !! end
 
 !! test
-Play a bit with r67090 and bug 3158
+Play a bit with r67090 and T5158
 !! wikitext
 <div style="width:50% !important">&nbsp;</div>
 <div style="width:50%&nbsp;!important">&nbsp;</div>
@@ -21902,7 +21950,7 @@ Strip reserved data attributes
 !! end
 
 !! test
-percent-encoding and + signs in internal links (Bug 26410)
+percent-encoding and + signs in internal links (T28410)
 !! wikitext
 [[User:+%]] [[Page+title%]]
 [[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
@@ -21922,7 +21970,7 @@ percent-encoding and + signs in internal links (Bug 26410)
 !! end
 
 !! test
-Special characters in embedded file links (bug 27679)
+Special characters in embedded file links (T29679)
 !! wikitext
 [[File:Contains & ampersand.jpg]]
 [[File:Does not exist.jpg|Title with & ampersand]]
@@ -21945,7 +21993,7 @@ Text&apos;s been normalized?
 !! end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
+T21052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
 !! wikitext
 http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
 !! html
@@ -21954,7 +22002,7 @@ http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
 !! end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
+T21052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
 !! wikitext
 [http://www.example.org/ ideograms]
 !! html
@@ -21963,7 +22011,7 @@ Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
 !! end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
+T21052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
 !! wikitext
 http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
 !! html
@@ -21991,7 +22039,7 @@ Template:Identical
 !! endarticle
 
 !! test
-Bug 31098 Template which includes system messages which includes the template
+T33098 Template which includes system messages which includes the template
 !! wikitext
 {{Identical}}
 !! html
@@ -22001,7 +22049,7 @@ Bug 31098 Template which includes system messages which includes the template
 !! end
 
 !! test
-Bug31490 Turkish: ucfirst 'blah'
+T33490 Turkish: ucfirst 'blah'
 !! options
 language=tr
 !! wikitext
@@ -22012,7 +22060,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: ucfirst 'ix'
+T33490 Turkish: ucfirst 'ix'
 !! options
 language=tr
 !! wikitext
@@ -22023,7 +22071,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: lcfirst 'BLAH'
+T33490 Turkish: lcfirst 'BLAH'
 !! options
 language=tr
 !! wikitext
@@ -22034,7 +22082,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 Turkish: ucfırst (with a dotless i)
+T33490 Turkish: ucfırst (with a dotless i)
 !! options
 language=tr
 !! wikitext
@@ -22045,7 +22093,7 @@ language=tr
 !! end
 
 !! test
-Bug31490 ucfırst (with a dotless i) with English language
+T33490 ucfırst (with a dotless i) with English language
 !! options
 language=en
 !! wikitext
@@ -22056,7 +22104,7 @@ language=en
 !! end
 
 !! test
-Bug 26375: TOC with italics
+T28375: TOC with italics
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -22074,7 +22122,7 @@ __TOC__
 !! end
 
 !! test
-Bug 26375: TOC with bold
+T28375: TOC with bold
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -22092,7 +22140,7 @@ __TOC__
 !! end
 
 !! test
-Bug 33845: Headings become cursive in TOC when they contain an image
+T35845: Headings become cursive in TOC when they contain an image
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -22110,7 +22158,7 @@ __TOC__
 !! end
 
 !! test
-Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
+T35845 (2): Headings become bold in TOC when they contain a blockquote
 !! options
 title=[[Main Page]]
 !! wikitext
@@ -22265,7 +22313,7 @@ __TOC__
 !! end
 
 !! test
-Bug 72884: bdi element in ToC
+T74884: bdi element in ToC
 !! wikitext
 __TOC__
 == <bdi>test</bdi> ==
@@ -22328,17 +22376,17 @@ __TOC__
 !! end
 
 !! article
-MediaWiki:Bug32057
+MediaWiki:T34057
 !! text
 == {{int:headline_sample}} ==
 !! endarticle
 
 !! test
-Bug 32057: Title needed when expanding <h> nodes.
+T34057: Title needed when expanding <h> nodes.
 !! options
 title=[[Main Page]]
 !! wikitext
-{{int:Bug32057}}
+{{int:T34057}}
 !! html
 <h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
@@ -22402,7 +22450,7 @@ language=be-tarask
 !! end
 
 !! test
-Wrong option for formatNum (bug 56199)
+Wrong option for formatNum (T58199)
 !! wikitext
 {{formatnum:1,234.56|Random}}
 {{formatnum:1,234.56|EVERYTHING}}
@@ -22453,7 +22501,7 @@ Strip marker in anchorencode
 !! end
 
 !! test
-nowiki inside link inside heading (bug 18295)
+nowiki inside link inside heading (T20295)
 !! wikitext
 ==[[foo|x<nowiki>y</nowiki>z]]==
 !! html
@@ -22462,7 +22510,7 @@ nowiki inside link inside heading (bug 18295)
 !! end
 
 !! test
-new support for bdi element (bug 31817)
+new support for bdi element (T33817)
 !! wikitext
 <p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
 !! html
@@ -22489,25 +22537,6 @@ Ignore pipe between table row attributes
 
 !! end
 
-!!test
-Gallery override link with WikiLink (bug 34852)
-!! wikitext
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
-</gallery>
-!! html
-<ul class="gallery mw-gallery-traditional">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" 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">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
-
 !!test
 Language parser function
 !! wikitext
@@ -22542,7 +22571,7 @@ Special:Foobar
 !! end
 
 !!test
-Bug 34939 - Case insensitive link parsing ([HttP://])
+T36939 - Case insensitive link parsing ([HttP://])
 !! wikitext
 [HttP://MediaWiki.Org/]
 !! html/php
@@ -22553,7 +22582,7 @@ Bug 34939 - Case insensitive link parsing ([HttP://])
 !! end
 
 !!test
-Bug 34939 - Case insensitive link parsing ([HttP:// title])
+T36939 - Case insensitive link parsing ([HttP:// title])
 !! wikitext
 [HttP://MediaWiki.Org/ MediaWiki]
 !! html
@@ -22562,7 +22591,7 @@ Bug 34939 - Case insensitive link parsing ([HttP:// title])
 !! end
 
 !!test
-Bug 34939 - Case insensitive link parsing (HttP://)
+T36939 - Case insensitive link parsing (HttP://)
 !! wikitext
 HttP://MediaWiki.Org/
 !! html/php
@@ -22624,7 +22653,7 @@ parsoid=wt2html,wt2wt
 #### Parsoid-specific functionality tests
 #### -----------------------------------------------------------------
 
-# Bug 63642/66749: Formatting elt fixup around images is cleaned up.
+# T65642/T68749: Formatting elt fixup around images is cleaned up.
 # We know wt2wt will fail, but we expect selser to pass.
 # Due to the nature of our testing, wt2wt and selser tests will enter the
 # blacklist and we'll catch selser regressions based on changes to the
@@ -22690,573 +22719,6 @@ parsoid=wt2html,wt2wt
 <p></p>
 !! end
 
-#### ----------------------------------------------------------------
-#### Parsoid-only testing of Parsoid's impl of <ref> and <references>
-#### tags. Parsoid's output for these tags differs from that of the
-#### PHP parser.
-#### ----------------------------------------------------------------
-
-!!test
-Ref: 1. ref-location should be replaced with an index span
-!! wikitext
-A <ref>foo</ref>
-B <ref name="x">foo</ref>
-C <ref name="y" />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="./Main_Page#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-x-2" id="cite_note-x-2"><a href="./Main_Page#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-y-3" id="cite_note-y-3"><a href="./Main_Page#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 2. ref-tags with identical names should all get the same index
-!! wikitext
-A <ref name="x">foo</ref>
-B <ref name="x" />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 3. spaces in ref-names should be ignored
-!! wikitext
-A <ref name="x">foo</ref>
-B <ref name=" x " />
-C <ref name= x  />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-# NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
-!!test
-Ref: 4. 'constructor' should be accepted as a valid ref-name
-!! wikitext
-A <ref name="constructor">foo</ref>
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="./Main_Page#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="./Main_Page#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 5. body should accept generic wikitext
-!! wikitext
-A <ref>
- This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 6. indent-pres should not be output in ref-body
-!! wikitext
-A <ref>
- foo
- bar
- baz
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
- bar
- baz
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 7. No p-wrapping in ref-body
-!! wikitext
-A <ref>
-foo
-
-bar
-
-
-baz
-
-
-
-booz
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
-
-bar
-
-
-baz
-
-
-
-booz
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 8. transclusion wikitext has lower precedence
-!! wikitext
-A <ref> foo {{echo|</ref> B C}}
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C}}</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo {{echo|</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 9. unclosed comments should not leak out of ref-body
-!! wikitext
-A <ref> foo <!--</ref> B C
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 10. Unclosed HTML tags should not leak out of ref-body
-!! wikitext
-A <ref> <b> foo </ref> B C
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 11. ref-tags acts like an inline element wrt P-wrapping
-!! wikitext
-A <ref>foo</ref> B
-C <ref>bar</ref> D
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
-C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 12. ref-tags act as trailing newline migration barrier
-!! wikitext
-<!--the newline at the end of this line moves out of the p tag-->a
-
-b<!--the newline at the end of this line stays inside the p tag--> <ref />
-<ref />
-
-c
-<references />
-!! html/parsoid
-<!--the newline at the end of this line moves out of the p tag--><p>a</p>
-
-
-<p>b<!--the newline at the end of this line stays inside the p tag--> <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<p>c</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
-!!end
-
-!!test
-Ref: 13. ref-tags are not SOL-transparent and block indent-pres
-!! wikitext
-<ref>foo</ref> A
-<ref>bar
-</ref> B
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
-</span></li>
-</ol>
-!!end
-
-## Roundtripping fails because of nowiki'ing
-!! test
-Ref: 14. A nested ref-tag should be emitted as plain text
-!! options
-parsoid=wt2html
-!! wikitext
-<ref>foo <ref>bar</ref> baz</ref>
-
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span> baz&lt;/ref></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo &lt;ref>bar</span></li></ol>
-!! end
-
-!!test
-Ref: 15. ref-tags with identical names should get identical indexes
-!! wikitext
-A1 <ref name="a">foo</ref> A2 <ref name="a" />
-B1 <ref name="b" /> B2 <ref name="b">bar</ref>
-
-<references />
-!! html/parsoid
-<p>A1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-## We don't bother wt2wt-ing non-standard whitespace
-!!test
-Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
-!!options
-parsoid=wt2html
-!! wikitext
-A <ref >foo</ref >
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!!end
-
-!!test
-Ref: 17. Generate valid HTML5 id/about attributes
-!!wikitext
-<ref name="a b">foo</ref>
-<ref name=":0">ve-created name</ref>
-
-<references />
-!!html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="./Main_Page#cite_note-a_b-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-:0_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-:0-2"},"attrs":{"name":":0"}}'><a href="./Main_Page#cite_note-:0-2" style="counter-reset: mw-Ref 2;"><span class="mw-reflink-text">[2]</span></a></span>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="./Main_Page#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li><li about="#cite_note-:0-2" id="cite_note-:0-2"><a href="./Main_Page#cite_ref-:0_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-:0-2" class="mw-reference-text">ve-created name</span></li></ol>
-
-!!end
-
-!!test
-Ref: 18. T58916: Extension attributes should be parsed as plain text
-!!wikitext
-<ref name="{{echo|a}}">foo</ref>
-
-<references />
-!!html/parsoid
-<p><span class="mw-ref" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="./Main_Page#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="./Main_Page#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 19. ref-tags with identical name encodings should get identical indexes
-!! wikitext
-1 <ref name="a & b">foo</ref> 2 <ref name="a &amp; b" />
-
-<references />
-!! html/parsoid
-<p>1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a &amp; b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 20. ref-tags with identical names but different content should keep it
-!! wikitext
-A <ref name="foo">Foo one</ref>
-B <ref name="foo">Foo two</ref>
-C <ref name="foo" />
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
-</ol>
-!!end
-
-!!test
-References: 1. references tag without any refs should be handled properly
-!! wikitext
-<references />
-!! html/parsoid
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
-!!end
-
-!!test
-References: 2. references tag with group only outputs references from that group
-!! wikitext
-A <ref group="a">foo</ref>
-B <ref group="b">bar</ref>
-C <ref>baz</ref>
-
-<references group="a" />
-<references />
-<references group="b" />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="./Main_Page#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
-C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt12" data-mw-group="b" data-mw='{"name":"references","attrs":{"group":"b"}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-References: 3. ref list should be cleared after processing references
-!! wikitext
-A <ref>foo</ref>
-
-<references />
-
-B <ref>bar</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-
-<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-References: 4. only referenced group should be cleared after processing references
-!! wikitext
-A <ref group="a">afoo</ref>
-B <ref>bfoo</ref>
-
-<references group="a" />
-
-C <ref>cfoo</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
-</ol>
-
-<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
-</ol>
-!!end
-
-## Don't expect this to rt since we're dropping content
-!! test
-References: 5. ref tags in references should be processed while ignoring all other content
-!! options
-parsoid=wt2html,html2html
-!! wikitext
-A <ref name="a" />
-B <ref name="b">bar</ref>
-
-<references>
-<ref name="a">foo</ref>
-This should just get lost.
-</references>
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n&lt;span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[59,82,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a href=\"./Main_Page#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]&lt;/span>&lt;/a>&lt;/span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="./Main_Page#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!! end
-
-!! test
-References: 6. <references /> from a transclusion
-!! wikitext
-<ref>Foo</ref> {{echo|<references />}}
-!! html/parsoid
-<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
-</ol>
-!! end
-
-!! test
-References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
-!! wikitext
-A <ref>foo bar for a</ref>
-B <ref group="X" name="b" />
-
-<references />
-
-<references group="X">
-<ref name="b">foo</ref>
-</references>
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="./Main_Page#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
-</ol>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n&lt;span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"dsr\":[96,119,14,6]}&#39; data-mw=&#39;{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a href=\"./Main_Page#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\" data-parsoid=\"{}\">&lt;span class=\"mw-reflink-text\" data-parsoid=\"{}\">[X 1]&lt;/span>&lt;/a>&lt;/span>\n"}}'>
-<li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
-</ol>
-!! end
-
-!! test
-References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself inside a template
-!! wikitext
-X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
-<references />
-!! html/parsoid
-<p>X<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo {{echo|&lt;b>bar&lt;/b>}} and {{echo|baz}} boo&lt;/ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
-</ol>
-!!end
-
-# This test only works in wt2html now as the <references /> are always generated
-# unless selser is active. Once T72722 is fixed, we should add a changes test
-# here to ensure that unrelated changes don't add the new <references />
-# when selser is active.
-!! test
-References: 9. Generate missing references list at the end
-!! wikitext
-A <ref>foo</ref>
-B <ref group="inexistent">bar</ref>
-!! html/parsoid
-<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="./Main_Page#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="inexistent" data-mw='{"name":"references","attrs":{"group":"inexistent"},"autoGenerated":true}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!! end
-
-!! test
-References: 10. New <references/> shouldn't be added for unrelated edits.
-!! options
-parsoid={
-  "modes": ["selser"],
-  "changes": [["#x", "remove"]],
-  "selser": "noauto"
-}
-!! wikitext
-Unrelated text<span id="x"> that's going to disappear</span>.
-A <ref>foo</ref>
-!! wikitext/edited
-Unrelated text.
-A <ref>foo</ref>
-!!end
-
-!! test
-Entities in ref name
-!! wikitext
-<ref name="test &amp; me">hi</ref>
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp;amp; me"}}'><a href="./Main_Page#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="./Main_Page#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
-</ol>
-!! end
-
-## The output here may look funny, but it's what the php parser will do.  The
-## unclosed references tag becomes escaped text, and then a new references
-## tag is auto-generated.  The test is wt2html only because it roundtrips with
-## nowiki tags, and the auto-generated references tag is only dropped in
-## rtTestMode.
-!! test
-Generate references for unclosed references tag
-!! options
-parsoid=wt2html
-!! wikitext
-a<ref>foo</ref>
-
-<references>
-!! html/parsoid
-<p>a<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<p>&lt;references></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!! end
-
-!! test
-New reference serializes on its own line
-!! options
-parsoid=wt2wt,html2wt
-!! wikitext
-foo
-<references />
-!! html/parsoid
-foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
-!! end
-
 #### ----------------------------------------------------------------
 #### Parsoid-only testing of Parsoid's impl of LST
 #### Not implemented yet, see
@@ -24362,7 +23824,7 @@ parsoid=html2wt
 !! end
 
 !! test
-Links 6. Add <nowiki/>s between text-nodes and url-links when required (bug 64300)
+Links 6. Add <nowiki/>s between text-nodes and url-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24397,7 +23859,7 @@ http://example.com(x<nowiki/>)
 !! end
 
 !! test
-Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
 !! end
 
 !! test
-Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24448,7 +23910,7 @@ http://example.com.,;:!?\
 !! end
 
 !! test
-Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (bug 64300)
+Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24462,7 +23924,7 @@ X<nowiki/>RFC 123<nowiki/>y
 !! end
 
 !! test
-Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (bug 64300)
+Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24482,7 +23944,7 @@ RFC 123&foo
 !! end
 
 !! test
-Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (bug 64300)
+Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24496,7 +23958,7 @@ X<nowiki/>PMID 123<nowiki/>y
 !! end
 
 !! test
-Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (bug 64300)
+Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24516,7 +23978,7 @@ PMID 123&foo
 !! end
 
 !! test
-Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (bug 64300)
+Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24531,7 +23993,7 @@ a<nowiki/>ISBN 1234567890<nowiki/>b
 !! end
 
 !! test
-Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
+Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (T66300)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -24977,7 +24439,7 @@ parsoid=html2wt
 
 ## The quote-char in the input is necessary for triggering the bug
 !! test
-(Bug 52035) Nowiki-escaping should not get tripped by " :" in text
+(T54035) Nowiki-escaping should not get tripped by " :" in text
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -25664,7 +25126,7 @@ parsoid=wt2html
 </table>
 !!end
 
-# Parsoid only for bug 64747
+# Parsoid only for T66747
 !! test
 Properly encapsulate empty-content transclusions in fosterable positions
 !! wikitext
@@ -25760,7 +25222,7 @@ http://en.wikipedia.org/wiki/Foobar
 
 # 'mi' is a localinterwiki prefix as well as a language
 !! test
-Serialize interwiki links pointing to the current wiki as plain wiki links (bug 65869)
+Serialize interwiki links pointing to the current wiki as plain wiki links (T67869)
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -25912,7 +25374,7 @@ parsoid={
 !!end
 
 !! test
-Image: Modifying alignment of an image (bug 48665)
+Image: Modifying alignment of an image (T50665)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25928,7 +25390,7 @@ parsoid={
 !! end
 
 !! test
-Image: Modifying mw-default-size of an frameless image (bug 62805)
+Image: Modifying mw-default-size of an frameless image (T64805)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25943,7 +25405,7 @@ parsoid={
 !! end
 
 !! test
-Image: Modifying valign of an image (bug 49221)
+Image: Modifying valign of an image (T51221)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25959,7 +25421,7 @@ parsoid={
 !! end
 
 !! test
-Image: Modifying alt attribute of an image (bug 56400)
+Image: Modifying alt attribute of an image (T58400)
 !! options
 parsoid={
   "modes": ["wt2wt"],
@@ -25989,7 +25451,7 @@ parsoid={
 !!end
 
 !! test
-Image: empty alt attribute (bug 48924)
+Image: empty alt attribute (T50924)
 !! options
 parsoid
 !! wikitext
@@ -25999,7 +25461,7 @@ parsoid
 !! end
 
 !! test
-Image: new attributes should be serialized in wiki's language for RTL languages (bug 51852)
+Image: new attributes should be serialized in wiki's language for RTL languages (T53852)
 !! options
 parsoid=html2wt
 language=ar
@@ -26604,7 +26066,7 @@ parsoid={
 #------------------------------
 
 !!test
-Bug 54262: New entities
+T56262: New entities
 !! options
 parsoid=html2wt
 !! html/parsoid
@@ -26746,7 +26208,7 @@ WTS of autolinks with escapes (editing)
 parsoid={
   "modes": ["wt2wt"],
   "changes": [
-    [ "meta", "remove" ]
+    [ "span", "remove" ]
   ]
 }
 !! wikitext
index c561f81..90acc39 100644 (file)
@@ -42,14 +42,15 @@ return [
                class_exists( Memcached::class ) ? [] : [ 'tests/phan/stubs/memcached.php' ],
                [
                        'maintenance/7zip.inc',
-                       'maintenance/backupPrefetch.inc',
-                       'maintenance/commandLine.inc',
-                       'maintenance/sqlite.inc',
-                       'maintenance/userOptions.inc',
                        'maintenance/backup.inc',
+                       'maintenance/backupPrefetch.inc',
                        'maintenance/cleanupTable.inc',
+                       'maintenance/CodeCleanerGlobalsPass.inc',
+                       'maintenance/commandLine.inc',
                        'maintenance/importImages.inc',
+                       'maintenance/sqlite.inc',
                        'maintenance/userDupes.inc',
+                       'maintenance/userOptions.inc',
                        'maintenance/language/checkLanguage.inc',
                        'maintenance/language/languages.inc',
                ]
diff --git a/tests/phpunit/autoload.ide.php b/tests/phpunit/autoload.ide.php
new file mode 100644 (file)
index 0000000..106ab68
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * This file is PHPUnit autoload file for PhpStorm IDE and other JetBrains IDEs.
+ *
+ * This file should be set in `Languages and frameworks > PHP > PhpUnit`
+ * select `Use Composer autoloader` and set `Path to script` to `<path to this file>`.
+ * After that, tests can be run in PhpStorm using Right-click > Run or `Ctrl + Shift + F10`.
+ * Also, tests can be run with debugger very easily.
+ *
+ * This file basically does almost the same thing as `tests/phpunit/phpunit.php`, except that all
+ * code is going to be executed inside some function, so some hacks needed to make old code to be
+ * executed as if it was executed on top of the execution stack.
+ *
+ * PS: Mostly it is copy-paste from `phpunit.php` and `doMaintenance.php`.
+ *
+ * @file
+ */
+
+// Set a flag which can be used to detect when other scripts have been entered
+// through this entry point or not.
+use MediaWiki\MediaWikiServices;
+
+global $argv;
+$argv[1] = '--wiki';
+$argv[2] = getenv( 'WIKI_NAME' ) ?: 'wiki';
+
+require_once __DIR__ . "/phpunit.php";
+
+// Get an object to start us off
+/** @var Maintenance $maintenance */
+$maintenance = new PHPUnitMaintClass();
+
+// Basic sanity checks and such
+$maintenance->setup();
+
+// We used to call this variable $self, but it was moved
+// to $maintenance->mSelf. Keep that here for b/c
+$self = $maintenance->getName();
+global $IP;
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
+# Grab profiling functions
+require_once "$IP/includes/profiler/ProfilerFunctions.php";
+
+# Start the profiler
+$wgProfiler = [];
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+       require "$IP/StartProfiler.php";
+}
+
+$requireOnceGlobalsScope = function ( $file ) use ( $self ) {
+       foreach ( array_keys( $GLOBALS ) as $varName ) {
+               eval( sprintf( 'global $%s;', $varName ) );
+       }
+
+       require_once $file;
+
+       unset( $file );
+       $definedVars = get_defined_vars();
+       foreach ( $definedVars as $varName => $value ) {
+               eval( sprintf( 'global $%s; $%s = $value;', $varName, $varName ) );
+       }
+};
+
+// Some other requires
+$requireOnceGlobalsScope( "$IP/includes/Defines.php" );
+$requireOnceGlobalsScope( "$IP/includes/DefaultSettings.php" );
+$requireOnceGlobalsScope( "$IP/includes/GlobalFunctions.php" );
+
+foreach ( array_keys( $GLOBALS ) as $varName ) {
+       eval( sprintf( 'global $%s;', $varName ) );
+}
+
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+       require_once "$IP/vendor/autoload.php";
+}
+
+if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
+       # Use a callback function to configure MediaWiki
+       call_user_func( MW_CONFIG_CALLBACK );
+} else {
+       // Require the configuration (probably LocalSettings.php)
+       require $maintenance->loadSettings();
+}
+
+if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
+       if (
+               $wgLocalisationCacheConf['storeClass'] === false
+               && (
+                       $wgLocalisationCacheConf['store'] == 'db'
+                       || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory )
+               )
+       ) {
+               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+       }
+}
+
+$maintenance->finalSetup();
+// Some last includes
+$requireOnceGlobalsScope( "$IP/includes/Setup.php" );
+
+// Initialize main config instance
+$maintenance->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
+
+// Sanity-check required extensions are installed
+$maintenance->checkRequiredExtensions();
+
+// A good time when no DBs have writes pending is around lag checks.
+// This avoids having long running scripts just OOM and lose all the updates.
+$maintenance->setAgentAndTriggers();
index 12b277e..63d05a0 100644 (file)
@@ -84,7 +84,7 @@ class BlockTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * per bug 26425
+        * per T28425
         */
        public function testBug26425BlockTimestampDefaultsToTime() {
                // delta to stop one-off errors when things happen to go over a second mark.
@@ -99,7 +99,7 @@ class BlockTest extends MediaWikiLangTestCase {
        /**
         * CheckUser since being changed to use Block::newFromTarget started failing
         * because the new function didn't accept empty strings like Block::load()
-        * had. Regression bug 29116.
+        * had. Regression T31116.
         *
         * @dataProvider provideBug29116Data
         * @covers Block::newFromTarget
index 5a01dc0..9507811 100644 (file)
@@ -53,7 +53,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                                false
                        ],
                        [
-                               "An initial section with a fake heder (bug 32617)\n\n== Test == ??\nwtf",
+                               "An initial section with a fake heder (T34617)\n\n== Test == ??\nwtf",
                                false
                        ],
                        [
@@ -61,7 +61,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                                "Section"
                        ],
                        [
-                               "== Section== \t\r\n followed by whitespace (bug 35051)",
+                               "== Section== \t\r\n followed by whitespace (T37051)",
                                'Section',
                        ],
                ];
index 5dd4f7a..4e95a30 100644 (file)
@@ -32,7 +32,7 @@ class ExtraParserTest extends MediaWikiTestCase {
        }
 
        /**
-        * @see Bug 8689
+        * @see T10689
         * @covers Parser::parse
         */
        public function testLongNumericLinesDontKillTheParser() {
index 5ca373d..b6682f7 100644 (file)
@@ -87,13 +87,13 @@ class WfTimestampTest extends MediaWikiTestCase {
        /**
         * This test checks wfTimestamp() with values outside.
         * It needs PHP 64 bits or PHP > 5.1.
-        * See r74778 and bug 25451
+        * See r74778 and T27451
         * @dataProvider provideOldTimestamps
         */
        public function testOldTimestamps( $input, $outputType, $output, $message ) {
                $timestamp = wfTimestamp( $outputType, $input );
                if ( substr( $output, 0, 1 ) === '/' ) {
-                       // Bug 64946: Day of the week calculations for very old
+                       // T66946: Day of the week calculations for very old
                        // timestamps varies from system to system.
                        $this->assertRegExp( $output, $timestamp, $message );
                } else {
index 428b012..ed4958f 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LikeMatch;
+
 /**
  * @group Database
  */
index 092d57b..5977652 100644 (file)
@@ -161,7 +161,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testExists() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -223,7 +223,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetCanonicalNamespaces() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -234,7 +234,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                public function testGetCanonicalName() {
                        // Remove the following lines when you implement this test.
                        $this->markTestIncomplete(
-                         'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                               'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                        );
                }
        */
@@ -245,7 +245,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetCanonicalIndex() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -257,7 +257,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetValidNamespaces() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
index dc0c64c..cc95e38 100644 (file)
@@ -7,6 +7,7 @@ use MediaWiki\MediaWikiServices;
 use MediaWiki\Services\DestructibleService;
 use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceDisabledException;
+use Wikimedia\Rdbms\LBFactory;
 
 /**
  * @covers MediaWiki\MediaWikiServices
@@ -308,7 +309,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ],
                        'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
                        'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
-                       'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', 'LBFactory' ],
+                       'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', Wikimedia\Rdbms\LBFactory::class ],
                        'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
                        'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
index 1de9c23..424218e 100644 (file)
@@ -315,14 +315,14 @@ class MessageTest extends MediaWikiLangTestCase {
                return [
                        [ '<span>foo</span>', 'parse', '<span>foo</span>', '<span>foo</span>' ],
                        [ '<span>foo</span>', 'escaped', '&lt;span&gt;foo&lt;/span&gt;',
-                         '<span>foo</span>' ],
+                               '<span>foo</span>' ],
                        [ '<span>foo</span>', 'plain', '<span>foo</span>', '<span>foo</span>' ],
                        [ '<script>alert(1)</script>', 'parse', '&lt;script&gt;alert(1)&lt;/script&gt;',
                                '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                        [ '<script>alert(1)</script>', 'escaped', '&lt;script&gt;alert(1)&lt;/script&gt;',
                                '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                        [ '<script>alert(1)</script>', 'plain', '<script>alert(1)</script>',
-                         '&lt;script&gt;alert(1)&lt;/script&gt;' ],
+                               '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                ];
        }
 
@@ -448,7 +448,7 @@ class MessageTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
+        * FIXME: This should not need database, but Language#formatExpiry does (T57912)
         * @group Database
         * @covers Message::expiryParam
         * @covers Message::expiryParams
index d2494da..50f851c 100644 (file)
@@ -181,22 +181,63 @@ class OutputPageTest extends MediaWikiTestCase {
                $baseDir = dirname( __DIR__ ) . '/data/media';
                return [
                        // File that matches basePath, and exists. Hash found and appended.
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '/w/test.jpg', '/w/test.jpg?edcf2' ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '/w/test.jpg',
+                               '/w/test.jpg?edcf2'
+                       ],
                        // File that matches basePath, but not found on disk. Empty query.
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '/w/unknown.png', '/w/unknown.png?' ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '/w/unknown.png',
+                               '/w/unknown.png?'
+                       ],
                        // File not matching basePath. Ignored.
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '/files/test.jpg' ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '/files/test.jpg'
+                       ],
                        // Empty string. Ignored.
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '', '' ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '',
+                               ''
+                       ],
                        // Similar path, but with domain component. Ignored.
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '//example.org/w/test.jpg' ],
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', 'https://example.org/w/test.jpg' ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '//example.org/w/test.jpg'
+                       ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               'https://example.org/w/test.jpg'
+                       ],
                        // Unrelated path with domain component. Ignored.
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', 'https://example.org/files/test.jpg' ],
-                       [ 'baseDir' => $baseDir, 'basePath' => '/w', '//example.org/files/test.jpg' ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               'https://example.org/files/test.jpg'
+                       ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '/w',
+                               '//example.org/files/test.jpg'
+                       ],
                        // Unrelated path with domain, and empty base path (root mw install). Ignored.
-                       [ 'baseDir' => $baseDir, 'basePath' => '', 'https://example.org/files/test.jpg' ],
-                       [ 'baseDir' => $baseDir, 'basePath' => '', '//example.org/files/test.jpg' ], // T155310
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '',
+                               'https://example.org/files/test.jpg'
+                       ],
+                       [
+                               'baseDir' => $baseDir, 'basePath' => '',
+                               // T155310
+                               '//example.org/files/test.jpg'
+                       ],
+                       // Check UploadPath before ResourceBasePath (T155146)
+                       [
+                               'baseDir' => dirname( $baseDir ), 'basePath' => '',
+                               'uploadDir' => $baseDir, 'uploadPath' => '/images',
+                               '/images/test.jpg',
+                               '/images/test.jpg?edcf2'
+                       ],
                ];
        }
 
@@ -205,9 +246,22 @@ class OutputPageTest extends MediaWikiTestCase {
         * @covers OutputPage::transformFilePath
         * @covers OutputPage::transformResourcePath
         */
-       public function testTransformResourcePath( $baseDir, $basePath, $path, $expected = null ) {
+       public function testTransformResourcePath( $baseDir, $basePath, $uploadDir = null,
+               $uploadPath = null, $path = null, $expected = null
+       ) {
+               if ( $path === null ) {
+                       // Skip optional $uploadDir and $uploadPath
+                       $path = $uploadDir;
+                       $expected = $uploadPath;
+                       $uploadDir = "$baseDir/images";
+                       $uploadPath = "$basePath/images";
+               }
                $this->setMwGlobals( 'IP', $baseDir );
-               $conf = new HashConfig( [ 'ResourceBasePath' => $basePath ] );
+               $conf = new HashConfig( [
+                       'ResourceBasePath' => $basePath,
+                       'UploadDirectory' => $uploadDir,
+                       'UploadPath' => $uploadPath,
+               ] );
 
                MediaWiki\suppressWarnings();
                $actual = OutputPage::transformResourcePath( $conf, $path );
index 289853d..90b6396 100644 (file)
@@ -42,7 +42,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /**
-        * Placeholder to verify bug 34302
+        * Placeholder to verify T36302
         * @covers Preferences::profilePreferences
         */
        public function testEmailAuthenticationFieldWhenUserHasNoEmail() {
@@ -54,7 +54,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /**
-        * Placeholder to verify bug 34302
+        * Placeholder to verify T36302
         * @covers Preferences::profilePreferences
         */
        public function testEmailAuthenticationFieldWhenUserEmailNotAuthenticated() {
@@ -66,7 +66,7 @@ class PreferencesTest extends MediaWikiTestCase {
        }
 
        /**
-        * Placeholder to verify bug 34302
+        * Placeholder to verify T36302
         * @covers Preferences::profilePreferences
         */
        public function testEmailAuthenticationFieldWhenUserEmailIsAuthenticated() {
index c5a7e04..cf2e120 100644 (file)
@@ -260,7 +260,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match not on top (bug 70958)',
+                               'Exact match not on top (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Bar',
@@ -274,7 +274,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match missing (bug 70958)',
+                               'Exact match missing (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Barbara',
index 12db1a1..862b7d0 100644 (file)
@@ -211,7 +211,7 @@ class SanitizerTest extends MediaWikiTestCase {
                        [ [ 'foo6' => 'baz' ], 'foo6=baz', 'Numbers are allowed' ],
 
                        # This bit is more relaxed than XML rules, but some extensions use
-                       # it, like ProofreadPage (see bug 27539)
+                       # it, like ProofreadPage (see T29539)
                        [ [ '1foo' => 'baz' ], '1foo=baz', 'Leading numbers are allowed' ],
                        [ [], 'foo$=baz', 'Symbols are not allowed' ],
                        [ [], 'foo@=baz', 'Symbols are not allowed' ],
@@ -286,7 +286,7 @@ class SanitizerTest extends MediaWikiTestCase {
                        [ ' ', '/* /* */' ],
                        [ 'display: block;', "display:/* foo */block;" ],
                        [ 'display: block;', "display:\\2f\\2a foo \\2a\\2f block;",
-                               'Backslash-escaped comments must be stripped (bug 28450)' ],
+                               'Backslash-escaped comments must be stripped (T30450)' ],
                        [ '', '/* unfinished comment structure',
                                'Remove anything after a comment-start token' ],
                        [ '', "\\2f\\2a unifinished comment'",
index f47e74e..2448513 100644 (file)
@@ -64,7 +64,7 @@ class SanitizerValidateEmailTest extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * bug 26948 : comma were matched by an incorrect regexp range
+        * T28948 : comma were matched by an incorrect regexp range
         */
        public function testEmailWithCommasAreInvalids() {
                $this->invalid( "user,foo@example.org" );
index 7086a92..84a6adf 100644 (file)
@@ -38,9 +38,11 @@ class TestLogger extends \Psr\Log\AbstractLogger {
        private $filter = null;
 
        /**
-        * @param bool $collect Whether to collect logs
+        * @param bool $collect Whether to collect logs. @see setCollect()
         * @param callable $filter Filter logs before collecting/printing. Signature is
         *  string|null function ( string $message, string $level, array $context );
+        * @param bool $collectContext Whether to keep the context passed to log.
+        *                             @since 1.29 @see setCollectContext()
         */
        public function __construct( $collect = false, $filter = null, $collectContext = false ) {
                $this->collect = $collect;
@@ -51,9 +53,23 @@ class TestLogger extends \Psr\Log\AbstractLogger {
        /**
         * Set the "collect" flag
         * @param bool $collect
+        * @return TestLogger $this
         */
        public function setCollect( $collect ) {
                $this->collect = $collect;
+               return $this;
+       }
+
+       /**
+        * Set the collectContext flag
+        *
+        * @param bool $collectContext
+        * @since 1.29
+        * @return TestLogger $this
+        */
+       public function setCollectContext( $collectContext ) {
+               $this->collectContext = $collectContext;
+               return $this;
        }
 
        /**
index 7925c6f..238b65f 100644 (file)
@@ -267,7 +267,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertEquals(
                        $expectedParam,
                        $par,
-                       "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter"
+                       "T33100 regression check: Title->fixSpecialName() should preserve parameter"
                );
        }
 
index 18ff1f4..184dd43 100644 (file)
@@ -83,7 +83,7 @@ class XmlTest extends MediaWikiTestCase {
                $this->assertEquals(
                        '<input name="name" value="0" />',
                        Xml::input( 'name', false, 0 ),
-                       'Input with a value of 0 (bug 23797)'
+                       'Input with a value of 0 (T25797)'
                );
        }
 
index 0ffcbca..e091153 100644 (file)
@@ -204,7 +204,7 @@ class ApiEditPageTest extends ApiTestCase {
        /**
         * Test action=edit&section=new
         * Run it twice so we test adding a new section on a
-        * page that doesn't exist (bug 52830) and one that
+        * page that doesn't exist (T54830) and one that
         * does exist
         */
        public function testEditNewSection() {
@@ -416,7 +416,7 @@ class ApiEditPageTest extends ApiTestCase {
                $count++;
 
                /*
-               * bug 41990: if the target page has a newer revision than the redirect, then editing the
+               * T43990: if the target page has a newer revision than the redirect, then editing the
                * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
                * caused an edit conflict to be detected.
                */
index eff41e3..9060dfb 100644 (file)
@@ -451,7 +451,10 @@ class ApiMainTest extends ApiTestCase {
                $context->setRequest( new FauxRequest( [ 'errorformat' => 'plaintext' ] ) );
                $context->setLanguage( 'en' );
                $context->setConfig( new MultiConfig( [
-                       new HashConfig( [ 'ShowHostnames' => true, 'ShowSQLErrors' => false ] ),
+                       new HashConfig( [
+                               'ShowHostnames' => true, 'ShowSQLErrors' => false,
+                               'ShowExceptionDetails' => true, 'ShowDBErrorBacktrace' => true,
+                       ] ),
                        $context->getConfig()
                ] ) );
 
index 7687236..9f28aaf 100644 (file)
@@ -13,7 +13,7 @@ class ApiQueryAllPagesTest extends ApiTestCase {
        }
 
        /**
-        *Test bug 25702
+        *Test T27702
         *Prefixes of API search requests are not handled with case sensitivity and may result
         *in wrong search results
         */
index e5971b4..fbc794e 100644 (file)
@@ -325,7 +325,7 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
        }
 
        /**
-        * Test bug 51821
+        * Test T53821
         */
        public function testGeneratorRedirects() {
                $this->editPage( 'AQBT-Target', 'test' );
index 20f4cbc..2f3e27c 100644 (file)
@@ -226,7 +226,7 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider->postAuthentication( \User::newFromName( 'SomeUser' ),
                        AuthenticationResponse::newPass() );
                $this->assertSame( [
-                       [ \Psr\Log\LogLevel::ERROR, 'throttler data not found for {user}' ],
+                       [ \Psr\Log\LogLevel::INFO, 'throttler data not found for {user}' ],
                ], $logger->getBuffer() );
        }
 }
index ed82153..5eed01c 100644 (file)
@@ -75,7 +75,7 @@ class LocalisationCacheTest extends MediaWikiTestCase {
 
        public function testRecacheFallbacksWithHooks() {
                // Use hook to provide updates for messages. This is what the
-               // LocalisationUpdate extension does. See bug 68781.
+               // LocalisationUpdate extension does. See T70781.
                $this->mergeMwGlobalArrayValue( 'wgHooks', [
                        'LocalisationCacheRecacheFallback' => [
                                function (
index a12c8b2..b03eeba 100644 (file)
@@ -92,7 +92,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                        // Existing message with customizations on the fallbacks
                        [ 'sunday', 'ab', 'амҽыш' ],
 
-                       // bug 46579
+                       // T48579
                        [ 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' ],
                        // UI language different from content language should only use de/none as last option
                        [ 'FallbackLanguageTest-NoDervContLang', 'fit', 'de/none' ],
index efd60e5..a3d1dda 100644 (file)
@@ -434,8 +434,13 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $page = new WikiPage( $title );
 
                $this->setTemporaryHook( 'SearchDataForIndex',
-                       function ( &$fields, ContentHandler $handler, WikiPage $page, ParserOutput $output,
-                                          SearchEngine $engine ) {
+                       function (
+                               &$fields,
+                               ContentHandler $handler,
+                               WikiPage $page,
+                               ParserOutput $output,
+                               SearchEngine $engine
+                       ) {
                                $fields['testDataField'] = 'test content';
                        } );
 
@@ -461,4 +466,13 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertContains( 'one who smiths', $out->getRawText() );
        }
 
+       /**
+        * @covers ContentHandler::getContentModels
+        */
+       public function testGetContentModelsHook() {
+               $this->setTemporaryHook( 'GetContentModels', function ( &$models ) {
+                       $models[] = 'Ferrari';
+               } );
+               $this->assertContains( 'Ferrari', ContentHandler::getContentModels() );
+       }
 }
index 81b75de..b95462a 100644 (file)
  * @copyright © 2013 Wikimedia Foundation Inc.
  */
 
+use Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\MySQLMasterPos;
+
 /**
  * Fake class around abstract class so we can call concrete methods.
  */
@@ -116,7 +120,7 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
        /**
         * Feeds testAddIdentifierQuotes
         *
-        * Named per bug 20281 convention.
+        * Named per T22281 convention.
         */
        function provideDiapers() {
                return [
index 656e661..57754bc 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\LikeMatch;
+
 /**
  * Test the abstract database layer
  * This is a non DBMS depending test.
index 172d686..10bf028 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\Blob;
+
 class DatabaseSqliteMock extends DatabaseSqlite {
        private $lastQuery;
 
index c5603c4..ce05e33 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Wikimedia\Rdbms\TransactionProfiler;
+use Wikimedia\Rdbms\DatabaseDomain;
+
 /**
  * Helper for testing the methods from the Database class
  * @since 1.22
index 573b395..8b285cb 100644 (file)
@@ -1,4 +1,10 @@
 <?php
+
+use Wikimedia\Rdbms\LBFactorySimple;
+use Wikimedia\Rdbms\LBFactoryMulti;
+use Wikimedia\Rdbms\ChronologyProtector;
+use Wikimedia\Rdbms\MySQLMasterPos;
+
 /**
  * Holds tests for LBFactory abstract MediaWiki class.
  *
@@ -51,9 +57,12 @@ class LBFactoryTest extends MediaWikiTestCase {
        public function getLBFactoryClassProvider() {
                return [
                        # Format: new class, old class
-                       [ 'LBFactorySimple', 'LBFactory_Simple' ],
-                       [ 'LBFactorySingle', 'LBFactory_Single' ],
-                       [ 'LBFactoryMulti', 'LBFactory_Multi' ],
+                       [ Wikimedia\Rdbms\LBFactorySimple::class, 'LBFactory_Simple' ],
+                       [ Wikimedia\Rdbms\LBFactorySingle::class, 'LBFactory_Single' ],
+                       [ Wikimedia\Rdbms\LBFactoryMulti::class, 'LBFactory_Multi' ],
+                       [ Wikimedia\Rdbms\LBFactorySimple::class, 'LBFactorySimple' ],
+                       [ Wikimedia\Rdbms\LBFactorySingle::class, 'LBFactorySingle' ],
+                       [ Wikimedia\Rdbms\LBFactoryMulti::class, 'LBFactoryMulti' ],
                ];
        }
 
@@ -148,12 +157,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                                ],
                        ],
                        'serverTemplate' => [
-                               'dbname'          => $wgDBname,
-                               'user'            => $wgDBuser,
-                               'password'        => $wgDBpassword,
-                               'type'            => $wgDBtype,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
                                'dbDirectory' => $wgSQLiteDataDir,
-                               'flags'           => DBO_DEFAULT
+                               'flags'       => DBO_DEFAULT
                        ],
                        'hostsByName' => [
                                'test-db1'  => $wgDBserver,
index 4227693..d7ad1d1 100644 (file)
@@ -1,6 +1,40 @@
 <?php
 
 class DeferredUpdatesTest extends MediaWikiTestCase {
+
+       /**
+        * @covers DeferredUpdates::getPendingUpdates
+        */
+       public function testGetPendingUpdates() {
+               # Prevent updates from running
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $pre = DeferredUpdates::PRESEND;
+               $post = DeferredUpdates::POSTSEND;
+               $all = DeferredUpdates::ALL;
+
+               $update = $this->getMockBuilder( 'DeferrableUpdate' )
+                             ->getMock();
+               $update->expects( $this->never() )
+                       ->method( 'doUpdate' );
+
+               DeferredUpdates::addUpdate( $update, $pre );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+
+               DeferredUpdates::addUpdate( $update, $post );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+       }
+
        public function testDoUpdatesWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
index 602a175..9e4dbea 100644 (file)
@@ -66,13 +66,13 @@ EOT
                $this->assertNotEquals(
                        '',
                        $this->updateText( $text ),
-                       'Bug 18609'
+                       'T20609'
                );
        }
 
        /**
         * @covers SearchUpdate::updateText
-        * Test bug 32712
+        * Test T34712
         * Test if unicode quotes in article links make its search index empty
         */
        public function testUnicodeLinkSearchIndexError() {
index 7e98d1c..036baa8 100644 (file)
@@ -50,7 +50,7 @@ class HttpTest extends MediaWikiTestCase {
 
        /**
         * Test Http::isValidURI()
-        * @bug 27854 : Http::isValidURI is too lax
+        * T29854 : Http::isValidURI is too lax
         * @dataProvider provideURI
         * @covers Http::isValidURI
         */
@@ -145,7 +145,7 @@ class HttpTest extends MediaWikiTestCase {
         *
         * 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 bug 29232 is taken care of (high-level handling of
+        * rewritten when T31232 is taken care of (high-level handling of
         * HTTP redirects).
         */
        public function testRelativeRedirections() {
@@ -483,7 +483,7 @@ 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.
         *
-        * @bug 70570
+        * T72570
         * @dataProvider provideCurlConstants
         */
        public function testCurlConstants( $value ) {
index 366714b..2e5c0bb 100644 (file)
@@ -54,7 +54,7 @@ class CSSMinTest extends MediaWikiTestCase {
                        [ "foo, bar {\n\tprop: value; /* comment */\n}", "foo,bar{prop:value; }" ],
 
                        // Keep track of things that aren't as minified as much as they
-                       // could be (bug 35493)
+                       // could be (T37493)
                        [ 'foo { prop: value ;}', 'foo{prop:value }' ],
                        [ 'foo { prop : value; }', 'foo{prop :value}' ],
                        [ 'foo { prop: value ; }', 'foo{prop:value }' ],
@@ -105,7 +105,7 @@ class CSSMinTest extends MediaWikiTestCase {
                                'foo { prop: url(http://example.org/bar.png); }',
                        ],
                        [
-                               'With trailing slash on remote (bug 27052)',
+                               'With trailing slash on remote (T29052)',
                                [ 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux/', false ],
                                'foo { prop: url(http://example.org/bar.png); }',
                        ],
@@ -370,7 +370,7 @@ class CSSMinTest extends MediaWikiTestCase {
                                '{ background: /*asd*/ url(http://localhost/w/something.png); background: /*jkl*/ url(http://localhost/w/something.png); }',
                        ],
                        [
-                               'Sanity check for offending line from jquery.ui.theme.css (bug 60077)',
+                               'Sanity check for offending line from jquery.ui.theme.css (T62077)',
                                '.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }',
                                '.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(http://localhost/w/images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }',
                        ],
@@ -418,7 +418,7 @@ class CSSMinTest extends MediaWikiTestCase {
        }
 
        /**
-        * Seperated because they are currently broken (bug 35492)
+        * Seperated because they are currently broken (T37492)
         *
         * @group Broken
         * @dataProvider provideStringCases
index 3787962..ca12f6c 100644 (file)
@@ -10,7 +10,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        [ "/* Foo *\n*bar\n*/", "" ],
 
                        /**
-                        * Slashes used inside block comments (bug 26931).
+                        * Slashes used inside block comments (T28931).
                         * At some point there was a bug that caused this comment to be ended at '* /',
                         * causing /M... to be left as the beginning of a regex.
                         */
@@ -60,7 +60,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        [ "5.3.\nx;", "5.3.x;" ],
 
                        // Semicolon insertion between an expression having an inline
-                       // comment after it, and a statement on the next line (bug 27046).
+                       // comment after it, and a statement on the next line (T29046).
                        [
                                "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}",
                                "var a=this\nfor(b=0;c<d;b++){}"
@@ -127,7 +127,7 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        // newline insertion after 1000 chars: break after the "++", not before
                        [ str_repeat( ';', 996 ) . "if(x++);", str_repeat( ';', 996 ) . "if(x++\n);" ],
 
-                       // Unicode letter characters should pass through ok in identifiers (bug 31187)
+                       // Unicode letter characters should pass through ok in identifiers (T33187)
                        [ "var KaŝSkatolVal = {}", 'var KaŝSkatolVal={}' ],
 
                        // Per spec unicode char escape values should work in identifiers,
index 53a36c5..787d9a8 100644 (file)
@@ -52,7 +52,7 @@ class MimeMagicTest extends PHPUnit_Framework_TestCase {
 
        /**
         * Test to make sure that encoder=ffmpeg2theora doesn't trigger
-        * MEDIATYPE_VIDEO (bug 63584)
+        * MEDIATYPE_VIDEO (T65584)
         */
        function testOggRecognize() {
                $oggFile = __DIR__ . '/../../../data/media/say-test.ogg';
index 1677851..cd350e5 100644 (file)
@@ -3,7 +3,7 @@
 namespace Wikimedia\Tests\Rdbms;
 
 use IDatabase;
-use LoadBalancer;
+use Wikimedia\Rdbms\LoadBalancer;
 use PHPUnit_Framework_MockObject_MockObject;
 use Wikimedia\Rdbms\ConnectionManager;
 
index 0d54659..3b26d6f 100644 (file)
@@ -3,7 +3,7 @@
 namespace Wikimedia\Tests\Rdbms;
 
 use IDatabase;
-use LoadBalancer;
+use Wikimedia\Rdbms\LoadBalancer;
 use PHPUnit_Framework_MockObject_MockObject;
 use Wikimedia\Rdbms\SessionConsistentConnectionManager;
 
index d13fbf9..3dc7e28 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 
+use Wikimedia\Rdbms\DatabaseDomain;
+
 /**
- * @covers DatabaseDomain
+ * @covers Wikimedia\Rdbms\DatabaseDomain
  */
 class DatabaseDomainTest extends PHPUnit_Framework_TestCase {
        public static function provideConstruct() {
diff --git a/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php b/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php
deleted file mode 100644 (file)
index d48caf3..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class ConvertibleTimestampTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @covers ConvertibleTimestamp::__construct
-        */
-       public function testConstructWithNoTimestamp() {
-               $timestamp = new ConvertibleTimestamp();
-               $this->assertInternalType( 'string', $timestamp->getTimestamp() );
-               $this->assertNotEmpty( $timestamp->getTimestamp() );
-               $this->assertNotEquals( false, strtotime( $timestamp->getTimestamp( TS_MW ) ) );
-       }
-
-       /**
-        * @covers ConvertibleTimestamp::__toString
-        */
-       public function testToString() {
-               $timestamp = new ConvertibleTimestamp( '1406833268' ); // Equivalent to 20140731190108
-               $this->assertEquals( '1406833268', $timestamp->__toString() );
-       }
-
-       public static function provideValidTimestampDifferences() {
-               return [
-                       [ '1406833268', '1406833269', '00 00 00 01' ],
-                       [ '1406833268', '1406833329', '00 00 01 01' ],
-                       [ '1406833268', '1406836929', '00 01 01 01' ],
-                       [ '1406833268', '1406923329', '01 01 01 01' ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideValidTimestampDifferences
-        * @covers ConvertibleTimestamp::diff
-        */
-       public function testDiff( $timestamp1, $timestamp2, $expected ) {
-               $timestamp1 = new ConvertibleTimestamp( $timestamp1 );
-               $timestamp2 = new ConvertibleTimestamp( $timestamp2 );
-               $diff = $timestamp1->diff( $timestamp2 );
-               $this->assertEquals( $expected, $diff->format( '%D %H %I %S' ) );
-       }
-
-       /**
-        * Test parsing of valid timestamps and outputing to MW format.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidParse( $format, $original, $expected ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
-       }
-
-       /**
-        * Test outputting valid timestamps to different formats.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidOutput( $format, $expected, $original ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
-       }
-
-       /**
-        * Test an invalid timestamp.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp
-        */
-       public function testInvalidParse() {
-               new ConvertibleTimestamp( "This is not a timestamp." );
-       }
-
-       /**
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvert( $format, $expected, $original ) {
-               $this->assertSame( $expected, ConvertibleTimestamp::convert( $format, $original ) );
-       }
-
-       /**
-        * Format an invalid timestamp.
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvertInvalid() {
-               $this->assertSame( false, ConvertibleTimestamp::convert( 'Not a timestamp', 0 ) );
-       }
-
-       /**
-        * Test an out of range timestamp
-        * @dataProvider provideOutOfRangeTimestamps
-        * @expectedException TimestampException
-        * @covers       ConvertibleTimestamp
-        */
-       public function testOutOfRangeTimestamps( $format, $input ) {
-               $timestamp = new ConvertibleTimestamp( $input );
-               $timestamp->getTimestamp( $format );
-       }
-
-       /**
-        * Test requesting an invalid output format.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testInvalidOutput() {
-               $timestamp = new ConvertibleTimestamp( '1343761268' );
-               $timestamp->getTimestamp( 98 );
-       }
-
-       /**
-        * Returns a list of valid timestamps in the format:
-        * [ type, timestamp_of_type, timestamp_in_MW ]
-        */
-       public static function provideValidTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_UNIX, '1343761268', '20120731190108' ],
-                       [ TS_MW, '20120731190108', '20120731190108' ],
-                       [ TS_DB, '2012-07-31 19:01:08', '20120731190108' ],
-                       [ TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ],
-                       [ TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ],
-                       [ TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ],
-                       [ TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ],
-                       [ TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ],
-                       [ TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ],
-                       // Some extremes and weird values
-                       [ TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ],
-                       [ TS_UNIX, '-62135596801', '00001231235959' ]
-               ];
-       }
-
-       /**
-        * Returns a list of out of range timestamps in the format:
-        * [ type, timestamp_of_type ]
-        */
-       public static function provideOutOfRangeTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_MW, '-62167219201' ], // -0001-12-31T23:59:59Z
-                       [ TS_MW, '253402300800' ], // 10000-01-01T00:00:00Z
-               ];
-       }
-}
index ac52a39..9291eb6 100644 (file)
@@ -56,7 +56,7 @@ class XMPTest extends PHPUnit_Framework_TestCase  {
                        [ 'invalid-child-not-struct', 'Test child props not in struct or ignored' ],
                        [ 'no-recognized-props', 'Test namespace and no recognized props' ],
                        [ 'no-namespace', 'Test non-namespaced attributes are ignored' ],
-                       [ 'bag-for-seq', "Allow bag's instead of seq's. (bug 27105)" ],
+                       [ 'bag-for-seq', "Allow bag's instead of seq's. (T29105)" ],
                        [ 'utf16BE', 'UTF-16BE encoding' ],
                        [ 'utf16LE', 'UTF-16LE encoding' ],
                        [ 'utf32BE', 'UTF-32BE encoding' ],
index a21a3ff..c2b791e 100644 (file)
@@ -309,7 +309,7 @@ class LogFormatterTest extends MediaWikiLangTestCase {
 
        /**
         * The testIrcMsgForAction* tests are supposed to cover the hacky
-        * LogFormatter::getIRCActionText / bug 34508
+        * LogFormatter::getIRCActionText / T36508
         *
         * Third parties bots listen to those messages. They are clever enough
         * to fetch the i18n messages from the wiki and then analyze the IRC feed
index 3d0724f..e9fc84e 100644 (file)
@@ -33,7 +33,7 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
                $this->assertNotNull( $dateIndex, 'Date entry exists in metadata' );
                $this->assertEquals( '0000:01:00 00:02:27',
                        $meta['visible'][$dateIndex]['value'],
-                       'File with invalid date metadata (bug 29471)' );
+                       'File with invalid date metadata (T31471)' );
        }
 
        /**
index 3049e2f..9bfd5f6 100644 (file)
@@ -75,7 +75,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                        ],
                        [
                                "$base/Toll_Texas_1.svg",
-                               // This file triggered bug 31719, needs entity expansion in the xmlns checks
+                               // This file triggered T33719, needs entity expansion in the xmlns checks
                                [
                                        'width' => 385,
                                        'height' => 385,
index ebeb109..f722fe1 100644 (file)
@@ -27,7 +27,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
                $this->client->expects( $this->once() )->method( 'run' )->with( [
                        'method' => 'GET',
                        'url' => 'http://test/rest/42xyz42'
-                   // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
                ] )->willReturn( [ 200, 'OK', [], 's:8:"somedata";', 0 ] );
                $result = $this->bag->get( '42xyz42' );
                $this->assertEquals( 'somedata', $result );
@@ -69,7 +69,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
                $this->client->expects( $this->once() )->method( 'run' )->with( [
                        'method' => 'PUT',
                        'url' => 'http://test/rest/42xyz42',
-                   'body' => 's:8:"postdata";'
+                       'body' => 's:8:"postdata";'
                        // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
                ] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
                $result = $this->bag->set( '42xyz42', 'postdata' );
index 3a3b514..34b2525 100644 (file)
@@ -5,7 +5,7 @@
  */
 class ArticleTablesTest extends MediaWikiLangTestCase {
        /**
-        * Make sure that bug 14404 doesn't strike again. We don't want
+        * Make sure that T16404 doesn't strike again. We don't want
         * templatelinks based on the user language when {{int:}} is used, only the
         * content language.
         *
@@ -13,7 +13,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
         * @covers Title::getLinksFrom
         */
        public function testTemplatelinksUsesContentLanguage() {
-               $title = Title::newFromText( 'Bug 14404' );
+               $title = Title::newFromText( 'T16404' );
                $page = WikiPage::factory( $title );
                $user = new User();
                $user->mRights = [ 'createpage', 'edit', 'purge' ];
@@ -22,7 +22,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
 
                $page->doEditContent(
                        new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
+                       'Test code for T16404',
                        0,
                        false,
                        $user
@@ -35,7 +35,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                // We need an edit, a purge is not enough to regenerate the tables
                $page->doEditContent(
                        new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
+                       'Test code for T16404',
                        EDIT_UPDATE,
                        false,
                        $user
index d32915b..6b911bf 100644 (file)
@@ -752,6 +752,47 @@ more stuff
        }
         */
 
+       /**
+        * @covers WikiPage::getOldestRevision
+        */
+       public function testGetOldestRevision() {
+               $page = $this->newPage( "WikiPageTest_testGetOldestRevision" );
+               $page->doEditContent(
+                       new WikitextContent( 'one' ),
+                       "first edit",
+                       EDIT_NEW
+               );
+               $rev1 = $page->getRevision();
+
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       new WikitextContent( 'two' ),
+                       "second edit",
+                       EDIT_UPDATE
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       new WikitextContent( 'three' ),
+                       "third edit",
+                       EDIT_UPDATE
+               );
+
+               // sanity check
+               $this->assertNotEquals(
+                       $rev1->getId(),
+                       $page->getRevision()->getId(),
+                       '$page->getRevision()->getId()'
+               );
+
+               // actual test
+               $this->assertEquals(
+                       $rev1->getId(),
+                       $page->getOldestRevision()->getId(),
+                       '$page->getOldestRevision()->getId()'
+               );
+       }
+
        /**
         * @todo FIXME: this is a better rollback test than the one below, but it
         * keeps failing in jenkins for some reason.
index 5e00384..ae58d1c 100644 (file)
@@ -2,8 +2,8 @@
 
 /**
  * @group Database
+ * @covers Parser
  */
-
 class ParserMethodsTest extends MediaWikiLangTestCase {
 
        public static function providePreSaveTransform() {
@@ -19,7 +19,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider providePreSaveTransform
-        * @covers Parser::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgParser;
@@ -63,7 +62,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideStripOuterParagraph
-        * @covers Parser::stripOuterParagraph
         */
        public function testStripOuterParagraph( $text, $expected ) {
                $this->assertEquals( $expected, Parser::stripOuterParagraph( $text ) );
@@ -73,7 +71,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
         * @expectedException MWException
         * @expectedExceptionMessage Parser state cleared while parsing.
         *  Did you call Parser::parse recursively?
-        * @covers Parser::lock
         */
        public function testRecursiveParse() {
                global $wgParser;
@@ -90,9 +87,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                return 'bar';
        }
 
-       /**
-        * @covers Parser::callParserFunction
-        */
        public function testCallParserFunction() {
                global $wgParser;
 
@@ -111,7 +105,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @covers Parser::parse
+        * @covers Parser
         * @covers ParserOutput::getSections
         */
        public function testGetSections() {
@@ -155,8 +149,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideNormalizeLinkUrl
-        * @covers Parser::normalizeLinkUrl
-        * @covers Parser::normalizeUrlComponent
         */
        public function testNormalizeLinkUrl( $explanation, $url, $expected ) {
                $this->assertEquals( $expected, Parser::normalizeLinkUrl( $url ), $explanation );
index d12fee3..7707395 100644 (file)
@@ -2,6 +2,30 @@
 /**
  * Basic tests for Parser::getPreloadText
  * @author Antoine Musso
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
  */
 class ParserPreloadTest extends MediaWikiTestCase {
        /**
@@ -37,32 +61,23 @@ class ParserPreloadTest extends MediaWikiTestCase {
                unset( $this->title );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadSimpleText() {
                $this->assertPreloaded( 'simple', 'simple' );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadedPreIsUnstripped() {
                $this->assertPreloaded(
                        '<pre>monospaced</pre>',
                        '<pre>monospaced</pre>',
-                       '<pre> in preloaded text must be unstripped (bug 27467)'
+                       '<pre> in preloaded text must be unstripped (T29467)'
                );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadedNowikiIsUnstripped() {
                $this->assertPreloaded(
                        '<nowiki>[[Dummy title]]</nowiki>',
                        '<nowiki>[[Dummy title]]</nowiki>',
-                       '<nowiki> in preloaded text must be unstripped (bug 27467)'
+                       '<nowiki> in preloaded text must be unstripped (T29467)'
                );
        }
 
index c491e6b..11a2197 100644 (file)
@@ -214,7 +214,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        [ "Factorial" ], # https://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium
                        [ "All_system_messages" ], # https://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki
                        [ "Fundraising" ], # https://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor.
-                       [ "NestedTemplates" ], # bug 27936
+                       [ "NestedTemplates" ], # T29936
                ] );
                // @codingStandardsIgnoreEnd
        }
index 2a4a4ec..12936ee 100644 (file)
@@ -3,6 +3,30 @@
 /**
  * @group Database
  * @group Parser
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
  */
 class TagHookTest extends MediaWikiTestCase {
        public static function provideValidNames() {
@@ -21,7 +45,6 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
-        * @covers Parser::setHook
         */
        public function testTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -41,7 +64,6 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBadNames
         * @expectedException MWException
-        * @covers Parser::setHook
         */
        public function testBadTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -58,7 +80,6 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
-        * @covers Parser::setFunctionTagHook
         */
        public function testFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -78,7 +99,6 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBadNames
         * @expectedException MWException
-        * @covers Parser::setFunctionTagHook
         */
        public function testBadFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
index 97ea23c..e3ea139 100644 (file)
@@ -17,7 +17,9 @@ class RCFeedIntegrationTest extends MediaWikiTestCase {
        /**
         * @covers RecentChange::notifyRCFeeds
         * @covers RecentChange::getEngine
-        * @covers RCFeedEngine
+        * @covers RCFeed::factory
+        * @covers FormattedRCFeed::__construct
+        * @covers FormattedRCFeed::notify
         * @covers JSONRCFeedFormatter::formatArray
         * @covers MachineReadableRCFeedFormatter::getLine
         */
index 528c322..2db3c16 100644 (file)
@@ -246,8 +246,14 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                                'context' => [ 'debug' => true ],
                                'modules' => [ 'test.styles.pure', 'test.styles.mixed' ],
                                'only' => ResourceLoaderModule::TYPE_STYLES,
-                               'output' => '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>' . "\n"
-                                       . '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.mixed&amp;only=styles&amp;skin=fallback"/>',
+                               'output' => '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.mixed&amp;only=styles&amp;skin=fallback"/>' . "\n"
+                                       . '<link rel="stylesheet" href="/w/load.php?debug=true&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>',
+                       ],
+                       [
+                               'context' => [ 'debug' => false ],
+                               'modules' => [ 'test.styles.pure', 'test.styles.mixed' ],
+                               'only' => ResourceLoaderModule::TYPE_STYLES,
+                               'output' => '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.mixed%2Cpure&amp;only=styles&amp;skin=fallback"/>',
                        ],
                        [
                                'context' => [],
index cde1e5a..e0a82d0 100644 (file)
@@ -18,6 +18,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                        // to avoid notices during testMakeModuleResponse for missing
                        // wgResourceLoaderLESSVars keys in extension hooks.
                        'wgHooks' => [],
+                       'wgShowExceptionDetails' => true,
                ] );
        }
 
index a88264b..6833893 100644 (file)
@@ -230,7 +230,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match not on top (bug 70958)',
+                               'Exact match not on top (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Bar',
@@ -244,7 +244,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                                ],
                        ] ],
                        [ [
-                               'Exact match missing (bug 70958)',
+                               'Exact match missing (T72958)',
                                'provision' => [
                                        'Barcelona',
                                        'Barbara',
index ec046a7..9c10e49 100644 (file)
@@ -10,7 +10,7 @@ class SearchIndexFieldTest extends MediaWikiTestCase {
                return [
                        [ 0, 'test', 0, 'test', true ],
                        [ SearchIndexField::INDEX_TYPE_NESTED, 'test',
-                         SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
+                               SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
                        [ 0, 'test', 0, 'test2', true ],
                        [ 0, 'test', 1, 'test', false ],
                ];
index 50394f4..48a72d3 100644 (file)
@@ -1004,7 +1004,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( [
                        [
-                               LogLevel::WARNING,
+                               LogLevel::INFO,
                                'Session "{session}": Unverified user provided and no metadata to auth it',
                        ]
                ], $logger->getBuffer() );
index b843d17..e8260ac 100644 (file)
@@ -44,7 +44,9 @@ class SkinTemplateTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|OutputPage
         */
        private function getMockOutputPage( $isSyndicated, $html ) {
-               $mock = $this->getMock( OutputPage::class );
+               $mock = $this->getMockBuilder( OutputPage::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
                $mock->expects( $this->once() )
                        ->method( 'isSyndicated' )
                        ->will( $this->returnValue( $isSyndicated ) );
index 074045d..9c71261 100644 (file)
@@ -14,7 +14,7 @@ class SpecialBooksourcesTest extends SpecialPageTestBase {
                        [ '9780136091817', false ],
                        [ '123456789X', true ],
 
-                       // Bug 67021
+                       // T69021
                        [ '1413304541', false ],
                        [ '141330454X', false ],
                        [ '1413304540', true ],
index ab92aee..9b0fb6a 100644 (file)
@@ -101,7 +101,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @bug 2429
+        * T4429
         * @dataProvider provideNamespacesAssociations
         */
        public function testRcNsFilterAssociation( $ns1, $ns2 ) {
@@ -120,7 +120,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @bug 2429
+        * T4429
         * @dataProvider provideNamespacesAssociations
         */
        public function testRcNsFilterAssociationWithInversion( $ns1, $ns2 ) {
index e9cf6a3..9daae97 100644 (file)
@@ -73,7 +73,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        [
                                $EMPTY_REQUEST, $NO_USER_PREF,
                                'default', $defaultNS,
-                               'Bug 33270: No request nor user preferences should give default profile'
+                               'T35270: No request nor user preferences should give default profile'
                        ],
                        [
                                [ 'ns5' => 1 ], $NO_USER_PREF,
@@ -88,7 +88,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                                return "searchNs$ns";
                        }, $defaultNS ), 0 ),
                                'advanced', [ 2, 14 ],
-                               'Bug 33583: search with no option should honor User search preferences'
+                               'T35583: search with no option should honor User search preferences'
                                        . ' and have all other namespace disabled'
                        ],
                ];
@@ -205,6 +205,27 @@ class SpecialSearchTest extends MediaWikiTestCase {
 
                return $mock;
        }
+
+       public function testSubPageRedirect() {
+               $this->setMwGlobals( [
+                       'wgScript' => '/w/index.php',
+               ] );
+
+               $ctx = new RequestContext;
+               $sp = Title::newFromText( 'Special:Search/foo_bar' );
+               SpecialPageFactory::executePath( $sp, $ctx );
+               $url = $ctx->getOutput()->getRedirect();
+               // some older versions of hhvm have a bug that doesn't parse relative
+               // urls with a port, so help it out a little bit.
+               // https://github.com/facebook/hhvm/issues/7136
+               $url = wfExpandUrl( $url, PROTO_CURRENT );
+
+               $parts = parse_url( $url );
+               $this->assertEquals( '/w/index.php', $parts['path'] );
+               parse_str( $parts['query'], $query );
+               $this->assertEquals( 'Special:Search', $query['title'] );
+               $this->assertEquals( 'foo bar', $query['search'] );
+       }
 }
 
 class SpecialSearchTestMockResultSet extends SearchResultSet {
index d93181c..8a4f662 100644 (file)
@@ -13,7 +13,12 @@ class BalancerTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers MediaWiki\Tidy\Balancer::balance
+        * @covers MediaWiki\Tidy\Balancer
+        * @covers MediaWiki\Tidy\BalanceSets
+        * @covers MediaWiki\Tidy\BalanceElement
+        * @covers MediaWiki\Tidy\BalanceStack
+        * @covers MediaWiki\Tidy\BalanceMarker
+        * @covers MediaWiki\Tidy\BalanceActiveFormattingElements
         * @dataProvider provideBalancerTests
         */
        public function testBalancer( $description, $input, $expected, $useTidy ) {
index 6be272f..a42c86c 100644 (file)
@@ -297,31 +297,31 @@ class UploadBaseTest extends MediaWikiTestCase {
                                '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="https://upload.wikimedia.org/wikipedia/commons/3/34/Bahnstrecke_Zeitz-Camburg_1930.png" /> </svg>',
                                true,
                                true,
-                               'SVG with non-local image href (bug 65839)'
+                               'SVG with non-local image href (T67839)'
                        ],
                        [
                                '<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="/w/index.php?title=User:Jeeves/test.xsl&amp;action=raw&amp;format=xml" ?> <svg> <height>50</height> <width>100</width> </svg>',
                                true,
                                true,
-                               'SVG with remote stylesheet (bug 57550)'
+                               'SVG with remote stylesheet (T59550)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewbox="-1 -1 15 15"> <rect y="0" height="13" width="12" stroke="#179" rx="1" fill="#2ac"/> <text x="1.5" y="11" font-family="courier" stroke="white" font-size="16"><![CDATA[B]]></text> <iframe xmlns="http://www.w3.org/1999/xhtml" srcdoc="&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x45;&#x44;&#x20;&#x3D;&#x3E;&#x20;&#x44;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x28;&#x27;&#x2B;&#x74;&#x6F;&#x70;&#x2E;&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x64;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x2B;&#x27;&#x29;&#x27;&#x29;&#x3B;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;"></iframe> </svg>',
                                true,
                                true,
-                               'SVG with rembeded iframe (bug 60771)'
+                               'SVG with rembeded iframe (T62771)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@import url("https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org");</style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
                                true,
                                true,
-                               'SVG with @import in style element (bug 69008)'
+                               'SVG with @import in style element (T71008)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@import url("https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org");<foo/></style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
                                true,
                                true,
-                               'SVG with @import in style element and child element (bug 69008#c11)'
+                               'SVG with @import in style element and child element (T71008#c11)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" viewBox="6 3 177 153" xmlns:xlink="http://www.w3.org/1999/xlink"> <style>@imporT "https://fonts.googleapis.com/css?family=Bitter:700&amp;text=WebPlatform.org";</style> <g transform="translate(-.5,-.5)"> <text fill="#474747" x="95" y="150" text-anchor="middle" font-family="Bitter" font-size="20" font-weight="bold">WebPlatform.org</text> </g> </svg>',
@@ -333,19 +333,19 @@ class UploadBaseTest extends MediaWikiTestCase {
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:url(https://www.google.com/images/srpr/logo11w.png)"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image (bug 69008)'
+                               'SVG with remote background image (T71008)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:\55rl(https://www.google.com/images/srpr/logo11w.png)"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image, encoded (bug 69008)'
+                               'SVG with remote background image, encoded (T71008)'
                        ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg"> <style> #a { background-image:\55rl(\'https://www.google.com/images/srpr/logo11w.png\'); } </style> <rect width="100" height="100" id="a"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image, in style element (bug 69008)'
+                               'SVG with remote background image, in style element (T71008)'
                        ],
                        [
                                // This currently doesn't seem to work in any browsers, but in case
@@ -353,7 +353,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                                '<svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="background-image:image(\'sprites.svg#xywh=40,0,20,20\')"/> </svg>',
                                true,
                                true,
-                               'SVG with remote background image using image() (bug 69008)'
+                               'SVG with remote background image using image() (T71008)'
                        ],
                        [
                                // As reported by Cure53
index 9b25505..7c40a2d 100644 (file)
@@ -19,7 +19,7 @@ class UploadStashTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               // Setup a file for bug 29408
+               // Setup a file for T31408
                $this->bug29408File = wfTempDir() . '/bug29408';
                file_put_contents( $this->bug29408File, "\x00" );
 
@@ -62,7 +62,7 @@ class UploadStashTest extends MediaWikiTestCase {
 
                // Throws exception caught by PHPUnit on failure
                $file = $stash->stashFile( $this->bug29408File );
-               // We'll never reach this point if we hit bug 29408
+               // We'll never reach this point if we hit T31408
                $this->assertTrue( true, 'Unrecognized file without extension' );
 
                $stash->removeFile( $file->getFileKey() );
index 26e5d89..fea4a44 100644 (file)
@@ -362,7 +362,7 @@ class UserTest extends MediaWikiTestCase {
        }
 
        /**
-        * Bug 37963
+        * T39963
         * Make sure defaults are loaded when setOption is called.
         * @covers User::loadOptions
         */
@@ -599,6 +599,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
                        'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
 
                // 1. Log in a test user, and block them.
@@ -626,12 +627,13 @@ class UserTest extends MediaWikiTestCase {
                // Test for the desired cookie name, value, and expiry.
                $cookies = $request1->response()->getCookies();
                $this->assertArrayHasKey( 'wmsitetitleBlockID', $cookies );
-               $this->assertEquals( $block->getId(), $cookies['wmsitetitleBlockID']['value'] );
                $this->assertEquals( $expiryFiveHours, $cookies['wmsitetitleBlockID']['expire'] );
+               $cookieValue = Block::getIdFromCookieValue( $cookies['wmsitetitleBlockID']['value'] );
+               $this->assertEquals( $block->getId(), $cookieValue );
 
                // 2. Create a new request, set the cookies, and see if the (anon) user is blocked.
                $request2 = new FauxRequest();
-               $request2->setCookie( 'BlockID', $block->getId() );
+               $request2->setCookie( 'BlockID', $block->getCookieValue() );
                $user2 = User::newFromSession( $request2 );
                $user2->load();
                $this->assertNotEquals( $user1->getId(), $user2->getId() );
@@ -669,6 +671,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => false,
                        'wgCookiePrefix' => 'wm_no_cookies',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
 
                // 1. Log in a test user, and block them.
@@ -705,6 +708,7 @@ class UserTest extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgCookieSetOnAutoblock' => true,
                        'wgCookiePrefix' => 'wm_infinite_block',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
                ] );
                // 1. Log in a test user, and block them indefinitely.
                $user1Tmp = $this->getTestUser()->getUser();
@@ -782,4 +786,151 @@ class UserTest extends MediaWikiTestCase {
                $this->assertNull( $wgUser->getBlock() );
        }
 
+       /**
+        * Test that a modified BlockID cookie doesn't actually load the relevant block (T152951).
+        */
+       public function testAutoblockCookieInauthentic() {
+               // Set up the bits of global configuration that we use.
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => true,
+                       'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => MWCryptRand::generateHex( 64, true ),
+               ] );
+
+               // 1. Log in a blocked test user.
+               $user1tmp = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $user1tmp );
+               $block = new Block( [ 'enableAutoblock' => true ] );
+               $block->setTarget( $user1tmp );
+               $block->insert();
+               $user1 = User::newFromSession( $request1 );
+               $user1->mBlock = $block;
+               $user1->load();
+
+               // 2. Create a new request, set the cookie to an invalid value, and make sure the (anon)
+               // user not blocked.
+               $request2 = new FauxRequest();
+               $request2->setCookie( 'BlockID', $block->getId() . '!zzzzzzz' );
+               $user2 = User::newFromSession( $request2 );
+               $user2->load();
+               $this->assertTrue( $user2->isAnon() );
+               $this->assertFalse( $user2->isLoggedIn() );
+               $this->assertFalse( $user2->isBlocked() );
+
+               // Clean up.
+               $block->delete();
+       }
+
+       /**
+        * The BlockID cookie is normally verified with a HMAC, but not if wgSecretKey is not set.
+        * This checks that a non-authenticated cookie still works.
+        */
+       public function testAutoblockCookieNoSecretKey() {
+               // Set up the bits of global configuration that we use.
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => true,
+                       'wgCookiePrefix' => 'wmsitetitle',
+                       'wgSecretKey' => null,
+               ] );
+
+               // 1. Log in a blocked test user.
+               $user1tmp = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $user1tmp );
+               $block = new Block( [ 'enableAutoblock' => true ] );
+               $block->setTarget( $user1tmp );
+               $block->insert();
+               $user1 = User::newFromSession( $request1 );
+               $user1->mBlock = $block;
+               $user1->load();
+               $this->assertTrue( $user1->isBlocked() );
+
+               // 2. Create a new request, set the cookie to just the block ID, and the user should
+               // still get blocked when they log in again.
+               $request2 = new FauxRequest();
+               $request2->setCookie( 'BlockID', $block->getId() );
+               $user2 = User::newFromSession( $request2 );
+               $user2->load();
+               $this->assertNotEquals( $user1->getId(), $user2->getId() );
+               $this->assertNotEquals( $user1->getToken(), $user2->getToken() );
+               $this->assertTrue( $user2->isAnon() );
+               $this->assertFalse( $user2->isLoggedIn() );
+               $this->assertTrue( $user2->isBlocked() );
+               $this->assertEquals( true, $user2->getBlock()->isAutoblocking() ); // Non-strict type-check.
+
+               // Clean up.
+               $block->delete();
+       }
+
+       public function testIsPingLimitable() {
+               $request = new FauxRequest();
+               $request->setIP( '1.2.3.4' );
+               $user = User::newFromSession( $request );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [] );
+               $this->assertTrue( $user->isPingLimitable() );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [ '1.2.3.4' ] );
+               $this->assertFalse( $user->isPingLimitable() );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [ '1.2.3.0/8' ] );
+               $this->assertFalse( $user->isPingLimitable() );
+
+               $this->setMwGlobals( 'wgRateLimitsExcludedIPs', [] );
+               $noRateLimitUser = $this->getMockBuilder( User::class )->disableOriginalConstructor()
+                       ->setMethods( [ 'getIP', 'getRights' ] )->getMock();
+               $noRateLimitUser->expects( $this->any() )->method( 'getIP' )->willReturn( '1.2.3.4' );
+               $noRateLimitUser->expects( $this->any() )->method( 'getRights' )->willReturn( [ 'noratelimit' ] );
+               $this->assertFalse( $noRateLimitUser->isPingLimitable() );
+       }
+
+       public function provideExperienceLevel() {
+               return [
+                       [ 2, 2, 'newcomer' ],
+                       [ 12, 3, 'newcomer' ],
+                       [ 8, 5, 'newcomer' ],
+                       [ 15, 10, 'learner' ],
+                       [ 450, 20, 'learner' ],
+                       [ 460, 33, 'learner' ],
+                       [ 525, 28, 'learner' ],
+                       [ 538, 33, 'experienced' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideExperienceLevel
+        */
+       public function testExperienceLevel( $editCount, $memberSince, $expLevel ) {
+               $this->setMwGlobals( [
+                       'wgLearnerEdits' => 10,
+                       'wgLearnerMemberSince' => 4,
+                       'wgExperiencedUserEdits' => 500,
+                       'wgExperiencedUserMemberSince' => 30,
+               ] );
+
+               $db = wfGetDB( DB_MASTER );
+
+               $data = new stdClass();
+               $data->user_id = 1;
+               $data->user_name = 'name';
+               $data->user_real_name = 'Real Name';
+               $data->user_touched = 1;
+               $data->user_token = 'token';
+               $data->user_email = 'a@a.a';
+               $data->user_email_authenticated = null;
+               $data->user_email_token = 'token';
+               $data->user_email_token_expires = null;
+               $data->user_editcount = $editCount;
+               $data->user_registration = $db->timestamp( time() - $memberSince * 86400 );
+               $user = User::newFromRow( $data );
+
+               $this->assertEquals( $expLevel, $user->getExperienceLevel() );
+       }
+
+       public function testExperienceLevelAnon() {
+               $user = User::newFromName( '10.11.12.13', false );
+
+               $this->assertFalse( $user->getExperienceLevel() );
+       }
 }
diff --git a/tests/phpunit/includes/utils/ClassCollectorTest.php b/tests/phpunit/includes/utils/ClassCollectorTest.php
new file mode 100644 (file)
index 0000000..e8a228e
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @covers ClassCollector
+ */
+class ClassCollectorTest extends PHPUnit_Framework_TestCase {
+
+       public static function provideCases() {
+               return [
+                       [
+                               "class Foo {}",
+                               [ 'Foo' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass Bar {}",
+                               [ 'Example\Foo', 'Example\Bar' ],
+                       ],
+                       [
+                               "class_alias( 'Foo', 'Bar' );",
+                               [ 'Bar' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass_alias( 'Example\Foo', 'Foo' );",
+                               [ 'Example\Foo', 'Foo' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass_alias( 'Example\Foo', 'Bar' );",
+                               [ 'Example\Foo', 'Bar' ],
+                       ],
+                       [
+                               "class_alias( Foo::class, 'Bar' );",
+                               [ 'Bar' ],
+                       ],
+                       [
+                               "namespace Example;\nclass Foo {}\nclass_alias( Foo::class, 'Bar' );",
+                               [ 'Example\Foo', 'Bar' ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideCases
+        */
+       public function testGetClasses( $code, array $classes, $message = null ) {
+               $cc = new ClassCollector();
+               $this->assertEquals( $classes, $cc->getClasses( "<?php\n$code" ), $message );
+       }
+}
index 60d4e99..8b54b72 100644 (file)
@@ -45,7 +45,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                                $last_timestamp_bin,
                                $timestamp_bin,
                                "timestamp ($timestamp_bin) of current ID ($id_bin) >= timestamp ($last_timestamp_bin) " .
-                                 "of prior one ($lastId_bin)" );
+                                       "of prior one ($lastId_bin)" );
 
                        $hostbits_bin = substr( $id_bin, -$hostbits );
                        $last_hostbits_bin = substr( $lastId_bin, -$hostbits );
@@ -55,7 +55,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                                        $hostbits_bin,
                                        $last_hostbits_bin,
                                        "Host ID ($hostbits_bin) of current ID ($id_bin) is same as host ID ($last_hostbits_bin) " .
-                                         "of prior one ($lastId_bin)." );
+                                               "of prior one ($lastId_bin)." );
                        }
 
                        $lastId = $id;
index 88bab90..22fd7b8 100644 (file)
@@ -1337,7 +1337,7 @@ class LanguageTest extends LanguageClassesTestCase {
                                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn"
                                )
                        ],
-                       // The following two data sets come from bug 36839. They fail if checkTitleEncoding uses a regexp to test for
+                       // The following two data sets come from T38839. They fail if checkTitleEncoding uses a regexp to test for
                        // valid UTF-8 encoding and the pcre.recursion_limit is low (like, say, 1024). They succeed if checkTitleEncoding
                        // uses mb_check_encoding for its test.
                        [
index 37c8fe0..26db106 100644 (file)
@@ -15,19 +15,19 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @see bug 23156 & r64981
+        * @see T25156 & r64981
         * @covers Language::commafy
         */
        public function testSearchRightSingleQuotationMarkAsApostroph() {
                $this->assertEquals(
                        "'",
                        $this->getLang()->normalizeForSearch( '’' ),
-                       'bug 23156: U+2019 conversion to U+0027'
+                       'T25156: U+2019 conversion to U+0027'
                );
        }
 
        /**
-        * @see bug 23156 & r64981
+        * @see T25156 & r64981
         * @covers Language::commafy
         */
        public function testCommafy() {
@@ -36,7 +36,7 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @see bug 23156 & r64981
+        * @see T25156 & r64981
         * @covers Language::commafy
         */
        public function testDoesNotCommafyFourDigitsNumber() {
index 5eacd88..6bac031 100644 (file)
@@ -10,7 +10,7 @@ class LanguageMlTest extends LanguageClassesTestCase {
 
        /**
         * @dataProvider providerFormatNum
-        * @see bug 29495
+        * T31495
         * @covers Language::formatNum
         */
        public function testFormatNum( $result, $value ) {
index 9a1823b..28d71df 100644 (file)
@@ -9,7 +9,7 @@
 class LanguageTrTest extends LanguageClassesTestCase {
 
        /**
-        * See @bug 28040
+        * See T30040
         * Credits to irc://irc.freenode.net/wikipedia-tr users:
         *  - berm
         *  - []LuCkY[]
@@ -48,7 +48,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
                        [ 'lcfirst', 'ı', 'lower', 'ı' ],
                        [ 'lcfirst', 'i', 'lower', 'i' ],
 
-                       # A real example taken from bug 28040 using
+                       # A real example taken from T30040 using
                        # https://tr.wikipedia.org/wiki/%C4%B0Phone
                        [ 'lcfirst', 'iPhone', 'lower', 'iPhone' ],
 
index b3f8e3e..2c5931d 100644 (file)
@@ -22,7 +22,7 @@ class BaseDumpTest extends MediaWikiTestCase {
                        $this->dump->close();
                }
 
-               // Bug 37458, parent teardown need to be done after closing the
+               // T39458, parent teardown need to be done after closing the
                // dump or it might cause some permissions errors.
                parent::tearDown();
        }
index 6797f59..8ee45a8 100644 (file)
@@ -40,7 +40,7 @@ class MockFSFile extends FSFile {
 
        /**
         * August 22 – The theft of the Mona Lisa is discovered in the Louvre."
-        * @bug 20281
+        * T22281
         */
        public function getSize() {
                return 1911;
index aaa1feb..af03fe6 100644 (file)
@@ -123,7 +123,7 @@ class SideBarTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * bug 33321 - Make sure there's a | after transforming.
+        * T35321 - Make sure there's a | after transforming.
         * @group Database
         * @covers SkinTemplate::addToSidebarPlain
         */
diff --git a/tests/phpunit/specials/SpecialSearchTest.php b/tests/phpunit/specials/SpecialSearchTest.php
deleted file mode 100644 (file)
index 20e88f5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-class SpecialSearchText extends \PHPUnit_Framework_TestCase {
-       public function testSubPageRedirect() {
-               $ctx = new RequestContext;
-
-               SpecialPageFactory::executePath(
-                       Title::newFromText( 'Special:Search/foo_bar' ),
-                       $ctx
-               );
-               $url = $ctx->getOutput()->getRedirect();
-               // some older versions of hhvm have a bug that doesn't parse relative
-               // urls with a port, so help it out a little bit.
-               // https://github.com/facebook/hhvm/issues/7136
-               $url = wfExpandUrl( $url, PROTO_CURRENT );
-
-               $parts = parse_url( $url );
-               $this->assertEquals( '/w/index.php', $parts['path'] );
-               parse_str( $parts['query'], $query );
-               $this->assertEquals( 'Special:Search', $query['title'] );
-               $this->assertEquals( 'foo bar', $query['search'] );
-       }
-}
index f36b51a..d81e8c6 100644 (file)
@@ -68,6 +68,7 @@ class AutoLoaderTest extends MediaWikiTestCase {
                        }
 
                        // We could use token_get_all() here, but this is faster
+                       // Note: Keep in sync with ClassCollector
                        $matches = [];
                        preg_match_all( '/
                                ^ [\t ]* (?:
@@ -78,6 +79,11 @@ class AutoLoaderTest extends MediaWikiTestCase {
                                                ([\'"]) (?P<original> [^\'"]+) \g{-2} \s* , \s*
                                                ([\'"]) (?P<alias> [^\'"]+ ) \g{-2} \s*
                                        \) \s* ;
+                               |
+                                       class_alias \s* \( \s*
+                                               (?P<originalStatic> [a-zA-Z0-9_]+)::class \s* , \s*
+                                               ([\'"]) (?P<aliasString> [^\'"]+ ) \g{-2} \s*
+                                       \) \s* ;
                                )
                        /imx', $contents, $matches, PREG_SET_ORDER );
 
@@ -95,11 +101,18 @@ class AutoLoaderTest extends MediaWikiTestCase {
 
                        foreach ( $matches as $match ) {
                                if ( !empty( $match['class'] ) ) {
+                                       // 'class Foo {}'
                                        $class = $fileNamespace . $match['class'];
                                        $actual[$class] = $file;
                                        $classesInFile[$class] = true;
                                } else {
-                                       $aliasesInFile[$match['alias']] = $match['original'];
+                                       if ( !empty( $match['original'] ) ) {
+                                               // 'class_alias( "Foo", "Bar" );'
+                                               $aliasesInFile[$match['alias']] = $match['original'];
+                                       } else {
+                                               // 'class_alias( Foo::class, "Bar" );'
+                                               $aliasesInFile[$match['aliasString']] = $fileNamespace . $match['originalStatic'];
+                                       }
                                }
                        }
 
index 98a0fbb..30bae78 100644 (file)
@@ -45,9 +45,12 @@ class ContentHandlerSanityTest extends MediaWikiTestCase {
                $handlerClass = get_class( $handler );
                $contentClass = get_class( $content );
 
-               $this->assertTrue(
-                       $content->isValid(),
-                       "$handlerClass::makeEmptyContent() did not return a valid content ($contentClass::isValid())"
-               );
+               if ( $handler->supportsDirectEditing() ) {
+                       $this->assertTrue(
+                               $content->isValid(),
+                               "$handlerClass::makeEmptyContent() did not return a valid content ($contentClass::isValid())"
+                       );
+               }
        }
+
 }
index 11a25c4..7babcac 100644 (file)
@@ -35,8 +35,7 @@
                        <directory>structure</directory>
                        <file>suites/LessTestSuite.php</file>
                </testsuite>
-               <!-- As there is a class Maintenance, we cannot use the
-                    name "maintenance" directly -->
+               <!-- As there is a class Maintenance, we cannot use the name "maintenance" directly -->
                <testsuite name="maintenance_suite">
                        <directory>maintenance</directory>
                </testsuite>
diff --git a/tests/qunit/.eslintrc.json b/tests/qunit/.eslintrc.json
new file mode 100644 (file)
index 0000000..b3a46f4
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "extends": "../../.eslintrc.json",
+       "env": {
+               "qunit": true
+       },
+       "globals": {
+               "sinon": false
+       },
+       "rules": {
+               "operator-linebreak": 0,
+               "quote-props": [ "error", "as-needed" ],
+               "valid-jsdoc": 0
+       }
+}
index f31a646..6468646 100644 (file)
@@ -32,7 +32,6 @@ return [
                        'mediawiki.page.ready',
                        'mediawiki.page.startup',
                        'test.sinonjs',
-                       'dom-level2-shim',
                ],
                'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
@@ -76,6 +75,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js',
@@ -94,6 +94,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js',
+                       'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
@@ -137,11 +138,12 @@ return [
                        'mediawiki.util',
                        'mediawiki.viewport',
                        'mediawiki.special.recentchanges',
-                       'mediawiki.rcfilters.filters',
+                       'mediawiki.rcfilters.filters.dm',
                        'mediawiki.language',
                        'mediawiki.cldr',
                        'mediawiki.cookie',
                        'mediawiki.experiments',
+                       'mediawiki.inspect',
                        'test.mediawiki.qunit.testrunner',
                ],
        ]
index 5a96dc3..1c79f6d 100644 (file)
@@ -16,7 +16,7 @@
 /*
  * @example QUnit
  * <code>
-       QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+       QUnit.test( 'Output matches PHP parser', function ( assert ) {
                mw.messages.set( mw.libs.phpParserData.messages );
                $.each( mw.libs.phpParserData.tests, function ( i, test ) {
                        QUnit.stop();
@@ -133,7 +133,7 @@ class GenerateJqueryMsgData extends Maintenance {
                                . "// languages, and parser modes. Intended for use by a unit test framework by looping\n"
                                . "// through the object and comparing its parser return value with the 'result' property.\n"
                                . '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
-                               . "//jscs:disable\n"
+                               . "/* eslint-disable */\n"
                                . "\n"
                                . 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
 
index 498acc1..90dc1b2 100644 (file)
@@ -2,7 +2,7 @@
 // languages, and parser modes. Intended for use by a unit test framework by looping
 // through the object and comparing its parser return value with the 'result' property.
 // Last generated with generateJqueryMsgData.php at Fri, 10 Jul 2015 11:44:08 +0000
-//jscs:disable
+/* eslint-disable */
 
 mediaWiki.libs.phpParserData = {
     "messages": {
index 0b28684..cef5c15 100644 (file)
@@ -1,8 +1,8 @@
-/*global CompletenessTest, sinon */
+/* global CompletenessTest, sinon */
 ( function ( $, mw, QUnit ) {
        'use strict';
 
-       var mwTestIgnore, mwTester, addons;
+       var mwTestIgnore, addons;
 
        /**
         * Add bogus to url to prevent IE crazy caching
@@ -26,6 +26,7 @@
        QUnit.config.testTimeout = 60 * 1000;
 
        // Reduce default animation duration from 400ms to 0ms for unit tests
+       // eslint-disable-next-line no-underscore-dangle
        $.fx.speeds._default = 0;
 
        // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
                        return false;
                };
 
-               mwTester = new CompletenessTest( mw, mwTestIgnore );
+               // eslint-disable-next-line no-new
+               new CompletenessTest( mw, mwTestIgnore );
        }
 
        /**
                }
 
                function freshMessagesCopy( custom ) {
-                       return $.extend( /*deep=*/true, {}, liveMessages.get(), custom );
+                       return $.extend( /* deep */true, {}, liveMessages.get(), custom );
                }
 
                /**
                }
        } ) );
 
-       QUnit.test( 'Setup', 3, function ( assert ) {
+       QUnit.test( 'Setup', function ( assert ) {
                assert.equal( mw.html.escape( 'foo' ), 'mocked', 'setup() callback was ran.' );
                assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
                mw.messages.set( 'testMsg', 'Bar.' );
        } );
 
-       QUnit.test( 'Teardown', 2, function ( assert ) {
+       QUnit.test( 'Teardown', function ( assert ) {
                assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
        } );
 
-       QUnit.test( 'Loader status', 2, function ( assert ) {
+       QUnit.test( 'Loader status', function ( assert ) {
                var i, len, state,
                        modules = mw.loader.getModuleNames(),
                        error = [],
                assert.deepEqual( missing, [], 'Modules in missing state' );
        } );
 
-       QUnit.test( 'htmlEqual', 8, function ( assert ) {
+       QUnit.test( 'htmlEqual', function ( assert ) {
                assert.htmlEqual(
                        '<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
                        '<div><p data-length=\'10\'  class=\'some classes\'>Child paragraph with <a href=\'http://example.com\' >A link</a></p>Regular text<span>A span</span></div>',
 
        QUnit.module( 'test.mediawiki.qunit.testrunner-after', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Teardown', 3, function ( assert ) {
+       QUnit.test( 'Teardown', function ( assert ) {
                assert.equal( mw.html.escape( '<' ), '&lt;', 'teardown() callback was ran.' );
                assert.equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
                assert.equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
index 0fb7d9a..e4b6157 100644 (file)
@@ -1,4 +1,6 @@
 ( function ( $ ) {
+       var getAccessKeyPrefixTestData, updateTooltipAccessKeysTestData;
+
        QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
                messages: {
                        brackets: '[$1]',
@@ -6,47 +8,47 @@
                }
        } ) );
 
-       var getAccessKeyPrefixTestData = [
-                       // ua string, platform string, expected prefix
-                       // Internet Explorer
-                       [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-' ],
-                       [ 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136', 'Win64', 'alt-' ],
-                       // Firefox
-                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-' ],
-                       [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-' ],
-                       [ 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-' ],
-                       [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0', 'MacIntel', 'ctrl-option-' ],
-                       [ 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1', 'Linux 1686', 'alt-shift-' ],
-                       [ 'Mozilla/5.0 (Windows NT 5.2; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0', 'Win32', 'alt-' ],
-                       // Safari / Konqueror
-                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-option-' ],
-                       [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3', 'MacIntel', 'ctrl-' ],
-                       [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-' ],
-                       [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
-                       // Opera
-                       [ 'Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-' ],
-                       [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'alt-shift-' ],
-                       // Chrome
-                       [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
-                       [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ],
-                       // Unknown! Note: These aren't necessarily *right*, this is just
-                       // testing that we're getting the expected output based on the
-                       // platform.
-                       [ 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.1) Gecko/20021111 Chimera/0.6', 'MacPPC', 'ctrl-' ],
-                       [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5', 'Linux i686', 'alt-' ]
-               ],
-               // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
-               updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
+       getAccessKeyPrefixTestData = [
+               // ua string, platform string, expected prefix
+               // Internet Explorer
+               [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-' ],
+               [ 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136', 'Win64', 'alt-' ],
+               // Firefox
+               [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-' ],
+               [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-' ],
+               [ 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-' ],
+               [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0', 'MacIntel', 'ctrl-option-' ],
+               [ 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1', 'Linux 1686', 'alt-shift-' ],
+               [ 'Mozilla/5.0 (Windows NT 5.2; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0', 'Win32', 'alt-' ],
+               // Safari / Konqueror
+               [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-option-' ],
+               [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3', 'MacIntel', 'ctrl-' ],
+               [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-' ],
+               [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
+               // Opera
+               [ 'Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-' ],
+               [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'alt-shift-' ],
+               // Chrome
+               [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
+               [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ],
+               // Unknown! Note: These aren't necessarily *right*, this is just
+               // testing that we're getting the expected output based on the
+               // platform.
+               [ 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US; rv:1.0.1) Gecko/20021111 Chimera/0.6', 'MacPPC', 'ctrl-' ],
+               [ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5', 'Linux i686', 'alt-' ]
+       ];
+       // strings appended to title to make sure updateTooltipAccessKeys handles them correctly
+       updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
 
        function makeInput( title, accessKey ) {
                // The properties aren't escaped, so make sure you don't call this function with values that need to be escaped!
                return '<input title="' + title + '" ' + ( accessKey ? 'accessKey="' + accessKey + '" ' : '' ) + ' />';
        }
 
-       QUnit.test( 'getAccessKeyPrefix', getAccessKeyPrefixTestData.length, function ( assert ) {
+       QUnit.test( 'getAccessKeyPrefix', function ( assert ) {
                var i;
                for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
                        assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
@@ -56,7 +58,7 @@
                }
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys - current browser', 2, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys - current browser', function ( assert ) {
                var title = $( makeInput( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
                        // The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
                        // The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
@@ -66,7 +68,7 @@
                assert.notEqual( result[ 1 ], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys - no access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys - no access key', function ( assert ) {
                var i, oldTitle, $input, newTitle;
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
                        oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
@@ -77,9 +79,9 @@
                }
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys - with access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
-               $.fn.updateTooltipAccessKeys.setTestMode( true );
+       QUnit.test( 'updateTooltipAccessKeys - with access key', function ( assert ) {
                var i, oldTitle, $input, newTitle;
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
                        oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
                        $input = $( makeInput( oldTitle, 'a' ) );
                $.fn.updateTooltipAccessKeys.setTestMode( false );
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys with label element', 2, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys with label element', function ( assert ) {
+               var html, $label, $input;
                $.fn.updateTooltipAccessKeys.setTestMode( true );
-               var html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />',
-                       $label, $input;
+               html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />';
                $( '#qunit-fixture' ).html( html );
                $label = $( '#qunit-fixture label' );
                $input = $( '#qunit-fixture input' );
                $.fn.updateTooltipAccessKeys.setTestMode( false );
        } );
 
-       QUnit.test( 'updateTooltipAccessKeys with label element as parent', 2, function ( assert ) {
+       QUnit.test( 'updateTooltipAccessKeys with label element as parent', function ( assert ) {
+               var html, $label, $input;
                $.fn.updateTooltipAccessKeys.setTestMode( true );
-               var html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>',
-               $label, $input;
+               html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>';
                $( '#qunit-fixture' ).html( html );
                $label = $( '#qunit-fixture label' );
                $input = $( '#qunit-fixture input' );
index a1b2e5c..c3521ba 100644 (file)
@@ -17,7 +17,7 @@
                return i;
        }
 
-       QUnit.test( 'Position right', 4, function ( assert ) {
+       QUnit.test( 'Position right', function ( assert ) {
                // We need this thing to be visible, so append it to the DOM
                var $span, spanText, d, spanTextNew,
                        origText = 'This is a really long random string and there is no way it fits in 100 pixels.',
index e6aa3aa..558e641 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Simple text', 5, function ( assert ) {
+       QUnit.test( 'Simple text', function ( assert ) {
                var azLc = 'abcdefghijklmnopqrstuvwxyz',
                        azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                        num = '0123456789',
@@ -16,7 +16,7 @@
 
        } );
 
-       QUnit.test( 'Special text', 4, function ( assert ) {
+       QUnit.test( 'Special text', function ( assert ) {
                // https://en.wikipedia.org/wiki/UTF-8
                var u0024 = '$',
                        // Cent symbol
index 81c116c..c7b7cc0 100644 (file)
                        expected: ''
                }, options );
 
-               QUnit.asyncTest( opt.description, 1, function ( assert ) {
-                       setTimeout( function () {
-                               opt.$input.appendTo( '#qunit-fixture' );
+               QUnit.test( opt.description, function ( assert ) {
+                       opt.$input.appendTo( '#qunit-fixture' );
 
-                               // Simulate pressing keys for each of the sample characters
-                               addChars( opt.$input, opt.sample );
+                       // Simulate pressing keys for each of the sample characters
+                       addChars( opt.$input, opt.sample );
 
-                               assert.equal(
-                                       opt.$input.val(),
-                                       opt.expected,
-                                       'New value matches the expected string'
-                               );
-
-                               QUnit.start();
-                       } );
+                       assert.equal(
+                               opt.$input.val(),
+                               opt.expected,
+                               'New value matches the expected string'
+                       );
                } );
        }
 
@@ -72,7 +68,7 @@
        } );
 
        byteLimitTest( {
-               description: 'Plain text input. Calling byteLimit with no parameters and no maxlength attribute (bug 36310)',
+               description: 'Plain text input. Calling byteLimit with no parameters and no maxlength attribute (T38310)',
                $input: $( '<input>' ).attr( 'type', 'text' )
                        .byteLimit(),
                sample: simpleSample,
                expected: '1234'
        } );
 
-       // Regression tests for bug 41450
+       // Regression tests for T43450
        byteLimitTest( {
                description: 'Input filter of which the base exceeds the limit',
                $input: $( '<input>' ).attr( 'type', 'text' )
                expected: ''
        } );
 
-       QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
-               var $el, $elA, $elB;
+       QUnit.test( 'Confirm properties and attributes set', function ( assert ) {
+               var $el;
 
                $el = $( '<input>' ).attr( 'type', 'text' )
                        .attr( 'maxlength', '7' )
 
                assert.strictEqual( $el.attr( 'maxlength' ), undefined, 'maxlength attribute removed for limit with callback' );
 
-               $elA = $( '<input>' ).attr( 'type', 'text' )
+               $( '<input>' ).attr( 'type', 'text' )
                        .addClass( 'mw-test-byteLimit-foo' )
                        .attr( 'maxlength', '7' )
                        .appendTo( '#qunit-fixture' );
 
-               $elB = $( '<input>' ).attr( 'type', 'text' )
+               $( '<input>' ).attr( 'type', 'text' )
                        .addClass( 'mw-test-byteLimit-foo' )
                        .attr( 'maxlength', '12' )
                        .appendTo( '#qunit-fixture' );
                $el.byteLimit();
        } );
 
-       QUnit.test( 'Trim from insertion when limit exceeded', 2, function ( assert ) {
+       QUnit.test( 'Trim from insertion when limit exceeded', function ( assert ) {
                var $el;
 
-               // Use a new <input /> because the bug only occurs on the first time
-               // the limit it reached (bug 40850)
+               // Use a new <input> because the bug only occurs on the first time
+               // the limit it reached (T42850)
                $el = $( '<input>' ).attr( 'type', 'text' )
                        .appendTo( '#qunit-fixture' )
                        .byteLimit( 3 )
index 00de895..d6208e9 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'getRGB', 18, function ( assert ) {
+       QUnit.test( 'getRGB', function ( assert ) {
                assert.strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
                assert.strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
                assert.deepEqual( $.colorUtil.getRGB( [ 0, 100, 255 ] ), [ 0, 100, 255 ], 'Parse array of rgb values' );
@@ -26,7 +26,7 @@
                assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
        } );
 
-       QUnit.test( 'rgbToHsl', 1, function ( assert ) {
+       QUnit.test( 'rgbToHsl', function ( assert ) {
                var hsl, ret;
 
                // Cross-browser differences in decimals...
@@ -42,7 +42,7 @@
                assert.deepEqual( ret, [ 0.33, 0.73, 0.75 ], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
        } );
 
-       QUnit.test( 'hslToRgb', 1, function ( assert ) {
+       QUnit.test( 'hslToRgb', function ( assert ) {
                var rgb, ret;
                rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
 
@@ -52,7 +52,7 @@
                assert.deepEqual( ret, [ 183, 240, 168 ], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
        } );
 
-       QUnit.test( 'getColorBrightness', 2, function ( assert ) {
+       QUnit.test( 'getColorBrightness', function ( assert ) {
                var a, b;
                a = $.colorUtil.getColorBrightness( 'red', +0.1 );
                assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
index ca3f418..74d8509 100644 (file)
@@ -1,10 +1,10 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'getAttrs()', 1, function ( assert ) {
+       QUnit.test( 'getAttrs()', function ( assert ) {
                var attrs = {
                                foo: 'bar',
-                               'class': 'lorem',
+                               class: 'lorem',
                                'data-foo': 'data value'
                        },
                        $el = $( '<div>' ).attr( attrs );
index 8c62876..6a265eb 100644 (file)
@@ -1,17 +1,17 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'devicePixelRatio', 1, function ( assert ) {
+       QUnit.test( 'devicePixelRatio', function ( assert ) {
                var devicePixelRatio = $.devicePixelRatio();
                assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
        } );
 
-       QUnit.test( 'bracketedDevicePixelRatio', 1, function ( assert ) {
-               var devicePixelRatio = $.devicePixelRatio();
-               assert.equal( typeof devicePixelRatio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
+       QUnit.test( 'bracketedDevicePixelRatio', function ( assert ) {
+               var ratio = $.bracketedDevicePixelRatio();
+               assert.equal( typeof ratio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
        } );
 
-       QUnit.test( 'bracketDevicePixelRatio', 8, function ( assert ) {
+       QUnit.test( 'bracketDevicePixelRatio', function ( assert ) {
                assert.equal( $.bracketDevicePixelRatio( 0.75 ), 1, '0.75 gives 1' );
                assert.equal( $.bracketDevicePixelRatio( 1 ), 1, '1 gives 1' );
                assert.equal( $.bracketDevicePixelRatio( 1.25 ), 1.5, '1.25 gives 1.5' );
@@ -22,7 +22,7 @@
                assert.equal( $.bracketDevicePixelRatio( 3 ), 2, '3 gives 2' );
        } );
 
-       QUnit.test( 'matchSrcSet', 6, function ( assert ) {
+       QUnit.test( 'matchSrcSet', function ( assert ) {
                var srcset = 'onefive.png 1.5x, two.png 2x';
 
                // Nice exact matches
index e1fb96d..0dac22e 100644 (file)
        QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Check', function ( assert ) {
-               var $fixture, cases = [
-                       {
-                               desc: 'Test 001',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 002',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue ',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 003',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue Ö',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
-                       },
-                       {
-                               desc: 'Test 004',
-                               text: 'Blue Öyster Cult',
-                               highlight: 'Blue Öy',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
-                       },
-                       {
-                               desc: 'Test 005',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 006',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue ',
-                               expected: '<span class="highlight">Blue</span> Öyster Cult'
-                       },
-                       {
-                               desc: 'Test 007',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue Ö',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
-                       },
-                       {
-                               desc: 'Test 008',
-                               text: 'Blue Öyster Cult',
-                               highlight: ' Blue Öy',
-                               expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
-                       },
-                       {
-                               desc: 'Test 009: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Österreich',
-                               expected: '<span class="highlight">Österreich</span>'
-                       },
-                       {
-                               desc: 'Test 010: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Ö',
-                               expected: '<span class="highlight">Ö</span>sterreich'
-                       },
-                       {
-                               desc: 'Test 011: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Öst',
-                               expected: '<span class="highlight">Öst</span>erreich'
-                       },
-                       {
-                               desc: 'Test 012: Highlighter broken on starting Umlaut?',
-                               text: 'Österreich',
-                               highlight: 'Oe',
-                               expected: 'Österreich'
-                       },
-                       {
-                               desc: 'Test 013: Highlighter broken on punctuation mark?',
-                               text: 'So good. To be there',
-                               highlight: 'good',
-                               expected: 'So <span class="highlight">good</span>. To be there'
-                       },
-                       {
-                               desc: 'Test 014: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: 'be',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 015: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: ' be',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 016: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: 'be ',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 017: Highlighter broken on space?',
-                               text: 'So good. To be there',
-                               highlight: ' be ',
-                               expected: 'So good. To <span class="highlight">be</span> there'
-                       },
-                       {
-                               desc: 'Test 018: en de Highlighter broken on special character at the end?',
-                               text: 'So good. xbß',
-                               highlight: 'xbß',
-                               expected: 'So good. <span class="highlight">xbß</span>'
-                       },
-                       {
-                               desc: 'Test 019: en de Highlighter broken on special character at the end?',
-                               text: 'So good. xbß.',
-                               highlight: 'xbß.',
-                               expected: 'So good. <span class="highlight">xbß.</span>'
-                       },
-                       {
-                               desc: 'Test 020: RTL he Hebrew',
-                               text: 'חסיד אומות העולם',
-                               highlight: 'חסיד אומות העולם',
-                               expected: '<span class="highlight">חסיד</span> <span class="highlight">אומות</span> <span class="highlight">העולם</span>'
-                       },
-                       {
-                               desc: 'Test 021: RTL he Hebrew',
-                               text: 'חסיד אומות העולם',
-                               highlight: 'חסי',
-                               expected: '<span class="highlight">חסי</span>ד אומות העולם'
-                       },
-                       {
-                               desc: 'Test 022: ja Japanese',
-                               text: '諸国民の中の正義の人',
-                               highlight: '諸国民の中の正義の人',
-                               expected: '<span class="highlight">諸国民の中の正義の人</span>'
-                       },
-                       {
-                               desc: 'Test 023: ja Japanese',
-                               text: '諸国民の中の正義の人',
-                               highlight: '諸国',
-                               expected: '<span class="highlight">諸国</span>民の中の正義の人'
-                       },
-                       {
-                               desc: 'Test 024: fr French text and « french quotes » (guillemets)',
-                               text: '« L\'oiseau est sur l’île »',
-                               highlight: '« L\'oiseau est sur l’île »',
-                               expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
-                       },
-                       {
-                               desc: 'Test 025: fr French text and « french quotes » (guillemets)',
-                               text: '« L\'oiseau est sur l’île »',
-                               highlight: '« L\'oise',
-                               expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
-                       },
-                       {
-                               desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
-                               text: '« L\'oiseau est sur l’île »',
-                               highlight: '« L',
-                               expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
-                       },
-                       {
-                               desc: 'Test 026: ru Russian',
-                               text: 'Праведники мира',
-                               highlight: 'Праведники мира',
-                               expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
-                       },
-                       {
-                               desc: 'Test 027: ru Russian',
-                               text: 'Праведники мира',
-                               highlight: 'Праве',
-                               expected: '<span class="highlight">Праве</span>дники мира'
-                       },
-                       {
-                               desc: 'Test 028 ka Georgian',
-                               text: 'მთავარი გვერდი',
-                               highlight: 'მთავარი გვერდი',
-                               expected: '<span class="highlight">მთავარი</span> <span class="highlight">გვერდი</span>'
-                       },
-                       {
-                               desc: 'Test 029 ka Georgian',
-                               text: 'მთავარი გვერდი',
-                               highlight: 'მთა',
-                               expected: '<span class="highlight">მთა</span>ვარი გვერდი'
-                       },
-                       {
-                               desc: 'Test 030 hy Armenian',
-                               text: 'Նոնա Գափրինդաշվիլի',
-                               highlight: 'Նոնա Գափրինդաշվիլի',
-                               expected: '<span class="highlight">Նոնա</span> <span class="highlight">Գափրինդաշվիլի</span>'
-                       },
-                       {
-                               desc: 'Test 031 hy Armenian',
-                               text: 'Նոնա Գափրինդաշվիլի',
-                               highlight: 'Նոն',
-                               expected: '<span class="highlight">Նոն</span>ա Գափրինդաշվիլի'
-                       },
-                       {
-                               desc: 'Test 032: th Thai',
-                               text: 'พอล แอร์ดิช',
-                               highlight: 'พอล แอร์ดิช',
-                               expected: '<span class="highlight">พอล</span> <span class="highlight">แอร์ดิช</span>'
-                       },
-                       {
-                               desc: 'Test 033: th Thai',
-                               text: 'พอล แอร์ดิช',
-                               highlight: 'พอ',
-                               expected: '<span class="highlight">พอ</span>ล แอร์ดิช'
-                       },
-                       {
-                               desc: 'Test 034: RTL ar Arabic',
-                               text: 'بول إيردوس',
-                               highlight: 'بول إيردوس',
-                               expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
-                       },
-                       {
-                               desc: 'Test 035: RTL ar Arabic',
-                               text: 'بول إيردوس',
-                               highlight: 'بو',
-                               expected: '<span class="highlight">بو</span>ل إيردوس'
-                       }
-               ];
-               QUnit.expect( cases.length );
+               var $fixture,
+                       cases = [
+                               {
+                                       desc: 'Test 001',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 002',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue ',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 003',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue Ö',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+                               },
+                               {
+                                       desc: 'Test 004',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: 'Blue Öy',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+                               },
+                               {
+                                       desc: 'Test 005',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 006',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue ',
+                                       expected: '<span class="highlight">Blue</span> Öyster Cult'
+                               },
+                               {
+                                       desc: 'Test 007',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue Ö',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+                               },
+                               {
+                                       desc: 'Test 008',
+                                       text: 'Blue Öyster Cult',
+                                       highlight: ' Blue Öy',
+                                       expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+                               },
+                               {
+                                       desc: 'Test 009: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Österreich',
+                                       expected: '<span class="highlight">Österreich</span>'
+                               },
+                               {
+                                       desc: 'Test 010: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Ö',
+                                       expected: '<span class="highlight">Ö</span>sterreich'
+                               },
+                               {
+                                       desc: 'Test 011: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Öst',
+                                       expected: '<span class="highlight">Öst</span>erreich'
+                               },
+                               {
+                                       desc: 'Test 012: Highlighter broken on starting Umlaut?',
+                                       text: 'Österreich',
+                                       highlight: 'Oe',
+                                       expected: 'Österreich'
+                               },
+                               {
+                                       desc: 'Test 013: Highlighter broken on punctuation mark?',
+                                       text: 'So good. To be there',
+                                       highlight: 'good',
+                                       expected: 'So <span class="highlight">good</span>. To be there'
+                               },
+                               {
+                                       desc: 'Test 014: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: 'be',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 015: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: ' be',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 016: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: 'be ',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 017: Highlighter broken on space?',
+                                       text: 'So good. To be there',
+                                       highlight: ' be ',
+                                       expected: 'So good. To <span class="highlight">be</span> there'
+                               },
+                               {
+                                       desc: 'Test 018: en de Highlighter broken on special character at the end?',
+                                       text: 'So good. xbß',
+                                       highlight: 'xbß',
+                                       expected: 'So good. <span class="highlight">xbß</span>'
+                               },
+                               {
+                                       desc: 'Test 019: en de Highlighter broken on special character at the end?',
+                                       text: 'So good. xbß.',
+                                       highlight: 'xbß.',
+                                       expected: 'So good. <span class="highlight">xbß.</span>'
+                               },
+                               {
+                                       desc: 'Test 020: RTL he Hebrew',
+                                       text: 'חסיד אומות העולם',
+                                       highlight: 'חסיד אומות העולם',
+                                       expected: '<span class="highlight">חסיד</span> <span class="highlight">אומות</span> <span class="highlight">העולם</span>'
+                               },
+                               {
+                                       desc: 'Test 021: RTL he Hebrew',
+                                       text: 'חסיד אומות העולם',
+                                       highlight: 'חסי',
+                                       expected: '<span class="highlight">חסי</span>ד אומות העולם'
+                               },
+                               {
+                                       desc: 'Test 022: ja Japanese',
+                                       text: '諸国民の中の正義の人',
+                                       highlight: '諸国民の中の正義の人',
+                                       expected: '<span class="highlight">諸国民の中の正義の人</span>'
+                               },
+                               {
+                                       desc: 'Test 023: ja Japanese',
+                                       text: '諸国民の中の正義の人',
+                                       highlight: '諸国',
+                                       expected: '<span class="highlight">諸国</span>民の中の正義の人'
+                               },
+                               {
+                                       desc: 'Test 024: fr French text and « french quotes » (guillemets)',
+                                       text: '« L\'oiseau est sur l’île »',
+                                       highlight: '« L\'oiseau est sur l’île »',
+                                       expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
+                               },
+                               {
+                                       desc: 'Test 025: fr French text and « french quotes » (guillemets)',
+                                       text: '« L\'oiseau est sur l’île »',
+                                       highlight: '« L\'oise',
+                                       expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
+                               },
+                               {
+                                       desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
+                                       text: '« L\'oiseau est sur l’île »',
+                                       highlight: '« L',
+                                       expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
+                               },
+                               {
+                                       desc: 'Test 026: ru Russian',
+                                       text: 'Праведники мира',
+                                       highlight: 'Праведники мира',
+                                       expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
+                               },
+                               {
+                                       desc: 'Test 027: ru Russian',
+                                       text: 'Праведники мира',
+                                       highlight: 'Праве',
+                                       expected: '<span class="highlight">Праве</span>дники мира'
+                               },
+                               {
+                                       desc: 'Test 028 ka Georgian',
+                                       text: 'მთავარი გვერდი',
+                                       highlight: 'მთავარი გვერდი',
+                                       expected: '<span class="highlight">მთავარი</span> <span class="highlight">გვერდი</span>'
+                               },
+                               {
+                                       desc: 'Test 029 ka Georgian',
+                                       text: 'მთავარი გვერდი',
+                                       highlight: 'მთა',
+                                       expected: '<span class="highlight">მთა</span>ვარი გვერდი'
+                               },
+                               {
+                                       desc: 'Test 030 hy Armenian',
+                                       text: 'Նոնա Գափրինդաշվիլի',
+                                       highlight: 'Նոնա Գափրինդաշվիլի',
+                                       expected: '<span class="highlight">Նոնա</span> <span class="highlight">Գափրինդաշվիլի</span>'
+                               },
+                               {
+                                       desc: 'Test 031 hy Armenian',
+                                       text: 'Նոնա Գափրինդաշվիլի',
+                                       highlight: 'Նոն',
+                                       expected: '<span class="highlight">Նոն</span>ա Գափրինդաշվիլի'
+                               },
+                               {
+                                       desc: 'Test 032: th Thai',
+                                       text: 'พอล แอร์ดิช',
+                                       highlight: 'พอล แอร์ดิช',
+                                       expected: '<span class="highlight">พอล</span> <span class="highlight">แอร์ดิช</span>'
+                               },
+                               {
+                                       desc: 'Test 033: th Thai',
+                                       text: 'พอล แอร์ดิช',
+                                       highlight: 'พอ',
+                                       expected: '<span class="highlight">พอ</span>ล แอร์ดิช'
+                               },
+                               {
+                                       desc: 'Test 034: RTL ar Arabic',
+                                       text: 'بول إيردوس',
+                                       highlight: 'بول إيردوس',
+                                       expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
+                               },
+                               {
+                                       desc: 'Test 035: RTL ar Arabic',
+                                       text: 'بول إيردوس',
+                                       highlight: 'بو',
+                                       expected: '<span class="highlight">بو</span>ل إيردوس'
+                               }
+                       ];
 
                $.each( cases, function ( i, item ) {
                        $fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
index c503fc9..a3e46ab 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $, mw ) {
        QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
+       QUnit.test( 'Handle basic replacements', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'basic', 'Basic stuff' );
 
@@ -30,7 +30,7 @@
                assert.strictEqual( $lc.attr( 'placeholder' ), 'Basic stuff', 'Attribute: placeholder-msg' );
        } );
 
-       QUnit.test( 'Proper escaping', 2, function ( assert ) {
+       QUnit.test( 'Proper escaping', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'properfoo', '<proper esc="test">' );
 
@@ -50,7 +50,8 @@
                assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
        } );
 
-       QUnit.test( 'Options', 7, function ( assert ) {
+       QUnit.test( 'Options', function ( assert ) {
+               var html, $lc, x, sitename = 'Wikipedia';
                mw.messages.set( {
                        'foo-lorem': 'Lorem',
                        'foo-ipsum': 'Ipsum',
@@ -60,7 +61,6 @@
                        'foo-bazz-label': 'The Bazz ($1)',
                        'foo-welcome': 'Welcome to $1! (last visit: $2)'
                } );
-               var html, $lc, x, sitename = 'Wikipedia';
 
                // Message key prefix
                html = '<div><span title-msg="lorem"><html:msg key="ipsum" /></span></div>';
                assert.strictEqual( $lc.attr( 'title' ), 'Read more about bazz at Wikipedia (last modified: 3 minutes ago)', 'Combination of options prefix, params and keys - attr' );
        } );
 
-       QUnit.test( 'Handle data text', 2, function ( assert ) {
+       QUnit.test( 'Handle data text', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'option-one', 'Item 1' );
                mw.messages.set( 'option-two', 'Item 2' );
                assert.strictEqual( $lc.eq( 1 ).text(), mw.msg( 'option-two' ), 'data-msg-text becomes text of options' );
        } );
 
-       QUnit.test( 'Handle data html', 2, function ( assert ) {
+       QUnit.test( 'Handle data html', function ( assert ) {
                var html, $lc;
                mw.messages.set( 'html', 'behold... there is a <a>link</a> here!!' );
                html = '<div><div data-msg-html="html"></div></div>';
index 9c7660f..4e77d72 100644 (file)
@@ -11,9 +11,8 @@
        }
 
        // This test is first because if it fails, then almost all of the latter tests are meaningless.
-       QUnit.test( 'testing hooks/triggers', 4, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'testing hooks/triggers', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>'
                        ),
                        $content = $collapsible.find( '.mw-collapsible-content' ),
@@ -44,9 +43,8 @@
                $toggle.trigger( 'click' );
        } );
 
-       QUnit.test( 'basic operation (<div>)', 5, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'basic operation (<div>)', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>'
                        ),
                        $content = $collapsible.find( '.mw-collapsible-content' ),
@@ -70,9 +68,8 @@
                $toggle.trigger( 'click' );
        } );
 
-       QUnit.test( 'basic operation (<table>)', 7, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'basic operation (<table>)', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<table class="mw-collapsible">' +
                                        '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
                                        '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
                $toggle.trigger( 'click' );
        }
 
-       QUnit.test( 'basic operation (<table> with caption)', 10, function ( assert ) {
+       QUnit.test( 'basic operation (<table> with caption)', function ( assert ) {
                tableWithCaptionTest( prepareCollapsible(
                        '<table class="mw-collapsible">' +
                                '<caption>' + loremIpsum + '</caption>' +
                ), this, assert );
        } );
 
-       QUnit.test( 'basic operation (<table> with caption and <thead>)', 10, function ( assert ) {
+       QUnit.test( 'basic operation (<table> with caption and <thead>)', function ( assert ) {
                tableWithCaptionTest( prepareCollapsible(
                        '<table class="mw-collapsible">' +
                                '<caption>' + loremIpsum + '</caption>' +
                $toggle.trigger( 'click' );
        }
 
-       QUnit.test( 'basic operation (<ul>)', 7, function ( assert ) {
+       QUnit.test( 'basic operation (<ul>)', function ( assert ) {
                listTest( 'ul', this, assert );
        } );
 
-       QUnit.test( 'basic operation (<ol>)', 7, function ( assert ) {
+       QUnit.test( 'basic operation (<ol>)', function ( assert ) {
                listTest( 'ol', this, assert );
        } );
 
-       QUnit.test( 'basic operation when synchronous (options.instantHide)', 2, function ( assert ) {
+       QUnit.test( 'basic operation when synchronous (options.instantHide)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { instantHide: true }
                assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
        } );
 
-       QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
+       QUnit.test( 'mw-made-collapsible data added', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div>' + loremIpsum + '</div>'
                        );
                assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
        } );
 
-       QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
+       QUnit.test( 'mw-collapsible added when missing', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div>' + loremIpsum + '</div>'
                        );
                assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
        } );
 
-       QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
+       QUnit.test( 'mw-collapsed added when missing', function ( assert ) {
                var $collapsible = prepareCollapsible(
                        '<div>' + loremIpsum + '</div>',
                                { collapsed: true }
                assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
        } );
 
-       QUnit.test( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
+       QUnit.test( 'initial collapse (mw-collapsed class)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
                        ),
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
        } );
 
-       QUnit.test( 'initial collapse (options.collapsed)', 2, function ( assert ) {
+       QUnit.test( 'initial collapse (options.collapsed)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { collapsed: true }
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
        } );
 
-       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', 2, function ( assert ) {
+       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' +
                                        '<div class="mw-collapsible-toggle">' +
                assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
        } );
 
-       QUnit.test( 'collapse/expand text (data-collapsetext, data-expandtext)', 2, function ( assert ) {
+       QUnit.test( 'collapse/expand text (data-collapsetext, data-expandtext)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
                                        loremIpsum +
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
        } );
 
-       QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
+       QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { collapseText: 'Collapse me!', expandText: 'Expand me!' }
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
        } );
 
-       QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
-               var test = this,
-                       $collapsible = prepareCollapsible(
+       QUnit.test( 'cloned collapsibles can be made collapsible again', function ( assert ) {
+               var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' + loremIpsum + '</div>'
                        ),
                        $clone = $collapsible.clone() // clone without data and events
index 029edd5..aeda516 100644 (file)
@@ -10,7 +10,7 @@
                }
        } ) );
 
-       QUnit.test( 'String functions', 7, function ( assert ) {
+       QUnit.test( 'String functions', function ( assert ) {
                assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
                assert.equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
                assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
@@ -24,7 +24,7 @@
                assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
        } );
 
-       QUnit.test( 'isDomElement', 6, function ( assert ) {
+       QUnit.test( 'isDomElement', function ( assert ) {
                assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
                        'isDomElement: HTMLElement' );
                assert.strictEqual( $.isDomElement( document.createTextNode( '' ) ), true,
@@ -39,7 +39,7 @@
                        'isDomElement: Plain Object' );
        } );
 
-       QUnit.test( 'isEmpty', 7, function ( assert ) {
+       QUnit.test( 'isEmpty', function ( assert ) {
                assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmpty: "string"' );
                assert.strictEqual( $.isEmpty( '0' ), true, 'isEmpty: "0"' );
                assert.strictEqual( $.isEmpty( '' ), true, 'isEmpty: ""' );
@@ -51,7 +51,7 @@
                assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmpty: { length: 0 }' );
        } );
 
-       QUnit.test( 'Comparison functions', 5, function ( assert ) {
+       QUnit.test( 'Comparison functions', function ( assert ) {
                assert.ok( $.compareArray( [ 0, 'a', [], [ 2, 'b' ] ], [ 0, 'a', [], [ 2, 'b' ] ] ),
                        'compareArray: Two deep arrays that are excactly the same' );
                assert.ok( !$.compareArray( [ 1 ], [ 2 ] ), 'compareArray: Two different arrays (false)' );
index 5d0ddeb..dd7666b 100644 (file)
@@ -1,8 +1,9 @@
 ( function ( $ ) {
+       var html, testElement;
 
        QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'caches results of feature tests', 2, function ( assert ) {
+       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' );
        } );
                return;
        }
 
-       var 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>',
+       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' );
 
                $el.placeholder( placeholder );
        };
 
-       QUnit.test( 'emulates placeholder for <input type=text>', 22, function ( assert ) {
+       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>', 22, function ( 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>', 22, function ( 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>', 22, function ( 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>', 22, function ( 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>', 13, function ( 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' ) );
 
-               var selector = '#input-type-password',
-                       $el = $( selector ),
-                       el = $el[ 0 ],
-                       placeholder = el.getAttribute( 'placeholder' );
+               $el = $( selector );
+               el = $el[ 0 ];
+               placeholder = el.getAttribute( 'placeholder' );
 
                assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
 
 
        } );
 
-       QUnit.test( 'emulates placeholder for <textarea></textarea>', 22, function ( assert ) {
+       QUnit.test( 'emulates placeholder for <textarea>', function ( assert ) {
                $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
                testElement( $( '#textarea' ), assert );
        } );
index 1213793..ec3539b 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'firstTabIndex', 2, function ( assert ) {
+       QUnit.test( 'firstTabIndex', function ( assert ) {
                var html, $testA, $testB;
                html = '<form>' +
                        '<input tabindex="7" />' +
@@ -17,7 +17,7 @@
                assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
        } );
 
-       QUnit.test( 'lastTabIndex', 2, function ( assert ) {
+       QUnit.test( 'lastTabIndex', function ( assert ) {
                var html, $testA, $testB;
                html = '<form>' +
                        '<input tabindex="7" />' +
index 5203def..c0b1657 100644 (file)
                                                'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
                                names: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
+                                       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
@@ -54,7 +54,7 @@
         * @param {function($table)} callback something to do before we start the testcase
         */
        function parserTest( msg, parserId, data, callback ) {
-               QUnit.test( msg, data.length * 2, function ( assert ) {
+               QUnit.test( msg, function ( assert ) {
                        var extractedR, extractedF, parser;
 
                        if ( callback !== undefined ) {
@@ -73,7 +73,7 @@
                } );
        }
 
-       text  = [
+       text = [
                [ 'Mars', true, 'mars', 'Simple text' ],
                [ 'Mẘas', true, 'mẘas', 'Non ascii character' ],
                [ 'A sentence', true, 'a sentence', 'A sentence with space chars' ]
                } );
        } );
 
-       // TODO add numbers sorting tests for bug 8115 with a different language
+       // TODO add numbers sorting tests for T10115 with a different language
 
 }( jQuery, mediaWiki ) );
index 483a37d..5b973f6 100644 (file)
                                                'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
                                names: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                                       'July', 'August', 'September', 'October', 'November', 'December' ],
                                abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
+                                       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
                $tr.appendTo( $thead );
 
                for ( i = 0; i < data.length; i++ ) {
-                       /*jshint loopfunc: true */
                        $tr = $( '<tr>' );
+                       // eslint-disable-next-line no-loop-func
                        $.each( data[ i ], function ( j, str ) {
                                var $td = $( '<td>' );
                                $td.text( str ).appendTo( $tr );
                simple,
                simpleAsc,
                function ( $table ) {
+                       var event;
                        $table.tablesorter(
                                { sortList: [ { 0: 'desc' }, { 1: 'desc' } ] }
                        );
                        $table.find( '.headerSort:eq(0)' ).click();
 
                        // Pretend to click while pressing the multi-sort key
-                       var event = $.Event( 'click' );
+                       event = $.Event( 'click' );
                        event[ $table.data( 'tablesorter' ).config.sortMultiSortKey ] = true;
                        $table.find( '.headerSort:eq(1)' ).trigger( event );
                }
        );
-       QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
+       QUnit.test( 'Reset sorting making table appear unsorted', function ( assert ) {
                var $table = tableCreate( header, simple );
                $table.tablesorter(
                        { sortList: [
                }
        );
 
-       QUnit.test( 'Basic planet table: one unsortable column', 3, function ( assert ) {
+       QUnit.test( 'Basic planet table: one unsortable column', function ( assert ) {
                var $table = tableCreate( header, planets ),
                        $cell;
                $table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
 
        // Regression tests!
        tableTest(
-               'Bug 28775: German-style (dmy) short numeric dates',
+               'T30775: German-style (dmy) short numeric dates',
                [ 'Date' ],
                [
                        // German-style dates are day-month-year
        );
 
        tableTest(
-               'Bug 28775: American-style (mdy) short numeric dates',
+               'T30775: American-style (mdy) short numeric dates',
                [ 'Date' ],
                [
                        // American-style dates are month-day-year
        );
 
        tableTest(
-               'Bug 17141: IPv4 address sorting',
+               'T19141: IPv4 address sorting',
                [ 'IP' ],
                ipv4,
                ipv4Sorted,
                }
        );
        tableTest(
-               'Bug 17141: IPv4 address sorting (reverse)',
+               'T19141: IPv4 address sorting (reverse)',
                [ 'IP' ],
                ipv4,
                reversed( ipv4Sorted ),
                }
        );
 
-       QUnit.test( 'Rowspan not exploded on init', 1, function ( assert ) {
+       QUnit.test( 'Rowspan not exploded on init', function ( assert ) {
                var $table = tableCreate( header, planets );
 
                // Modify the table to have a multiple-row-spanning cell:
                }
        );
 
-       QUnit.test( 'Test detection routine', 1, function ( assert ) {
+       QUnit.test( 'Test detection routine', function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
        } );
 
        /** FIXME: the diff output is not very readeable. */
-       QUnit.test( 'bug 32047 - caption must be before thead', 1, function ( assert ) {
+       QUnit.test( 'T34047 - caption must be before thead', function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
                assert.equal(
                        $table.children().get( 0 ).nodeName,
                        'CAPTION',
-                       'First element after <thead> must be <caption> (bug 32047)'
+                       'First element after <thead> must be <caption> (T34047)'
                );
        } );
 
-       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
+       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
                var $table, data;
 
                // Example 1: All cells except one cell without data-sort-value,
                ], 'Order matches expected order (based on data-sort-value attribute values)' );
 
                // Example 3: Test that live changes are used from data-sort-value,
-               // even if they change after the tablesorter is constructed (bug 38152).
+               // even if they change after the tablesorter is constructed (T40152).
                $table = $(
                        '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
                                '<tbody>' +
                        .tablesorter()
                        .find( '.headerSort:eq(0)' ).click();
 
-               // Change the sortValue data properties (bug 38152)
+               // Change the sortValue data properties (T40152)
                // - change data
                $table.find( 'td:contains(A)' ).data( 'sortValue', 3 );
                // - add data
 
        } );
 
-       tableTest( 'bug 8115: sort numbers with commas (ascending)',
+       tableTest( 'T10115: sort numbers with commas (ascending)',
                [ 'Numbers' ], numbers, numbersAsc,
                function ( $table ) {
                        $table.tablesorter();
                }
        );
 
-       tableTest( 'bug 8115: sort numbers with commas (descending)',
+       tableTest( 'T10115: sort numbers with commas (descending)',
                [ 'Numbers' ], numbers, reversed( numbersAsc ),
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click().click();
                }
        );
-       // TODO add numbers sorting tests for bug 8115 with a different language
+       // TODO add numbers sorting tests for T10115 with a different language
 
-       QUnit.test( 'bug 32888 - Tables inside a tableheader cell', 2, function ( assert ) {
+       QUnit.test( 'T34888 - Tables inside a tableheader cell', function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable" id="mw-bug-32888">' +
                assert.equal(
                        $table.find( '> thead:eq(0) > tr > th.headerSort' ).length,
                        1,
-                       'Child tables inside a headercell should not interfere with sortable headers (bug 32888)'
+                       'Child tables inside a headercell should not interfere with sortable headers (T34888)'
                );
                assert.equal(
                        $( '#mw-bug-32888-2' ).find( 'th.headerSort' ).length,
                        0,
-                       'The headers of child tables inside a headercell should not be sortable themselves (bug 32888)'
+                       'The headers of child tables inside a headercell should not be sortable themselves (T34888)'
                );
        } );
 
                }
        );
 
-       QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
+       QUnit.test( 'Sorting images using alt text', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'bug 38911 - The row with the largest amount of columns should receive the sort indicators', 3, function ( assert ) {
+       QUnit.test( 'T40911 - The row with the largest amount of columns should receive the sort indicators', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', 2, function ( assert ) {
+       QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       QUnit.test( 'holes in the table headers should not throw JS errors', 2, function ( assert ) {
+       QUnit.test( 'holes in the table headers should not throw JS errors', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       // bug 53527
-       QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', 2, function ( assert ) {
+       // T55527
+       QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<thead>' +
                );
        } );
 
-       // bug 41889 - exploding rowspans in more complex cases
+       // T43889 - exploding rowspans in more complex cases
        tableTestHTML(
                'Rowspan exploding with row headers',
                '<table class="sortable">' +
                ]
        );
 
-       // bug 53211 - exploding rowspans in more complex cases
+       // T55211 - exploding rowspans in more complex cases
        QUnit.test(
-               'Rowspan exploding with row headers and colspans', 1, function ( assert ) {
+               'Rowspan exploding with row headers and colspans', function ( assert ) {
                        var $table = $( '<table class="sortable">' +
                                '<thead><tr><th rowspan="2">n</th><th colspan="2">foo</th><th rowspan="2">baz</th></tr>' +
                                '<tr><th>foo</th><th>bar</th></tr></thead>' +
                ]
        );
 
-       QUnit.test( 'bug 105731 - incomplete rows in table body', 3, function ( assert ) {
+       QUnit.test( 'T105731 - incomplete rows in table body', function ( assert ) {
                var $table, parsers;
                $table = $(
                        '<table class="sortable">' +
                );
        } );
 
-       QUnit.test( 'bug T114721 - use of expand-child class', 2, function ( assert ) {
+       QUnit.test( 'bug T114721 - use of expand-child class', function ( assert ) {
                var $table, parsers;
                $table = $(
                        '<table class="sortable">' +
index 1001679..f958e09 100644 (file)
@@ -1,4 +1,28 @@
 ( function ( $ ) {
+       var caretSample,
+               sig = {
+                       pre: '--~~~~'
+               },
+               bold = {
+                       pre: '\'\'\'',
+                       peri: 'Bold text',
+                       post: '\'\'\''
+               },
+               h2 = {
+                       pre: '== ',
+                       peri: 'Heading 2',
+                       post: ' ==',
+                       regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
+                       regexReplace: '$1==$3==$4',
+                       ownline: true
+               },
+               ulist = {
+                       pre: '* ',
+                       peri: 'Bulleted list item',
+                       post: '',
+                       ownline: true,
+                       splitlines: true
+               };
 
        QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
 
                }, opt.after );
 
                QUnit.test( opt.description, function ( assert ) {
-                       var $textarea, start, end, options, text, selected,
-                               tests = 1;
-                       if ( opt.after.selected !== null ) {
-                               tests++;
-                       }
-                       QUnit.expect( tests );
+                       var $textarea, start, end, options, text, selected;
 
                        $textarea = $( '<textarea>' );
 
                } );
        }
 
-       var caretSample,
-               sig = {
-                       pre: '--~~~~'
-               },
-               bold = {
-                       pre: '\'\'\'',
-                       peri: 'Bold text',
-                       post: '\'\'\''
-               },
-               h2 = {
-                       pre: '== ',
-                       peri: 'Heading 2',
-                       post: ' ==',
-                       regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
-                       regexReplace: '$1==$3==$4',
-                       ownline: true
-               },
-               ulist = {
-                       pre: '* ',
-                       peri: 'Bulleted list item',
-                       post: '',
-                       ownline: true,
-                       splitlines: true
-               };
-
        encapsulateTest( {
                description: 'Adding sig to end of text',
                before: {
        } );
 
        function caretTest( options ) {
-               QUnit.test( options.description, 2, function ( assert ) {
+               QUnit.test( options.description, function ( assert ) {
                        var pos,
                                $textarea = $( '<textarea>' ).text( options.text );
 
 
        caretSample = 'Some big text that we like to work with. Nothing fancy... you know what I mean?';
 
-       /* @broken: Disabled per bug 34820
+       /* @broken: Disabled per T36820
        caretTest({
-               description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
+               description: 'getCaretPosition with original/empty selection - T33847 with IE 6/7/8',
                text: caretSample,
                start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
                end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
index 1676130..69ab797 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( 'origin is included in GET requests', 1, function ( assert ) {
+       QUnit.test( 'origin is included in GET requests', function ( assert ) {
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
@@ -17,7 +17,7 @@
                return api.get( {} );
        } );
 
-       QUnit.test( 'origin is included in POST requests', 2, function ( assert ) {
+       QUnit.test( 'origin is included in POST requests', function ( assert ) {
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
index a79bff6..8ad1290 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( '.getCategoriesByPrefix()', 1, function ( assert ) {
+       QUnit.test( '.getCategoriesByPrefix()', function ( assert ) {
                this.server.respondWith( [ 200, { 'Content-Type': 'application/json' },
                        '{ "query": { "allpages": [ ' +
                                '{ "title": "Category:Food" },' +
index f83f66c..13d7dcc 100644 (file)
@@ -15,7 +15,7 @@
                                                pages: [ {
                                                        pageid: 1,
                                                        ns: 0,
-                                                       title:  'Sandbox',
+                                                       title: 'Sandbox',
                                                        revisions: [ {
                                                                timestamp: '2016-01-01T12:00:00Z',
                                                                contentformat: 'text/x-wiki',
@@ -56,7 +56,7 @@
                                                pages: [ {
                                                        pageid: 4,
                                                        ns: 0,
-                                                       title:  'Async',
+                                                       title: 'Async',
                                                        revisions: [ {
                                                                timestamp: '2016-02-01T12:00:00Z',
                                                                contentformat: 'text/x-wiki',
@@ -97,7 +97,7 @@
                                                pages: [ {
                                                        pageid: 3,
                                                        ns: 0,
-                                                       title:  'Param',
+                                                       title: 'Param',
                                                        revisions: [ {
                                                                timestamp: '2016-03-01T12:00:00Z',
                                                                contentformat: 'text/x-wiki',
                        if ( /edit.+text=Sand/.test( req.requestBody ) ) {
                                req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
                                        edit: {
-                                               'new': true,
+                                               new: true,
                                                result: 'Success',
                                                newrevid: 41,
                                                newtimestamp: '2016-04-01T12:00:00Z'
index d8b5db8..7282b3f 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( '.getMessages()', 1, function ( assert ) {
+       QUnit.test( '.getMessages()', function ( assert ) {
                this.server.respondWith( /ammessages=foo%7Cbaz/, [
                        200,
                        { 'Content-Type': 'application/json' },
index 7ed1875..854e4b1 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.test( 'saveOption', 2, function ( assert ) {
+       QUnit.test( 'saveOption', function ( assert ) {
                var api = new mw.Api(),
                        stub = this.sandbox.stub( mw.Api.prototype, 'saveOptions' );
 
@@ -16,7 +16,7 @@
                assert.deepEqual( stub.getCall( 0 ).args, [ { foo: 'bar' } ], '#saveOptions called correctly' );
        } );
 
-       QUnit.test( 'saveOptions without Unit Separator', 13, function ( assert ) {
+       QUnit.test( 'saveOptions without Unit Separator', function ( assert ) {
                var api = new mw.Api( { useUS: false } );
 
                // We need to respond to the request for token first, otherwise the other requests won't be sent
 
                // Requests are POST, match requestBody instead of url
                this.server.respond( function ( request ) {
-                       switch ( request.requestBody ) {
+                       if ( $.inArray( request.requestBody, [
                                // simple
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C',
                                // two options
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C',
                                // not bundleable
-                               case 'action=options&format=json&formatversion=2&optionname=foo&optionvalue=bar%7Cquux&token=%2B%5C':
-                               case 'action=options&format=json&formatversion=2&optionname=bar&optionvalue=a%7Cb%7Cc&token=%2B%5C':
-                               case 'action=options&format=json&formatversion=2&change=baz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&optionname=foo&optionvalue=bar%7Cquux&token=%2B%5C',
+                               'action=options&format=json&formatversion=2&optionname=bar&optionvalue=a%7Cb%7Cc&token=%2B%5C',
+                               'action=options&format=json&formatversion=2&change=baz%3Dquux&token=%2B%5C',
                                // reset an option
-                               case 'action=options&format=json&formatversion=2&change=foo&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo&token=%2B%5C',
                                // reset an option, not bundleable
-                               case 'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C':
-                                       assert.ok( true, 'Repond to ' + request.requestBody );
-                                       request.respond( 200, { 'Content-Type': 'application/json' },
-                                               '{ "options": "success" }' );
-                                       break;
-                               default:
-                                       assert.ok( false, 'Unexpected request: ' + request.requestBody );
+                               'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C'
+                       ] ) !== -1 ) {
+                               assert.ok( true, 'Repond to ' + request.requestBody );
+                               request.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "options": "success" }' );
+                       } else {
+                               assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
 
@@ -74,7 +74,7 @@
                );
        } );
 
-       QUnit.test( 'saveOptions with Unit Separator', 14, function ( assert ) {
+       QUnit.test( 'saveOptions with Unit Separator', function ( assert ) {
                var api = new mw.Api( { useUS: true } );
 
                // We need to respond to the request for token first, otherwise the other requests won't be sent
 
                // Requests are POST, match requestBody instead of url
                this.server.respond( function ( request ) {
-                       switch ( request.requestBody ) {
+                       if ( $.inArray( request.requestBody, [
                                // simple
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar&token=%2B%5C',
                                // two options
-                               case 'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo%3Dbar%7Cbaz%3Dquux&token=%2B%5C',
                                // bundleable with unit separator
-                               case 'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc%1Fbaz%3Dquux&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc%1Fbaz%3Dquux&token=%2B%5C',
                                // not bundleable with unit separator
-                               case 'action=options&format=json&formatversion=2&optionname=baz%3Dbaz&optionvalue=quux&token=%2B%5C':
-                               case 'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&optionname=baz%3Dbaz&optionvalue=quux&token=%2B%5C',
+                               'action=options&format=json&formatversion=2&change=%1Ffoo%3Dbar%7Cquux%1Fbar%3Da%7Cb%7Cc&token=%2B%5C',
                                // reset an option
-                               case 'action=options&format=json&formatversion=2&change=foo&token=%2B%5C':
+                               'action=options&format=json&formatversion=2&change=foo&token=%2B%5C',
                                // reset an option, not bundleable
-                               case 'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C':
-                                       assert.ok( true, 'Repond to ' + request.requestBody );
-                                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C'
+                       ] ) !== -1 ) {
+                               assert.ok( true, 'Repond to ' + request.requestBody );
+                               request.respond( 200, { 'Content-Type': 'application/json' },
                                                '{ "options": "success" }' );
-                                       break;
-                               default:
-                                       assert.ok( false, 'Unexpected request: ' + request.requestBody );
+                       } else {
+                               assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
 
index 7d27352..74da009 100644 (file)
@@ -39,7 +39,7 @@
                ] );
 
                return new mw.Api().parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
-                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object'  );
+                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object' );
                } );
        } );
 }( mediaWiki ) );
index 6a00ac9..e10a7fa 100644 (file)
                return sequence( bodies );
        }
 
+       // Utility to make inline use with an assert easier
+       function match( text, pattern ) {
+               var m = text.match( pattern );
+               return m && m[ 1 ] || null;
+       }
+
        QUnit.test( 'get()', function ( assert ) {
                var api = new mw.Api();
 
                return api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
        } );
 
-       QUnit.test( 'Converting arrays to pipe-separated', function ( assert ) {
+       QUnit.test( 'Converting arrays to pipe-separated (string)', function ( assert ) {
                var api = new mw.Api();
 
                this.server.respond( function ( request ) {
-                       assert.ok( request.url.match( /test=foo%7Cbar%7Cbaz/ ), 'Pipe-separated value was submitted' );
+                       assert.equal( match( request.url, /test=([^&]+)/ ), 'foo%7Cbar%7Cbaz', 'Pipe-separated value was submitted' );
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
                return api.get( { test: [ 'foo', 'bar', 'baz' ] } );
        } );
 
+       QUnit.test( 'Converting arrays to pipe-separated (mw.Title)', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( function ( request ) {
+                       assert.equal( match( request.url, /test=([^&]+)/ ), 'Foo%7CBar', 'Pipe-separated value was submitted' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               return api.get( { test: [ new mw.Title( 'Foo' ), new mw.Title( 'Bar' ) ] } );
+       } );
+
+       QUnit.test( 'Converting arrays to pipe-separated (misc primitives)', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( function ( request ) {
+                       assert.equal( match( request.url, /test=([^&]+)/ ), 'true%7Cfalse%7C%7C%7C0%7C1%2E2', 'Pipe-separated value was submitted' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               // undefined/null will become empty string
+               return api.get( { test: [ true, false, undefined, null, 0, 1.2 ] } );
+       } );
+
        QUnit.test( 'Omitting false booleans', function ( assert ) {
                var api = new mw.Api();
 
                        ]
                ) );
 
-               // Don't cache error (bug 65268)
+               // Don't cache error (T67268)
                return api.getToken( 'testerror' )
                        .then( null, function ( err ) {
                                assert.equal( err, 'bite-me', 'Expected error' );
 
                return api.postWithToken( 'testassertpost', { action: 'example', key: 'foo', assert: 'user' } )
                        // Cast error to success and vice versa
-                       .then( function ( ) {
+                       .then( function () {
                                return $.Deferred().reject( 'Unexpected success' );
                        }, function ( errorCode ) {
                                assert.equal( errorCode, 'assertuserfailed', 'getToken fails assert' );
                this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '{ "example": "quux" }' ] );
 
                return api.postWithToken( 'csrf',
-                               { action: 'example' },
-                               {
-                                       headers: {
-                                               'X-Foo': 'Bar'
-                                       }
+                       { action: 'example' },
+                       {
+                               headers: {
+                                       'X-Foo': 'Bar'
                                }
-                       )
-                       .then( function () {
-                               assert.equal( test.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
+                       }
+               )
+               .then( function () {
+                       assert.equal( test.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
 
-                               return api.postWithToken( 'csrf',
-                                       { action: 'example' },
-                                       function () {
-                                               assert.ok( false, 'This parameter cannot be a callback' );
-                                       }
-                               );
-                       } )
-                       .then( function ( data ) {
-                               assert.equal( data.example, 'quux' );
+                       return api.postWithToken( 'csrf',
+                               { action: 'example' },
+                               function () {
+                                       assert.ok( false, 'This parameter cannot be a callback' );
+                               }
+                       );
+               } )
+               .then( function ( data ) {
+                       assert.equal( data.example, 'quux' );
 
-                               assert.equal( test.server.requests.length, 2, 'Request made' );
-                       } );
+                       assert.equal( test.server.requests.length, 2, 'Request made' );
+               } );
        } );
 
        QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
                }
        } );
 
-       QUnit.test( '#abort', 3, function ( assert ) {
+       QUnit.test( '#abort', function ( assert ) {
                this.api.get( {
                        a: 1
                } );
index b1bd12b..bfaf7f2 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
 
-       QUnit.test( 'Basic functionality', 2, function ( assert ) {
+       QUnit.test( 'Basic functionality', function ( assert ) {
                var api = new mw.Api();
                assert.ok( api.upload );
                assert.throws( function () {
@@ -9,7 +9,7 @@
                } );
        } );
 
-       QUnit.test( 'Set up iframe upload', 5, function ( assert ) {
+       QUnit.test( 'Set up iframe upload', function ( assert ) {
                var $iframe, $form, $input,
                        api = new mw.Api();
 
diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
new file mode 100644 (file)
index 0000000..25ea988
--- /dev/null
@@ -0,0 +1,179 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.rcfilters - FilterItem' );
+
+       QUnit.test( 'Initializing filter item', function ( assert ) {
+               var item,
+                       group1 = new mw.rcfilters.dm.FilterGroup( 'group1' );
+
+               item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+               assert.equal(
+                       item.getName(),
+                       'filter1',
+                       'Filter name is retained.'
+               );
+               assert.equal(
+                       item.getGroupName(),
+                       'group1',
+                       'Group name is retained.'
+               );
+
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               label: 'test label',
+                               description: 'test description'
+                       }
+               );
+               assert.equal(
+                       item.getLabel(),
+                       'test label',
+                       'Label information is retained.'
+               );
+               assert.equal(
+                       item.getLabel(),
+                       'test label',
+                       'Description information is retained.'
+               );
+
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               selected: true
+                       }
+               );
+               assert.equal(
+                       item.isSelected(),
+                       true,
+                       'Item can be selected in the config.'
+               );
+               item.toggleSelected( true );
+               assert.equal(
+                       item.isSelected(),
+                       true,
+                       'Item can toggle its selected state.'
+               );
+
+               // Subsets
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               subset: [ 'sub1', 'sub2', 'sub3' ]
+                       }
+               );
+               assert.deepEqual(
+                       item.getSubset(),
+                       [ 'sub1', 'sub2', 'sub3' ],
+                       'Subset information is retained.'
+               );
+               assert.equal(
+                       item.existsInSubset( 'sub1' ),
+                       true,
+                       'Specific item exists in subset.'
+               );
+               assert.equal(
+                       item.existsInSubset( 'sub10' ),
+                       false,
+                       'Specific item does not exists in subset.'
+               );
+               assert.equal(
+                       item.isIncluded(),
+                       false,
+                       'Initial state of "included" is false.'
+               );
+
+               item.toggleIncluded( true );
+               assert.equal(
+                       item.isIncluded(),
+                       true,
+                       'Item toggles its included state.'
+               );
+
+               // Conflicts
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               conflicts: [ 'conflict1', 'conflict2', 'conflict3' ]
+                       }
+               );
+               assert.deepEqual(
+                       item.getConflicts(),
+                       [ 'conflict1', 'conflict2', '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', group1 ) ),
+                       true,
+                       'Specific item exists in conflicts.'
+               );
+               assert.equal(
+                       item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict10', group1 ) ),
+                       false,
+                       'Specific item does not exists in conflicts.'
+               );
+               assert.equal(
+                       item.isConflicted(),
+                       false,
+                       'Initial state of "conflicted" is false.'
+               );
+
+               item.toggleConflicted( true );
+               assert.equal(
+                       item.isConflicted(),
+                       true,
+                       'Item toggles its conflicted state.'
+               );
+
+               // Fully covered
+               item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+               assert.equal(
+                       item.isFullyCovered(),
+                       false,
+                       'Initial state of "full coverage" is false.'
+               );
+               item.toggleFullyCovered( true );
+               assert.equal(
+                       item.isFullyCovered(),
+                       true,
+                       'Item toggles its fully coverage state.'
+               );
+
+       } );
+
+       QUnit.test( 'Emitting events', function ( assert ) {
+               var group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ),
+                       item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ),
+                       events = [];
+
+               // Listen to update events
+               item.on( 'update', function () {
+                       events.push( item.getState() );
+               } );
+
+               // Do stuff
+               item.toggleSelected( true ); // { selected: true, included: false, conflicted: false, fullyCovered: false }
+               item.toggleSelected( true ); // No event (duplicate state)
+               item.toggleIncluded( true ); // { selected: true, included: true, conflicted: false, fullyCovered: false }
+               item.toggleConflicted( true ); // { selected: true, included: true, conflicted: true, fullyCovered: false }
+               item.toggleFullyCovered( true ); // { selected: true, included: true, conflicted: true, fullyCovered: true }
+               item.toggleSelected(); // { selected: false, included: true, conflicted: true, fullyCovered: true }
+
+               // Check emitted events
+               assert.deepEqual(
+                       events,
+                       [
+                               { selected: true, included: false, conflicted: false, fullyCovered: false },
+                               { selected: true, included: true, conflicted: false, fullyCovered: false },
+                               { selected: true, included: true, conflicted: true, fullyCovered: false },
+                               { selected: true, included: true, conflicted: true, fullyCovered: true },
+                               { selected: false, included: true, conflicted: true, fullyCovered: true }
+                       ],
+                       'Events emitted successfully.'
+               );
+       } );
+}( mediaWiki ) );
index 62d247a..3a940d0 100644 (file)
                var matches,
                        definition = {
                                group1: {
-                                       title: 'Group 1',
+                                       title: 'Group 1 title',
                                        type: 'send_unselected_if_any',
                                        filters: [
                                                {
                                        ]
                                },
                                group2: {
-                                       title: 'Group 2',
+                                       title: 'Group 2 title',
                                        type: 'send_unselected_if_any',
                                        filters: [
                                                {
                                                },
                                                {
                                                        name: 'group2filter2',
-                                                       label: 'Group 2: Filter 2',
+                                                       label: 'xGroup 2: Filter 2',
                                                        description: 'Description of Filter 2 in Group 2'
                                                }
                                        ]
                                }
                        },
-                       model = new mw.rcfilters.dm.FiltersViewModel();
+                       testCases = [
+                               {
+                                       query: 'group',
+                                       expectedMatches: {
+                                               group1: [ 'group1filter1', 'group1filter2' ],
+                                               group2: [ 'group2filter1' ]
+                                       },
+                                       reason: 'Finds filters starting with the query string'
+                               },
+                               {
+                                       query: 'filter 2 in group',
+                                       expectedMatches: {
+                                               group1: [ 'group1filter2' ],
+                                               group2: [ 'group2filter2' ]
+                                       },
+                                       reason: 'Finds filters containing the query string in their description'
+                               },
+                               {
+                                       query: 'title',
+                                       expectedMatches: {
+                                               group1: [ 'group1filter1', 'group1filter2' ],
+                                               group2: [ 'group2filter1', 'group2filter2' ]
+                                       },
+                                       reason: 'Finds filters containing the query string in their group title'
+                               }
+                       ],
+                       model = new mw.rcfilters.dm.FiltersViewModel(),
+                       extractNames = function ( matches ) {
+                               var result = {};
+                               Object.keys( matches ).forEach( function ( groupName ) {
+                                       result[ groupName ] = matches[ groupName ].map( function ( item ) {
+                                               return item.getName();
+                                       } );
+                               } );
+                               return result;
+                       };
 
                model.initializeFilters( definition );
 
-               matches = model.findMatches( 'group 1' );
-               assert.equal(
-                       matches.group1.length,
-                       2,
-                       'findMatches finds correct group with correct number of results'
-               );
-
-               assert.deepEqual(
-                       matches.group1.map( function ( item ) { return item.getName(); } ),
-                       [ 'group1filter1', 'group1filter2' ],
-                       'findMatches finds the correct items within a single group'
-               );
-
-               matches = model.findMatches( 'filter 1' );
-               assert.ok(
-                       matches.group1.length === 1 && matches.group2.length === 1,
-                       'findMatches finds correct number of results in multiple groups'
-               );
-
-               assert.deepEqual(
-                       [
-                               matches.group1.map( function ( item ) { return item.getName(); } ),
-                               matches.group2.map( function ( item ) { return item.getName(); } )
-                       ],
-                       [
-                               [ 'group1filter1' ],
-                               [ 'group2filter1' ]
-                       ],
-                       'findMatches finds the correct items within multiple groups'
-               );
+               testCases.forEach( function ( testCase ) {
+                       matches = model.findMatches( testCase.query );
+                       assert.deepEqual(
+                               extractNames( matches ),
+                               testCase.expectedMatches,
+                               testCase.reason
+                       );
+               } );
 
                matches = model.findMatches( 'foo' );
                assert.ok(
                                hidefilter4: 0,
                                hidefilter5: 0,
                                hidefilter6: 0,
-                               group3: 'all',
+                               group3: 'all'
                        },
                        'Unselected filters return all parameters falsey or \'all\'.'
                );
                                group1: {
                                        title: 'Group 1',
                                        type: 'send_unselected_if_any',
-                                       exclusionType: 'default',
                                        filters: [
                                                {
                                                        name: 'hidefilter1',
                                        ]
                                }
                        },
+                       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
+                       },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                model.initializeFilters( definition );
 
                assert.deepEqual(
-                       model.getFullState(),
+                       model.getSelectedState(),
                        {
-                               // Group 1
-                               hidefilter1: { selected: true, active: true },
-                               hidefilter2: { selected: false, active: true },
-                               hidefilter3: { selected: true, active: true },
-                               // Group 2
-                               hidefilter4: { selected: false, active: true },
-                               hidefilter5: { selected: true, active: true },
-                               hidefilter6: { selected: false, active: true },
+                               hidefilter1: false,
+                               hidefilter2: false,
+                               hidefilter3: false,
+                               hidefilter4: false,
+                               hidefilter5: false,
+                               hidefilter6: false
                        },
-                       'Initial state: all filters are active, and select states are default.'
+                       'Initial state: default filters are not selected (controller selects defaults explicitly).'
                );
 
-               // Default behavior for 'exclusion' type with only 1 item selected, means that:
-               // - The items in the same group that are *not* selected are *not* active
-               // - Items in other groups are unaffected (all active)
                model.updateFilters( {
                        hidefilter1: false,
-                       hidefilter2: false,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: true
+                       hidefilter3: false
                } );
-               assert.deepEqual(
-                       model.getFullState(),
-                       {
-                               // Group 1: not affected
-                               hidefilter1: { selected: false, active: true },
-                               hidefilter2: { selected: false, active: true },
-                               hidefilter3: { selected: false, active: true },
-                               // Group 2: affected
-                               hidefilter4: { selected: false, active: false },
-                               hidefilter5: { selected: false, active: false },
-                               hidefilter6: { selected: true, active: true },
-                       },
-                       'Default exclusion behavior with 1 item selected in the group.'
-               );
 
-               // Default behavior for 'exclusion' type with multiple items selected, but not all, means that:
-               // - The items in the same group that are *not* selected are *not* active
-               // - Items in other groups are unaffected (all active)
-               model.updateFilters( {
-                       // Literally updating filters to create a clean state
-                       hidefilter1: false,
-                       hidefilter2: false,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: true,
-                       hidefilter6: true
-               } );
-               assert.deepEqual(
-                       model.getFullState(),
-                       {
-                               // Group 1: not affected
-                               hidefilter1: { selected: false, active: true },
-                               hidefilter2: { selected: false, active: true },
-                               hidefilter3: { selected: false, active: true },
-                               // Group 2: affected
-                               hidefilter4: { selected: false, active: false },
-                               hidefilter5: { selected: true, active: true },
-                               hidefilter6: { selected: true, active: true },
-                       },
-                       'Default exclusion behavior with multiple items (but not all) selected in the group.'
-               );
+               model.setFiltersToDefaults();
 
-               // Default behavior for 'exclusion' type with all items in the group selected, means that:
-               // - All items in the group are NOT active
-               // - Items in other groups are unaffected (all active)
-               model.updateFilters( {
-                       // Literally updating filters to create a clean state
-                       hidefilter1: false,
-                       hidefilter2: false,
-                       hidefilter3: false,
-                       hidefilter4: true,
-                       hidefilter5: true,
-                       hidefilter6: true
-               } );
                assert.deepEqual(
-                       model.getFullState(),
-                       {
-                               // Group 1: not affected
-                               hidefilter1: { selected: false, active: true },
-                               hidefilter2: { selected: false, active: true },
-                               hidefilter3: { selected: false, active: true },
-                               // Group 2: affected
-                               hidefilter4: { selected: true, active: false },
-                               hidefilter5: { selected: true, active: false },
-                               hidefilter6: { selected: true, active: false },
-                       },
-                       'Default exclusion behavior with all items in the group.'
+                       model.getSelectedState(),
+                       defaultFilterRepresentation,
+                       'Changing values of filters and then returning to defaults still results in default filters being selected.'
                );
        } );
 
-       QUnit.test( 'reapplyActiveFilters - "explicit" exclusion rules', function ( assert ) {
+       QUnit.test( 'Filter interaction: subsets', function ( assert ) {
                var definition = {
                                group1: {
                                        title: 'Group 1',
-                                       type: 'send_unselected_if_any',
-                                       exclusionType: 'explicit',
+                                       type: 'string_options',
                                        filters: [
                                                {
                                                        name: 'filter1',
-                                                       excludes: [ 'filter2', 'filter3' ],
                                                        label: 'Show filter 1',
-                                                       description: 'Description of Filter 1 in Group 1'
+                                                       description: 'Description of Filter 1 in Group 1',
+                                                       subset: [ 'filter2', 'filter5' ]
                                                },
                                                {
                                                        name: 'filter2',
-                                                       excludes: [ 'filter3' ],
                                                        label: 'Show filter 2',
                                                        description: 'Description of Filter 2 in Group 1'
                                                },
                                                {
                                                        name: 'filter3',
                                                        label: 'Show filter 3',
-                                                       excludes: [ 'filter1' ],
                                                        description: 'Description of Filter 3 in Group 1'
-                                               },
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
                                                {
                                                        name: 'filter4',
                                                        label: 'Show filter 4',
-                                                       description: 'Description of Filter 4 in Group 1'
+                                                       description: 'Description of Filter 1 in Group 2',
+                                                       subset: [ 'filter3', 'filter5' ]
+                                               },
+                                               {
+                                                       name: 'filter5',
+                                                       label: 'Show filter 5',
+                                                       description: 'Description of Filter 2 in Group 2'
+                                               },
+                                               {
+                                                       name: 'filter6',
+                                                       label: 'Show filter 6',
+                                                       description: 'Description of Filter 3 in Group 2'
                                                }
                                        ]
                                }
                        },
-                       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,
-                               // Group 3, "string_options", default values correspond to parameters and filters
-                               filter7: false,
-                               filter8: true,
-                               filter9: false
+                       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 }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                model.initializeFilters( definition );
+               // Select a filter that has subset with another filter
+               model.updateFilters( {
+                       filter1: true
+               } );
 
+               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
-                       {
-                               filter1: { selected: false, active: true },
-                               filter2: { selected: false, active: true },
-                               filter3: { selected: false, active: true },
-                               filter4: { selected: false, active: true }
-                       },
-                       'Initial state: all filters are active.'
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true },
+                               filter2: { included: true },
+                               filter5: { included: true }
+                       } ),
+                       'Filters with subsets are represented in the model.'
                );
 
-               // "Explicit" behavior for 'exclusion' with one item checked:
-               // - Items in the 'excluded' list of the selected filter are inactive
+               // Select another filter that has a subset with the same previous filter
                model.updateFilters( {
-                       // Literally updating filters to create a clean state
-                       filter1: true, // Excludes 'hidefilter2', 'hidefilter3'
-                       filter2: false, // Excludes 'hidefilter3'
-                       filter3: false, // Excludes 'hidefilter1'
-                       filter4: false // No exclusion list
+                       filter4: true
                } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
                assert.deepEqual(
                        model.getFullState(),
-                       {
-                               filter1: { selected: true, active: true },
-                               filter2: { selected: false, active: false },
-                               filter3: { selected: false, active: false },
-                               filter4: { selected: false, active: true }
-                       },
-                       '"Explicit" exclusion behavior with one item selected that has an exclusion list.'
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true },
+                               filter2: { included: true },
+                               filter3: { included: true },
+                               filter4: { selected: true },
+                               filter5: { included: true }
+                       } ),
+                       'Filters that have multiple subsets are represented.'
                );
 
-               // "Explicit" behavior for 'exclusion' with two item checked:
-               // - Items in the 'excluded' list of each of the selected filter are inactive
+               // Remove one filter (but leave the other) that affects filter2
                model.updateFilters( {
-                       // Literally updating filters to create a clean state
-                       filter1: true, // Excludes 'hidefilter2', 'hidefilter3'
-                       filter2: false, // Excludes 'hidefilter3'
-                       filter3: true, // Excludes 'hidefilter1'
-                       filter4: false // No exclusion list
+                       filter1: false
                } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
-                       {
-                               filter1: { selected: true, active: false },
-                               filter2: { selected: false, active: false },
-                               filter3: { selected: true, active: false },
-                               filter4: { selected: false, active: true }
+                       $.extend( true, {}, baseFullState, {
+                               filter2: { included: false },
+                               filter3: { included: true },
+                               filter4: { selected: true },
+                               filter5: { included: true }
+                       } ),
+                       'Removing a filter only un-includes its subset if there is no other filter affecting.'
+               );
+
+               model.updateFilters( {
+                       filter4: false
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               assert.deepEqual(
+                       model.getFullState(),
+                       baseFullState,
+                       'Removing all supersets also un-includes the subsets.'
+               );
+       } );
+
+       QUnit.test( 'Filter interaction: full coverage', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'string_options',
+                                       fullCoverage: false,
+                                       filters: [
+                                               { name: 'filter1' },
+                                               { name: 'filter2' },
+                                               { name: 'filter3' }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       fullCoverage: true,
+                                       filters: [
+                                               { name: 'filter4' },
+                                               { name: 'filter5' },
+                                               { name: 'filter6' }
+                                       ]
+                               }
+                       },
+                       model = new mw.rcfilters.dm.FiltersViewModel(),
+                       isCapsuleItemMuted = function ( filterName ) {
+                               var itemModel = model.getItemByName( filterName ),
+                                       groupModel = itemModel.getGroupModel();
+
+                               // This is the logic inside the capsule widget
+                               return (
+                                       // The capsule item widget only appears if the item is selected
+                                       itemModel.isSelected() &&
+                                       // Muted state is only valid if group is full coverage and all items are selected
+                                       groupModel.isFullCoverage() && groupModel.areAllSelected()
+                               );
+                       },
+                       getCurrentItemsMutedState = function () {
+                               return {
+                                       filter1: isCapsuleItemMuted( 'filter1' ),
+                                       filter2: isCapsuleItemMuted( 'filter2' ),
+                                       filter3: isCapsuleItemMuted( 'filter3' ),
+                                       filter4: isCapsuleItemMuted( 'filter4' ),
+                                       filter5: isCapsuleItemMuted( 'filter5' ),
+                                       filter6: isCapsuleItemMuted( 'filter6' )
+                               };
                        },
-                       '"Explicit" exclusion behavior with two selected items that both have an exclusion list.'
+                       baseMuteState = {
+                               filter1: false,
+                               filter2: false,
+                               filter3: false,
+                               filter4: false,
+                               filter5: false,
+                               filter6: false
+                       };
+
+               model.initializeFilters( definition );
+
+               // Starting state, no selection, all items are non-muted
+               assert.deepEqual(
+                       getCurrentItemsMutedState(),
+                       baseMuteState,
+                       'No selection - all items are non-muted'
                );
 
-               // "Explicit behavior" with two filters that exclude the same item
+               // Select most (but not all) items in each group
+               model.updateFilters( {
+                       filter1: true,
+                       filter2: true,
+                       filter4: true,
+                       filter5: true
+               } );
+
+               // Both groups have multiple (but not all) items selected, all items are non-muted
+               assert.deepEqual(
+                       getCurrentItemsMutedState(),
+                       baseMuteState,
+                       'Not all items in the group selected - all items are non-muted'
+               );
 
-               // Two filters selected, both exclude 'hidefilter3'
+               // Select all items in 'fullCoverage' group (group2)
                model.updateFilters( {
-                       // Literally updating filters to create a clean state
-                       filter1: true, // Excludes 'hidefilter2', 'hidefilter3'
-                       filter2: true, // Excludes 'hidefilter3'
-                       filter3: false, // Excludes 'hidefilter1'
-                       filter4: false // No exclusion list
+                       filter6: true
                } );
+
+               // Group2 (full coverage) has all items selected, all its items are muted
                assert.deepEqual(
-                       model.getFullState(),
-                       {
-                               filter1: { selected: true, active: true },
-                               filter2: { selected: true, active: false }, // Excluded by filter1
-                               filter3: { selected: false, active: false }, // Excluded by both filter1 and filter2
-                               filter4: { selected: false, active: true }
+                       getCurrentItemsMutedState(),
+                       $.extend( {}, baseMuteState, {
+                               filter4: true,
+                               filter5: true,
+                               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.updateFilters( {
+                       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
+                       } ),
+                       '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.updateFilters( {
+                       filter3: false,
+                       filter5: false
+               } );
+               assert.deepEqual(
+                       getCurrentItemsMutedState(),
+                       baseMuteState,
+                       'Not all items in the group are checked - all items are non-muted regardless of group coverage'
+               );
+       } );
+
+       QUnit.test( 'Filter interaction: conflicts', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'string_options',
+                                       filters: [
+                                               {
+                                                       name: 'filter1',
+                                                       conflicts: [ 'filter2', 'filter4' ]
+                                               },
+                                               {
+                                                       name: 'filter2',
+                                                       conflicts: [ 'filter6' ]
+                                               },
+                                               {
+                                                       name: 'filter3'
+                                               }
+                                       ]
+                               },
+                               group2: {
+                                       title: 'Group 2',
+                                       type: 'send_unselected_if_any',
+                                       filters: [
+                                               {
+                                                       name: 'filter4'
+                                               },
+                                               {
+                                                       name: 'filter5',
+                                                       conflicts: [ 'filter3' ]
+                                               },
+                                               {
+                                                       name: 'filter6'
+                                               }
+                                       ]
+                               }
+                       },
+                       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 }
                        },
-                       '"Explicit" exclusion behavior with two selected items that both exclude another item.'
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       baseFullState,
+                       'Initial state: no conflicts because no selections.'
                );
 
-               // Unselect filter2: filter3 should still be excluded, because filter1 excludes it and is selected
+               // Select a filter that has a conflict with another
                model.updateFilters( {
-                       filter2: false, // Excludes 'hidefilter3'
+                       filter1: true // conflicts: filter2, filter4
                } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+
                assert.deepEqual(
                        model.getFullState(),
-                       {
-                               filter1: { selected: true, active: true },
-                               filter2: { selected: false, active: false }, // Excluded by filter1
-                               filter3: { selected: false, active: false }, // Still excluded by filter1
-                               filter4: { selected: false, active: true }
-                       },
-                       '"Explicit" exclusion behavior unselecting one item that excludes another item, that is being excluded by a third active item.'
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true },
+                               filter2: { conflicted: true },
+                               filter4: { conflicted: true }
+                       } ),
+                       'Selecting a filter set its conflicts list as "conflicted".'
+               );
+
+               // Select one of the conflicts (both filters are now conflicted and selected)
+               model.updateFilters( {
+                       filter4: true // conflicts: filter 1
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true, conflicted: true },
+                               filter2: { conflicted: true },
+                               filter4: { selected: true, conflicted: true }
+                       } ),
+                       'Selecting a conflicting filter sets both sides to conflicted and selected.'
                );
 
-               // Unselect filter1: filter3 should now be active, since both filters that exclude it are unselected
+               // Select another filter from filter4 group, meaning:
+               // now filter1 no longer conflicts with filter4
                model.updateFilters( {
-                       filter1: false, // Excludes 'hidefilter3' and 'hidefilter2'
+                       filter6: true // conflicts: filter2
                } );
+               model.reassessFilterInteractions( model.getItemByName( 'filter6' ) );
+
                assert.deepEqual(
                        model.getFullState(),
-                       {
-                               filter1: { selected: false, active: true },
-                               filter2: { selected: false, active: true }, // No longer excluded by filter1
-                               filter3: { selected: false, active: true }, // No longer excluded by either filter1 nor filter2
-                               filter4: { selected: false, active: true }
+                       $.extend( true, {}, baseFullState, {
+                               filter1: { selected: true, conflicted: false }, // No longer conflicts (filter4 is not the only in the group)
+                               filter2: { conflicted: true }, // While not selected, still in conflict with filter1, which is selected
+                               filter4: { selected: true, conflicted: false }, // No longer conflicts with filter1
+                               filter6: { selected: true, conflicted: false }
+                       } ),
+                       'Selecting a non-conflicting filter from a conflicting group removes the conflict'
+               );
+       } );
+
+       QUnit.test( 'Filter highlights', function ( assert ) {
+               var definition = {
+                               group1: {
+                                       title: 'Group 1',
+                                       type: 'string_options',
+                                       filters: [
+                                               { name: 'filter1', class: 'class1' },
+                                               { name: 'filter2', class: 'class2' },
+                                               { name: 'filter3', class: 'class3' },
+                                               { name: 'filter4', class: 'class4' },
+                                               { name: 'filter5', class: 'class5' },
+                                               { name: 'filter6' }
+                                       ]
+                               }
                        },
-                       '"Explicit" exclusion behavior unselecting both items that excluded the same third item.'
+                       model = new mw.rcfilters.dm.FiltersViewModel();
+
+               model.initializeFilters( definition );
+
+               assert.ok(
+                       !model.isHighlightEnabled(),
+                       'Initially, highlight is disabled.'
+               );
+
+               model.toggleHighlight( true );
+               assert.ok(
+                       model.isHighlightEnabled(),
+                       'Highlight is enabled on toggle.'
+               );
+
+               model.setHighlightColor( 'filter1', 'color1' );
+               model.setHighlightColor( 'filter2', 'color2' );
+
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter1',
+                               'filter2'
+                       ],
+                       'Highlighted items are highlighted.'
+               );
+
+               assert.equal(
+                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       'color1',
+                       'Item highlight color is set.'
+               );
+
+               model.setHighlightColor( 'filter1', 'color1changed' );
+               assert.equal(
+                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       'color1changed',
+                       'Item highlight color is changed on setHighlightColor.'
+               );
+
+               model.clearHighlightColor( 'filter1' );
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter2'
+                       ],
+                       'Clear highlight from an item results in the item no longer being highlighted.'
+               );
+
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               model.setHighlightColor( 'filter1', 'color1' );
+               model.setHighlightColor( 'filter2', 'color2' );
+               model.setHighlightColor( 'filter3', 'color3' );
+
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter1',
+                               'filter2',
+                               'filter3'
+                       ],
+                       'Even if highlights are not enabled, the items remember their highlight state'
+                       // NOTE: When actually displaying the highlights, the UI checks whether
+                       // highlighting is generally active and then goes over the highlighted
+                       // items. The item models, however, and the view model in general, still
+                       // retains the knowledge about which filters have different colors, so we
+                       // can seamlessly return to the colors the user previously chose if they
+                       // reapply highlights.
                );
 
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               model.setHighlightColor( 'filter1', 'color1' );
+               model.setHighlightColor( 'filter6', 'color6' );
+
+               assert.deepEqual(
+                       model.getHighlightedItems().map( function ( item ) {
+                               return item.getName();
+                       } ),
+                       [
+                               'filter1'
+                       ],
+                       'Items without a specified class identifier are not highlighted.'
+               );
        } );
 }( mediaWiki, jQuery ) );
index edc2716..35b6b71 100644 (file)
@@ -3,7 +3,7 @@
 
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
-       QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
+       QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
                var selectHtml, $env, $options,
                        rc = require( 'mediawiki.special.recentchanges' );
 
index 2388497..97c82fb 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.RegExp' );
 
-       QUnit.test( 'escape', 16, function ( assert ) {
+       QUnit.test( 'escape', function ( assert ) {
                var specials, normal;
 
                specials = [
index 124c49f..1bc4c06 100644 (file)
@@ -1,79 +1,80 @@
 ( function ( mw, $ ) {
+       /* eslint-disable camelcase */
        var repeat = function ( input, multiplier ) {
-               return new Array( multiplier + 1 ).join( input );
-       },
-       cases = {
+                       return new Array( multiplier + 1 ).join( input );
+               },
                // See also TitleTest.php#testSecureAndSplit
-               valid: [
-                       'Sandbox',
-                       'A "B"',
-                       'A \'B\'',
-                       '.com',
-                       '~',
-                       '"',
-                       '\'',
-                       'Talk:Sandbox',
-                       'Talk:Foo:Sandbox',
-                       'File:Example.svg',
-                       'File_talk:Example.svg',
-                       'Foo/.../Sandbox',
-                       'Sandbox/...',
-                       'A~~',
-                       ':A',
-                       // Length is 256 total, but only title part matters
-                       'Category:' + repeat( 'x', 248 ),
-                       repeat( 'x', 252 )
-               ],
-               invalid: [
-                       '',
-                       ':',
-                       '__  __',
-                       '  __  ',
-                       // Bad characters forbidden regardless of wgLegalTitleChars
-                       'A [ B',
-                       'A ] B',
-                       'A { B',
-                       'A } B',
-                       'A < B',
-                       'A > B',
-                       'A | B',
-                       'A \t B',
-                       'A \n B',
-                       // URL encoding
-                       'A%20B',
-                       'A%23B',
-                       'A%2523B',
-                       // XML/HTML character entity references
-                       // Note: The ones with # are commented out as those are interpreted as fragment and
-                       // as such end up being valid.
-                       'A &eacute; B',
-                       // 'A &#233; B',
-                       // 'A &#x00E9; B',
-                       // Subject of NS_TALK does not roundtrip to NS_MAIN
-                       'Talk:File:Example.svg',
-                       // Directory navigation
-                       '.',
-                       '..',
-                       './Sandbox',
-                       '../Sandbox',
-                       'Foo/./Sandbox',
-                       'Foo/../Sandbox',
-                       'Sandbox/.',
-                       'Sandbox/..',
-                       // Tilde
-                       'A ~~~ Name',
-                       'A ~~~~ Signature',
-                       'A ~~~~~ Timestamp',
-                       repeat( 'x', 256 ),
-                       // Extension separation is a js invention, for length
-                       // purposes it is part of the title
-                       repeat( 'x', 252 ) + '.json',
-                       // Namespace prefix without actual title
-                       'Talk:',
-                       'Category: ',
-                       'Category: #bar'
-               ]
-       };
+               cases = {
+                       valid: [
+                               'Sandbox',
+                               'A "B"',
+                               'A \'B\'',
+                               '.com',
+                               '~',
+                               '"',
+                               '\'',
+                               'Talk:Sandbox',
+                               'Talk:Foo:Sandbox',
+                               'File:Example.svg',
+                               'File_talk:Example.svg',
+                               'Foo/.../Sandbox',
+                               'Sandbox/...',
+                               'A~~',
+                               ':A',
+                               // Length is 256 total, but only title part matters
+                               'Category:' + repeat( 'x', 248 ),
+                               repeat( 'x', 252 )
+                       ],
+                       invalid: [
+                               '',
+                               ':',
+                               '__  __',
+                               '  __  ',
+                               // Bad characters forbidden regardless of wgLegalTitleChars
+                               'A [ B',
+                               'A ] B',
+                               'A { B',
+                               'A } B',
+                               'A < B',
+                               'A > B',
+                               'A | B',
+                               'A \t B',
+                               'A \n B',
+                               // URL encoding
+                               'A%20B',
+                               'A%23B',
+                               'A%2523B',
+                               // XML/HTML character entity references
+                               // Note: The ones with # are commented out as those are interpreted as fragment and
+                               // as such end up being valid.
+                               'A &eacute; B',
+                               // 'A &#233; B',
+                               // 'A &#x00E9; B',
+                               // Subject of NS_TALK does not roundtrip to NS_MAIN
+                               'Talk:File:Example.svg',
+                               // Directory navigation
+                               '.',
+                               '..',
+                               './Sandbox',
+                               '../Sandbox',
+                               'Foo/./Sandbox',
+                               'Foo/../Sandbox',
+                               'Sandbox/.',
+                               'Sandbox/..',
+                               // Tilde
+                               'A ~~~ Name',
+                               'A ~~~~ Signature',
+                               'A ~~~~~ Timestamp',
+                               repeat( 'x', 256 ),
+                               // Extension separation is a js invention, for length
+                               // purposes it is part of the title
+                               repeat( 'x', 252 ) + '.json',
+                               // Namespace prefix without actual title
+                               'Talk:',
+                               'Category: ',
+                               'Category: #bar'
+                       ]
+               };
 
        QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( {
                // mw.Title relies on these three config vars
                                // testing custom / localized namespace
                                100: 'Penguins'
                        },
-                       // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
                        wgNamespaceIds: {
                                media: -2,
                                special: -1,
                                penguins: 100,
                                antarctic_waterfowl: 100
                        },
-                       // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
                        wgCaseSensitiveNamespaces: []
                }
        } ) );
 
-       QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
+       QUnit.test( 'constructor', function ( assert ) {
                var i, title;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        title = new mw.Title( cases.valid[ i ] );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
-                       /*jshint loopfunc:true */
                        title = cases.invalid[ i ];
+                       // eslint-disable-next-line no-loop-func
                        assert.throws( function () {
                                return new mw.Title( title );
                        }, cases.invalid[ i ] );
                }
        } );
 
-       QUnit.test( 'newFromText', cases.valid.length + cases.invalid.length, function ( assert ) {
+       QUnit.test( 'newFromText', function ( assert ) {
                var i;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        assert.equal(
                }
        } );
 
-       QUnit.test( 'makeTitle', 6, function ( assert ) {
+       QUnit.test( 'makeTitle', function ( assert ) {
                var cases, i, title, expected,
                        NS_MAIN = 0,
                        NS_TALK = 1,
                }
        } );
 
-       QUnit.test( 'Basic parsing', 21, function ( assert ) {
+       QUnit.test( 'Basic parsing', function ( assert ) {
                var title;
                title = new mw.Title( 'File:Foo_bar.JPG' );
 
                assert.equal( title.getPrefixedText(), '.foo' );
        } );
 
-       QUnit.test( 'Transformation', 12, function ( assert ) {
+       QUnit.test( 'Transformation', function ( assert ) {
                var title;
 
                title = new mw.Title( 'File:quux pif.jpg' );
                assert.equal( title.getFragment(), ' foo bar baz', 'Fragment' );
        } );
 
-       QUnit.test( 'Namespace detection and conversion', 10, function ( assert ) {
+       QUnit.test( 'Namespace detection and conversion', function ( assert ) {
                var title;
 
                title = new mw.Title( 'File:User:Example' );
                assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
        } );
 
-       QUnit.test( 'Throw error on invalid title', 1, function ( assert ) {
+       QUnit.test( 'Throw error on invalid title', function ( assert ) {
                assert.throws( function () {
                        return new mw.Title( '' );
                }, 'Throw error on empty string' );
        } );
 
-       QUnit.test( 'Case-sensivity', 5, function ( assert ) {
+       QUnit.test( 'Case-sensivity', function ( assert ) {
                var title;
 
                // Default config
                assert.equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
        } );
 
-       QUnit.test( 'toString / toText', 2, function ( assert ) {
+       QUnit.test( 'toString / toText', function ( assert ) {
                var title = new mw.Title( 'Some random page' );
 
                assert.equal( title.toString(), title.getPrefixedDb() );
                assert.equal( title.toText(), title.getPrefixedText() );
        } );
 
-       QUnit.test( 'getExtension', 7, function ( assert ) {
+       QUnit.test( 'getExtension', function ( assert ) {
                function extTest( pagename, ext, description ) {
                        var title = new mw.Title( pagename );
                        assert.equal( title.getExtension(), ext, description || pagename );
 
                extTest( 'MediaWiki:Vector.js', 'js' );
                extTest( 'User:Example/common.css', 'css' );
-               extTest( 'File:Example.longextension', 'longextension', 'Extension parsing not limited (bug 36151)' );
+               extTest( 'File:Example.longextension', 'longextension', 'Extension parsing not limited (T38151)' );
                extTest( 'Example/information.json', 'json', 'Extension parsing not restricted from any namespace' );
                extTest( 'Foo.', null, 'Trailing dot is not an extension' );
                extTest( 'Foo..', null, 'Trailing dots are not an extension' );
                // extTest( '.NET', null, 'Leading dot is (or is not?) an extension' );
        } );
 
-       QUnit.test( 'exists', 3, function ( assert ) {
+       QUnit.test( 'exists', function ( assert ) {
                var title;
 
                // Empty registry, checks default to null
 
        } );
 
-       QUnit.test( 'getUrl', 4, function ( assert ) {
+       QUnit.test( 'getUrl', function ( assert ) {
                var title;
                mw.config.set( {
                        wgScript: '/w/index.php',
                assert.equal( title.getUrl( { meme: true } ), '/w/index.php?title=User_talk:John_Cena&meme=true#And_His_Name_Is', 'title with fragment and query parameter' );
        } );
 
-       QUnit.test( 'newFromImg', 44, function ( assert ) {
+       QUnit.test( 'newFromImg', function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'getRelativeText', 5, function ( assert ) {
+       QUnit.test( 'getRelativeText', function ( assert ) {
                var i, thisCase, title,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'normalizeExtension', 5, function ( assert ) {
+       QUnit.test( 'normalizeExtension', function ( assert ) {
                var extension, i, thisCase, prefix,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'newFromUserInput', 12, function ( assert ) {
+       QUnit.test( 'newFromUserInput', function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                }
        } );
 
-       QUnit.test( 'newFromFileName', 54, function ( assert ) {
+       QUnit.test( 'newFromFileName', function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
index 97185fc..e56c933 100644 (file)
@@ -11,7 +11,7 @@
        } ) );
 
        $.each( [ true, false ], function ( i, strictMode ) {
-               QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', 2, function ( assert ) {
+               QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', function ( assert ) {
                        var uriString, uri;
                        uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
                        uri = new mw.Uri( uriString, {
@@ -59,7 +59,7 @@
                } );
        } );
 
-       QUnit.test( 'Constructor( String[, Object ] )', 11, function ( assert ) {
+       QUnit.test( 'Constructor( String[, Object ] )', function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                } );
                assert.equal( uri.toString(), 'http://example.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
 
-               /*jshint -W001 */
                uri = new mw.Uri( 'http://example.com/index.php?key=key&hasOwnProperty=hasOwnProperty&constructor=constructor&watch=watch' );
                assert.deepEqual(
                        uri.query,
                        },
                        'Keys in query strings support names of Object prototypes (bug T114344)'
                );
-               /*jshint +W001 */
        } );
 
-       QUnit.test( 'Constructor( Object )', 3, function ( assert ) {
+       QUnit.test( 'Constructor( Object )', function ( assert ) {
                var uri = new mw.Uri( {
                        protocol: 'http',
                        host: 'www.foo.local',
                );
        } );
 
-       QUnit.test( 'Constructor( empty )', 4, function ( assert ) {
+       QUnit.test( 'Constructor( empty[, Object ] )', function ( assert ) {
                var testuri, MyUri, uri;
 
-               testuri = 'http://example.org/w/index.php';
+               testuri = 'http://example.org/w/index.php?a=1&a=2';
                MyUri = mw.UriRelative( testuri );
 
                uri = new MyUri();
 
                uri = new MyUri( '' );
                assert.equal( uri.toString(), testuri, 'empty string' );
+
+               uri = new MyUri( null, { overrideKeys: true } );
+               assert.deepEqual( uri.query, { a: '2' }, 'null, with options' );
        } );
 
-       QUnit.test( 'Properties', 8, function ( assert ) {
+       QUnit.test( 'Properties', function ( assert ) {
                var uriBase, uri;
 
                uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
                assert.ok( uri.toString().indexOf( 'pif=paf' ) >= 0, 'extend query arguments' );
        } );
 
-       QUnit.test( '.getQueryString()', 2, function ( assert ) {
+       QUnit.test( '.getQueryString()', function ( assert ) {
                var uri = new mw.Uri( 'http://search.example.com/?q=uri' );
 
                assert.deepEqual(
 
        } );
 
-       QUnit.test( '.clone()', 6, function ( assert ) {
+       QUnit.test( '.clone()', function ( assert ) {
                var original, clone;
 
                original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
                assert.deepEqual(
                        original.query,
                        { one: '1', two: '2' },
-                       'Properties is deep cloned (bug 37708)'
+                       'Properties is deep cloned (T39708)'
                );
        } );
 
-       QUnit.test( '.toString() after query manipulation', 8, function ( assert ) {
+       QUnit.test( '.toString() after query manipulation', function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
        } );
 
-       QUnit.test( 'Variable defaultUri', 2, function ( assert ) {
+       QUnit.test( 'Variable defaultUri', function ( assert ) {
                var uri,
                        href = 'http://example.org/w/index.php#here',
                        UriClass = mw.UriRelative( function () {
                );
        } );
 
-       QUnit.test( 'Advanced URL', 11, function ( assert ) {
+       QUnit.test( 'Advanced URL', function ( assert ) {
                var uri, queryString, relativePath;
 
                uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
                assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragment in relative path' );
        } );
 
-       QUnit.test( 'Parse a uri with an @ symbol in the path and query', 1, function ( assert ) {
+       QUnit.test( 'Parse a uri with an @ symbol in the path and query', function ( assert ) {
                var uri = new mw.Uri( 'http://www.example.com/test@test?x=@uri&y@=uri&z@=@' );
 
                assert.deepEqual(
                );
        } );
 
-       QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
+       QUnit.test( 'Handle protocol-relative URLs', function ( assert ) {
                var UriRel, uri;
 
                UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
                assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
        } );
 
-       QUnit.test( 'bug 35658', 2, function ( assert ) {
+       QUnit.test( 'T37658', function ( assert ) {
                var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
 
                testProtocol = 'https://';
index 399db91..4170897 100644 (file)
@@ -1,6 +1,4 @@
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
-
        var pluralTestcases = {
                /*
                 * Sample:
                ]
        };
 
+       QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
+
        function pluralTest( langCode, tests ) {
-               QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
-                       for ( var i = 0; i < tests.length; i++ ) {
+               QUnit.test( 'Plural Test for ' + langCode, function ( assert ) {
+                       var i;
+                       for ( i = 0; i < tests.length; i++ ) {
                                assert.equal(
                                        mw.language.convertPlural( tests[ i ][ 0 ], tests[ i ][ 1 ] ),
                                        tests[ i ][ 2 ],
index 7a13f0f..59bf737 100644 (file)
@@ -20,7 +20,7 @@
                }
        } ) );
 
-       QUnit.test( 'set( key, value )', 7, function ( assert ) {
+       QUnit.test( 'set( key, value )', function ( assert ) {
                var call;
 
                // Simple case
@@ -53,7 +53,7 @@
                assert.strictEqual( call[ 1 ], '0', '0 is value' );
        } );
 
-       QUnit.test( 'set( key, value, expires )', 6, function ( assert ) {
+       QUnit.test( 'set( key, value, expires )', function ( assert ) {
                var date, options;
 
                date = new Date();
@@ -91,7 +91,7 @@
                assert.strictEqual( options.expires, date, 'custom expiration (with wgCookieExpiration=0)' );
        } );
 
-       QUnit.test( 'set( key, value, options )', 4, function ( assert ) {
+       QUnit.test( 'set( key, value, options )', function ( assert ) {
                var date, call;
 
                mw.cookie.set( 'foo', 'bar', {
                }, 'Options (incl. expires)' );
        } );
 
-       QUnit.test( 'get( key ) - no values', 6, function ( assert ) {
+       QUnit.test( 'get( key ) - no values', function ( assert ) {
                var key, value;
 
                mw.cookie.get( 'foo' );
                assert.strictEqual( value, 'bar', 'Custom default value' );
        } );
 
-       QUnit.test( 'get( key ) - with value', 1, function ( assert ) {
+       QUnit.test( 'get( key ) - with value', function ( assert ) {
                var value;
 
                $.cookie.returns( 'bar' );
                assert.strictEqual( value, 'bar', 'Return value of cookie' );
        } );
 
-       QUnit.test( 'get( key, prefix )', 1, function ( assert ) {
+       QUnit.test( 'get( key, prefix )', function ( assert ) {
                var key;
 
                mw.cookie.get( 'foo', 'bar' );
index 587c893..46d7837 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $, mw ) {
        QUnit.module( 'mediawiki.errorLogger', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'installGlobalHandler', 7, function ( assert ) {
+       QUnit.test( 'installGlobalHandler', function ( assert ) {
                var w = {},
                        errorMessage = 'Foo',
                        errorUrl = 'http://example.com',
@@ -24,7 +24,7 @@
                w.onerror( errorMessage, errorUrl, errorLine, errorColumn, errorObject );
                sinon.assert.calledWithExactly( mw.track, 'global.error',
                        sinon.match( { errorMessage: errorMessage, url: errorUrl, lineNumber: errorLine,
-                       columnNumber: errorColumn, errorObject: errorObject } ) );
+                               columnNumber: errorColumn, errorObject: errorObject } ) );
 
                w = { onerror: oldHandler };
 
index 774b205..177c358 100644 (file)
@@ -17,7 +17,7 @@
 
        QUnit.module( 'mediawiki.experiments' );
 
-       QUnit.test( 'getBucket( experiment, token )', 4, function ( assert ) {
+       QUnit.test( 'getBucket( experiment, token )', function ( assert ) {
                var experiment = createExperiment(),
                        token = '123457890';
 
index b4028ec..16f8cf3 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.html' );
 
-       QUnit.test( 'escape', 2, function ( assert ) {
+       QUnit.test( 'escape', function ( assert ) {
                assert.throws(
                        function () {
                                mw.html.escape();
@@ -17,7 +17,7 @@
                );
        } );
 
-       QUnit.test( 'element()', 1, function ( assert ) {
+       QUnit.test( 'element()', function ( assert ) {
                assert.equal(
                        mw.html.element(),
                        '<undefined/>',
                );
        } );
 
-       QUnit.test( 'element( tagName )', 1, function ( assert ) {
+       QUnit.test( 'element( tagName )', function ( assert ) {
                assert.equal( mw.html.element( 'div' ), '<div/>', 'DIV' );
        } );
 
-       QUnit.test( 'element( tagName, attrs )', 2, function ( assert ) {
+       QUnit.test( 'element( tagName, attrs )', function ( assert ) {
                assert.equal( mw.html.element( 'div', {} ), '<div/>', 'DIV' );
 
                assert.equal(
@@ -43,7 +43,7 @@
                );
        } );
 
-       QUnit.test( 'element( tagName, attrs, content )', 8, function ( assert ) {
+       QUnit.test( 'element( tagName, attrs, content )', function ( assert ) {
 
                assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'DIV with empty attributes and content' );
 
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js
new file mode 100644 (file)
index 0000000..1f7a5ec
--- /dev/null
@@ -0,0 +1,74 @@
+( function ( mw ) {
+
+       QUnit.module( 'mediawiki.inspect' );
+
+       QUnit.test( '.getModuleSize() - scripts', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.script',
+                       function () { 'example'; }
+               );
+
+               return mw.loader.using( 'test.inspect.script' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.script' ),
+                               // name, script function
+                               43,
+                               'test.inspect.script'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, styles', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.both',
+                       function () { 'example'; },
+                       { css: [ '.example {}' ] }
+               );
+
+               return mw.loader.using( 'test.inspect.both' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.both' ),
+                               // name, script function, styles object
+                               64,
+                               'test.inspect.both'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, messages', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.scriptmsg',
+                       function () { 'example'; },
+                       {},
+                       { example: 'Hello world.' }
+               );
+
+               return mw.loader.using( 'test.inspect.scriptmsg' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.scriptmsg' ),
+                               // name, script function, empty styles object, messages object
+                               74,
+                               'test.inspect.scriptmsg'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, styles, messages, templates', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.all',
+                       function () { 'example'; },
+                       { css: [ '.example {}' ] },
+                       { example: 'Hello world.' },
+                       { 'example.html': '<p>Hello world.<p>' }
+               );
+
+               return mw.loader.using( 'test.inspect.all' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.all' ),
+                               // name, script function, styles object, messages object, templates object
+                               126,
+                               'test.inspect.all'
+                       );
+               } );
+       } );
+}( mediaWiki ) );
index f848f3e..3b549bd 100644 (file)
@@ -1,4 +1,5 @@
 ( function ( mw, $ ) {
+       /* eslint-disable camelcase */
        var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
                expectedListUsersSitename, expectedLinkPagenamee, expectedEntrypoints,
                mwLanguageCache = {},
@@ -45,7 +46,6 @@
                },
                config: {
                        wgArticlePath: '/wiki/$1',
-                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
                        wgNamespaceIds: {
                                template: 10,
                                template_talk: 11,
@@ -53,7 +53,6 @@
                                szablon: 10,
                                dyskusja_szablonu: 11
                        },
-                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
                        wgFormattedNamespaces: {
                                // Localised
                                10: 'Szablon',
         *  that may be asynchronous. Invoke the callback parameter when done.
         */
        function process( tasks ) {
-               /*jshint latedef:false */
                function abort() {
                        tasks.splice( 0, tasks.length );
+                       // eslint-disable-next-line no-use-before-define
                        next();
                }
                function next() {
+                       var task;
                        if ( !tasks ) {
                                // This happens if after the process is completed, one of our callbacks is
                                // invoked. This can happen if a test timed out but the process was still
                                // running. In that case, ignore it. Don't invoke complete() a second time.
                                return;
                        }
-                       var task = tasks.shift();
+                       task = tasks.shift();
                        if ( task ) {
                                task( next, abort );
                        } else {
                next();
        }
 
-       QUnit.test( 'Replace', 15, function ( assert ) {
+       QUnit.test( 'Replace', function ( assert ) {
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
                assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
                );
        } );
 
-       QUnit.test( 'Plural', 9, function ( assert ) {
+       QUnit.test( 'Plural', function ( assert ) {
                assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
                assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
                assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
                assert.equal( formatParse( 'plural-empty-explicit-form', 2 ), 'There is me and other people.' );
        } );
 
-       QUnit.test( 'Gender', 15, function ( assert ) {
+       QUnit.test( 'Gender', function ( assert ) {
                var originalGender = mw.user.options.get( 'gender' );
 
                // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
                mw.user.options.set( 'gender', originalGender );
        } );
 
-       QUnit.test( 'Case changing', 8, function ( assert ) {
+       QUnit.test( 'Case changing', function ( assert ) {
                mw.messages.set( 'to-lowercase', '{{lc:thIS hAS MEsSed uP CapItaliZatiON}}' );
                assert.equal( formatParse( 'to-lowercase' ), 'this has messed up capitalization', 'To lowercase' );
 
                assert.equal( formatParse( 'all-caps-except-first' ), 'tHIS HAS MESSED UP CAPITALIZATION', 'To opposite sentence case' );
        } );
 
-       QUnit.test( 'Grammar', 2, function ( assert ) {
+       QUnit.test( 'Grammar', function ( assert ) {
                assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj Wiki', 'Grammar Test with sitename' );
 
                mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
                assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
        } );
 
-       QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+       QUnit.test( 'Match PHP parser', function ( assert ) {
+               var tasks;
                mw.messages.set( mw.libs.phpParserData.messages );
-               var tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
+               tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
                        var done = assert.async();
                        return function ( next, abort ) {
                                getMwLanguage( test.lang )
                                        .then( function ( langClass ) {
+                                               var parser;
                                                mw.config.set( 'wgUserLanguage', test.lang );
-                                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                               // eslint-disable-next-line new-cap
+                                               parser = new mw.jqueryMsg.parser( { language: langClass } );
                                                assert.equal(
                                                        parser.parse( test.key, test.args ).html(),
                                                        test.result,
                process( tasks );
        } );
 
-       QUnit.test( 'Links', 15, function ( assert ) {
+       QUnit.test( 'Links', function ( assert ) {
                var testCases,
                        expectedDisambiguationsText,
                        expectedMultipleBars,
                } );
        } );
 
-       QUnit.test( 'Replacements in links', 14, function ( assert ) {
+       QUnit.test( 'Replacements in links', function ( assert ) {
                var testCases = [
                        [
                                'extlink-param-href-full',
        } );
 
        // Tests that {{-transformation vs. general parsing are done as requested
-       QUnit.test( 'Curly brace transformation', 16, function ( assert ) {
+       QUnit.test( 'Curly brace transformation', function ( assert ) {
                var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
                assertBothModes( assert, [ 'gender-msg', 'Bob', 'male' ], 'Bob: blue', 'gender is resolved' );
                mw.config.set( 'wgUserLanguage', oldUserLang );
        } );
 
-       QUnit.test( 'Int', 4, function ( assert ) {
+       QUnit.test( 'Int', function ( assert ) {
                var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Foobar}}|foobar]] for more info). If you are here by mistake, click your browser\'s back button.',
                        expectedNewarticletext,
                        helpPageTitle = 'Help:Foobar';
                );
        } );
 
-       QUnit.test( 'Ns', 4, function ( assert ) {
+       QUnit.test( 'Ns', function ( assert ) {
                mw.messages.set( 'ns-template-talk', '{{ns:Template talk}}' );
                assert.equal(
                        formatParse( 'ns-template-talk' ),
 
        // Tests that getMessageFunction is used for non-plain messages with curly braces or
        // square brackets, but not otherwise.
-       QUnit.test( 'mw.Message.prototype.parser monkey-patch', 22, function ( assert ) {
+       QUnit.test( 'mw.Message.prototype.parser monkey-patch', function ( assert ) {
                var oldGMF, outerCalled, innerCalled;
 
                mw.messages.set( {
                }
        ];
 
-       QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
+       QUnit.test( 'formatnum', function ( assert ) {
+               var queue;
                mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
                mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
-               var queue = $.map( formatnumTests, function ( test ) {
+               queue = $.map( formatnumTests, function ( test ) {
                        var done = assert.async();
                        return function ( next, abort ) {
                                getMwLanguage( test.lang )
                                        .then( function ( langClass ) {
+                                               var parser;
                                                mw.config.set( 'wgUserLanguage', test.lang );
-                                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                               // eslint-disable-next-line new-cap
+                                               parser = new mw.jqueryMsg.parser( { language: langClass } );
                                                assert.equal(
                                                        parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg',
                                                                [ test.number ] ).html(),
        } );
 
        // HTML in wikitext
-       QUnit.test( 'HTML', 33, function ( assert ) {
+       QUnit.test( 'HTML', function ( assert ) {
                mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
 
                assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
                );
        } );
 
-       QUnit.test( 'Nowiki', 3, function ( assert ) {
+       QUnit.test( 'Nowiki', function ( assert ) {
                mw.messages.set( 'jquerymsg-nowiki-link', 'Foo <nowiki>[[bar]]</nowiki> baz.' );
                assert.equal(
                        formatParse( 'jquerymsg-nowiki-link' ),
                );
        } );
 
-       QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
+       QUnit.test( 'Behavior in case of invalid wikitext', function ( assert ) {
+               var logSpy;
                mw.messages.set( 'invalid-wikitext', '<b>{{FAIL}}</b>' );
 
                this.suppressWarnings();
-               var logSpy = this.sandbox.spy( mw.log, 'warn' );
+               logSpy = this.sandbox.spy( mw.log, 'warn' );
 
                assert.equal(
                        formatParse( 'invalid-wikitext' ),
                assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
        } );
 
-       QUnit.test( 'Integration', 5, function ( assert ) {
+       QUnit.test( 'Integration', function ( assert ) {
                var expected, logSpy, msg;
 
                expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
index 3b5915a..b0b2e7a 100644 (file)
@@ -5,7 +5,7 @@
 ( function ( $ ) {
        QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
+       QUnit.test( 'Variable with Unicode letter in name', function ( assert ) {
                var orig, ŝablono;
 
                orig = 'some token';
        });
        */
 
-       QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function ( assert ) {
+       QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (T14130)', function ( assert ) {
                var maxn, n,
                        expected, $textarea;
 
                maxn = 4;
-               QUnit.expect( maxn * 2 );
 
                function repeat( str, n ) {
                        var out;
index 2171f34..b965079 100644 (file)
@@ -1,6 +1,8 @@
 ( function ( mw, $ ) {
        'use strict';
 
+       var grammarTests;
+
        QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
                setup: function () {
                        this.liveLangData = mw.language.data;
@@ -17,7 +19,7 @@
                }
        } ) );
 
-       QUnit.test( 'mw.language getData and setData', 3, function ( assert ) {
+       QUnit.test( 'mw.language getData and setData', function ( assert ) {
                mw.language.setData( 'en', 'testkey', 'testvalue' );
                assert.equal( mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
                assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
@@ -25,7 +27,7 @@
                assert.equal( mw.language.getData( 'en-US', 'testkey' ), 'testvalue', 'Case insensitive test for mw.language' );
        } );
 
-       QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
+       QUnit.test( 'mw.language.commafy test', function ( assert ) {
                mw.language.setData( 'en', 'digitGroupingPattern', null );
                mw.language.setData( 'en', 'digitTransformTable', null );
                mw.language.setData( 'en', 'separatorTransformTable', null );
                assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' );
        } );
 
-       QUnit.test( 'mw.language.convertNumber', 2, function ( assert ) {
+       QUnit.test( 'mw.language.convertNumber', function ( assert ) {
                mw.language.setData( 'en', 'digitGroupingPattern', null );
                mw.language.setData( 'en', 'digitTransformTable', null );
                mw.language.setData( 'en', 'separatorTransformTable', { ',': '.', '.': ',' } );
                mw.config.set( 'wgUserLanguage', 'en' );
+               mw.config.set( 'wgTranslateNumerals', true );
 
                assert.equal( mw.language.convertNumber( 1800 ), '1.800', 'formatting' );
                assert.equal( mw.language.convertNumber( '1.800', true ), '1800', 'unformatting' );
        } );
 
+       QUnit.test( 'mw.language.convertNumber - digitTransformTable', function ( assert ) {
+               mw.config.set( 'wgUserLanguage', 'hi' );
+               mw.config.set( 'wgTranslateNumerals', true );
+               mw.language.setData( 'hi', 'digitGroupingPattern', null );
+               mw.language.setData( 'hi', 'separatorTransformTable', { ',': '.', '.': ',' } );
+
+               // Example from Hindi (MessagesHi.php)
+               mw.language.setData( 'hi', 'digitTransformTable', {
+                       0: '०',
+                       1: '१',
+                       2: '२'
+               } );
+
+               assert.equal( mw.language.convertNumber( 1200 ), '१.२००', 'format' );
+               assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform' );
+               assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain' );
+
+               mw.config.set( 'wgTranslateNumerals', false );
+
+               assert.equal( mw.language.convertNumber( 1200 ), '1.200', 'format (digit transform disabled)' );
+               assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform (when disabled)' );
+               assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain (digit transform disabled)' );
+       } );
+
        function grammarTest( langCode, test ) {
                // The test works only if the content language is opt.language
                // because it requires [lang].js to be loaded.
                QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
-                       QUnit.expect( test.length );
-
-                       for ( var i = 0; i < test.length; i++ ) {
+                       var i;
+                       for ( i = 0; i < test.length; i++ ) {
                                assert.equal(
                                        mw.language.convertGrammar( test[ i ].word, test[ i ].grammarForm ),
                                        test[ i ].expected,
@@ -70,7 +96,7 @@
        }
 
        // These tests run only for the current UI language.
-       var grammarTests = {
+       grammarTests = {
                bs: [
                        {
                                word: 'word',
                }
        } );
 
-       QUnit.test( 'List to text test', 4, function ( assert ) {
+       QUnit.test( 'List to text test', function ( assert ) {
                assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
                assert.equal( mw.language.listToText( [ 'a' ] ), 'a', 'Single item' );
                assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
index 92ee7dd..6f9af76 100644 (file)
 
                function isCssImportApplied() {
                        // Trigger reflow, repaint, redraw, whatever (cross-browser)
-                       var x = $element.css( 'height' );
-                       x = el.innerHTML;
+                       $element.css( 'height' );
+                       el.innerHTML;
                        el.className = el.className;
-                       x = document.documentElement.clientHeight;
+                       document.documentElement.clientHeight;
 
                        return $element.css( prop ) === val;
                }
@@ -75,7 +75,7 @@
                );
        }
 
-       QUnit.test( 'Basic', 2, function ( assert ) {
+       QUnit.test( 'Basic', function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
@@ -94,7 +94,7 @@
                } );
        } );
 
-       QUnit.test( 'Object method as module name', 2, function ( assert ) {
+       QUnit.test( 'Object method as module name', function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
                } );
        } );
 
-       QUnit.test( '.using( .. ) Promise', 2, function ( assert ) {
+       QUnit.test( '.using( .. ) Promise', function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
                ).always( done );
        } );
 
-       QUnit.test( '.load() - Error: Unregistered (ignored)', 0, function ( assert ) {
+       QUnit.test( '.load() - Error: Unregistered (ignored)', function ( assert ) {
+               assert.expect( 0 );
                mw.loader.load( 'test.using.unreg2' );
        } );
 
-       QUnit.test( '.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+       QUnit.test( '.implement( styles={ "css": [text, ..] } )', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
                return mw.loader.using( 'test.implement.a' );
        } );
 
-       QUnit.test( '.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
+       QUnit.test( '.implement( styles={ "url": { <media>: [url, ..] } } )', function ( assert ) {
                var $element1 = $( '<div class="mw-test-implement-b1"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-b2"></div>' ).appendTo( '#qunit-fixture' ),
                        $element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' ),
                                url: {
                                        print: [ urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' ) ],
                                        screen: [
-                                               // bug 40834: Make sure it actually works with more than 1 stylesheet reference
+                                               // T42834: Make sure it actually works with more than 1 stylesheet reference
                                                urlStyleTest( '.mw-test-implement-b2', 'float', 'left' ),
                                                urlStyleTest( '.mw-test-implement-b3', 'float', 'right' )
                                        ]
        } );
 
        // Backwards compatibility
-       QUnit.test( '.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+       QUnit.test( '.implement( styles={ <media>: text } ) (back-compat)', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
        } );
 
        // Backwards compatibility
-       QUnit.test( '.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
+       QUnit.test( '.implement( styles={ <media>: [url, ..] } ) (back-compat)', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' ),
                        done = assert.async();
                        'test.implement.d',
                        function () {
                                assertStyleAsync( assert, $element, 'float', 'right', function () {
-                                       assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (bug 40500)' );
+                                       assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (T42500)' );
                                        done();
                                } );
                        },
                mw.loader.load( 'test.implement.d' );
        } );
 
-       // @import (bug 31676)
-       QUnit.test( '.implement( styles has @import )', 7, function ( assert ) {
+       // @import (T33676)
+       QUnit.test( '.implement( styles has @import )', function ( assert ) {
                var isJsExecuted, $element,
                        done = assert.async();
 
                } );
        } );
 
-       QUnit.test( '.implement( dependency with styles )', 4, function ( assert ) {
+       QUnit.test( '.implement( dependency with styles )', function ( assert ) {
                var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
 
                return mw.loader.using( 'test.implement.e' );
        } );
 
-       QUnit.test( '.implement( only scripts )', 1, function ( assert ) {
+       QUnit.test( '.implement( only scripts )', function ( assert ) {
                mw.loader.implement( 'test.onlyscripts', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
        } );
 
-       QUnit.test( '.implement( only messages )', 2, function ( assert ) {
-               assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
+       QUnit.test( '.implement( only messages )', function ( assert ) {
+               assert.assertFalse( mw.messages.exists( 'T31107' ), 'Verify that the test message doesn\'t exist yet' );
 
-               // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
-               mw.loader.implement( 'test.implement.msgs', [], {}, { bug_29107: 'loaded' } );
-               // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
+               mw.loader.implement( 'test.implement.msgs', [], {}, { T31107: 'loaded' } );
 
                return mw.loader.using( 'test.implement.msgs', function () {
-                       assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
+                       assert.ok( mw.messages.exists( 'T31107' ), 'T31107: messages-only module should implement ok' );
                }, function () {
                        assert.ok( false, 'Error callback fired while implementing "test.implement.msgs" module' );
                } );
        } );
 
-       QUnit.test( '.implement( empty )', 1, function ( assert ) {
+       QUnit.test( '.implement( empty )', function ( assert ) {
                mw.loader.implement( 'test.empty' );
                assert.strictEqual( mw.loader.getState( 'test.empty' ), 'ready' );
        } );
 
-       QUnit.test( 'Broken indirect dependency', 4, function ( assert ) {
+       QUnit.test( 'Broken indirect dependency', function ( assert ) {
                // don't emit an error event
                this.sandbox.stub( mw, 'track' );
 
                assert.strictEqual( mw.track.callCount, 1 );
        } );
 
-       QUnit.test( 'Out-of-order implementation', 9, function ( assert ) {
+       QUnit.test( 'Out-of-order implementation', function ( assert ) {
                mw.loader.register( [
                        [ 'test.module4', '0' ],
                        [ 'test.module5', '0', [ 'test.module4' ] ],
                assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
        } );
 
-       QUnit.test( 'Missing dependency', 13, function ( assert ) {
+       QUnit.test( 'Missing dependency', function ( assert ) {
                mw.loader.register( [
                        [ 'test.module7', '0' ],
                        [ 'test.module8', '0', [ 'test.module7' ] ],
                );
        } );
 
-       QUnit.test( 'Dependency handling', 5, function ( assert ) {
+       QUnit.test( 'Dependency handling', function ( assert ) {
                var done = assert.async();
                mw.loader.register( [
                        // [module, version, dependencies, group, source]
                );
        } );
 
-       QUnit.test( 'Skip-function handling', 5, function ( assert ) {
+       QUnit.test( 'Skip-function handling', function ( assert ) {
                mw.loader.register( [
                        // [module, version, dependencies, group, source, skip]
                        [ 'testSkipped', '1', [], null, 'testloader', 'return true;' ],
                );
        } );
 
-       QUnit.asyncTest( '.load( "//protocol-relative" ) - T32825', 2, function ( assert ) {
+       QUnit.asyncTest( '.load( "//protocol-relative" ) - T32825', function ( assert ) {
                // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
                // Test is for regressions!
 
                mw.loader.load( target );
        } );
 
-       QUnit.asyncTest( '.load( "/absolute-path" )', 2, function ( assert ) {
+       QUnit.asyncTest( '.load( "/absolute-path" )', function ( assert ) {
                // Forge a URL to the test callback script
                var target = QUnit.fixurl(
                        mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
                } );
        } );
 
-       QUnit.test( 'Executing race - T112232', 2, function ( assert ) {
+       QUnit.test( 'Executing race - T112232', function ( assert ) {
                var done = false;
 
                // The red herring schedules its CSS buffer first. In T112232, a bug in the
                        } );
        } );
 
-       QUnit.test( 'require()', 6, function ( assert ) {
+       QUnit.test( 'require()', function ( assert ) {
                mw.loader.register( [
                        [ 'test.require1', '0' ],
                        [ 'test.require2', '0' ],
index b3c4bee..923f97d 100644 (file)
@@ -7,7 +7,7 @@
                }
        } ) );
 
-       QUnit.test( 'register', 2, function ( assert ) {
+       QUnit.test( 'register', function ( assert ) {
                var testMessagePosterConstructor = function () {};
 
                mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
index 38ae5e4..cb583e7 100644 (file)
@@ -10,7 +10,7 @@
                }
        } );
 
-       QUnit.test( 'render', 2, function ( assert ) {
+       QUnit.test( 'render', function ( assert ) {
                var html, htmlPartial, data, partials,
                        template = mw.template.get( 'stub', 'test_greeting.mustache' ),
                        partial = mw.template.get( 'stub', 'test_greeting_suffix.mustache' );
index 86fd828..a282325 100644 (file)
@@ -24,7 +24,7 @@
                }
        } );
 
-       QUnit.test( 'add', 1, function ( assert ) {
+       QUnit.test( 'add', function ( assert ) {
                assert.throws(
                        function () {
                                mw.template.add( 'module', 'test_templates_foo', 'hello' );
@@ -33,7 +33,7 @@
                );
        } );
 
-       QUnit.test( 'compile', 1, function ( assert ) {
+       QUnit.test( 'compile', function ( assert ) {
                assert.throws(
                        function () {
                                mw.template.compile( '{{foo}}', 'rainbow' );
@@ -42,7 +42,7 @@
                );
        } );
 
-       QUnit.test( 'get', 4, function ( assert ) {
+       QUnit.test( 'get', function ( assert ) {
                assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.xyz' ), 'xyz compiler' );
                assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.abc' ), 'abc default compiler' );
                assert.throws(
index bac8274..119222a 100644 (file)
@@ -31,7 +31,7 @@
                }
        } ) );
 
-       QUnit.test( 'Initial check', 8, function ( assert ) {
+       QUnit.test( 'Initial check', function ( assert ) {
                assert.ok( window.jQuery, 'jQuery defined' );
                assert.ok( window.$, '$ defined' );
                assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
@@ -51,7 +51,7 @@
                this.restoreWarnings();
        } );
 
-       QUnit.test( 'mw.format', 2, function ( assert ) {
+       QUnit.test( 'mw.format', function ( assert ) {
                assert.equal(
                        mw.format( 'Format $1 $2', 'foo', 'bar' ),
                        'Format foo bar',
                );
        } );
 
+       QUnit.test( 'mw.now', function ( assert ) {
+               assert.equal( typeof mw.now(), 'number', 'Return a number' );
+               assert.equal(
+                       String( Math.round( mw.now() ) ).length,
+                       String( +new Date() ).length,
+                       'Match size of current timestamp'
+               );
+       } );
+
        QUnit.test( 'mw.Map', function ( assert ) {
                var arry, conf, funky, globalConf, nummy, someValues;
 
                assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
                assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
 
-               assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
-               assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
-
                conf.set( String( nummy ), 'I used to be a number' );
 
+               assert.strictEqual( conf.get( funky ), null, 'Map.get returns null if selection was invalid (Function)' );
+               assert.strictEqual( conf.get( nummy ), null, 'Map.get returns null if selection was invalid (Number)' );
+               assert.propEqual( conf.get( [ nummy ] ), {}, 'Map.get returns null if selection was invalid (multiple)' );
+               assert.strictEqual( conf.get( nummy, false ), false, 'Map.get returns custom fallback for invalid selection' );
+
                assert.strictEqual( conf.exists( 'doesNotExist' ), false, 'Map.exists where property does not exist' );
                assert.strictEqual( conf.exists( 'undef' ), true, 'Map.exists where value is `undefined`' );
-               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists where key is invalid but looks like an existing key' );
+               assert.strictEqual( conf.exists( [ 'undef', 'example' ] ), true, 'Map.exists with multiple keys (all existing)' );
+               assert.strictEqual( conf.exists( [ 'example', 'doesNotExist' ] ), false, 'Map.exists with multiple keys (some non-existing)' );
+               assert.strictEqual( conf.exists( [] ), true, 'Map.exists with no keys' );
+               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists with invalid key that looks like an existing key' );
+               assert.strictEqual( conf.exists( [ nummy ] ), false, 'Map.exists with invalid key that looks like an existing key' );
 
                // Multiple values at once
+               conf = new mw.Map();
                someValues = {
                        foo: 'bar',
                        lorem: 'ipsum',
                        notExist: null
                }, 'Map.get return includes keys that were not found as null values' );
 
-               // Interacting with globals and accessing the values object
-               this.suppressWarnings();
-               assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
-               this.restoreWarnings();
+               assert.propEqual( conf.values, someValues, 'Map.values is an internal object with all values (exposed for convenience)' );
+               assert.propEqual( conf.get(), someValues, 'Map.get() returns an object with all values' );
 
+               // Interacting with globals
                conf.set( 'globalMapChecker', 'Hi' );
 
                assert.ok( ( 'globalMapChecker' in window ) === false, 'Map does not its store values in the window object by default' );
 
        } );
 
-       QUnit.test( 'mw.msg', 14, function ( assert ) {
+       QUnit.test( 'mw.msg', function ( assert ) {
                assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
                assert.equal( mw.msg( 'goodbye' ), '⧼goodbye⧽', 'Gets message with default options (nonexistent message)' );
                assert.equal( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
        } );
 
-       QUnit.test( 'mw.hook', 13, function ( assert ) {
+       QUnit.test( 'mw.hook', function ( assert ) {
                var hook, add, fire, chars, callback;
 
                mw.hook( 'test.hook.unfired' ).add( function () {
index 89eb45f..297f0fd 100644 (file)
@@ -6,7 +6,7 @@
                }
        } ) );
 
-       QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
+       QUnit.asyncTest( 'toggleToc', function ( assert ) {
                var tocHtml, $toggleLink, $tocList;
 
                assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
index 5329be6..6c27c5b 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.track' );
 
-       QUnit.test( 'track', 1, function ( assert ) {
+       QUnit.test( 'track', function ( assert ) {
                var sequence = [];
                mw.trackSubscribe( 'simple', function ( topic, data ) {
                        sequence.push( [ topic, data ] );
@@ -15,7 +15,7 @@
                ], 'Events after subscribing' );
        } );
 
-       QUnit.test( 'trackSubscribe', 4, function ( assert ) {
+       QUnit.test( 'trackSubscribe', function ( assert ) {
                var now,
                        sequence = [];
                mw.track( 'before', { key: 1 } );
@@ -40,7 +40,7 @@
                } );
        } );
 
-       QUnit.test( 'trackUnsubscribe', 1, function ( assert ) {
+       QUnit.test( 'trackUnsubscribe', function ( assert ) {
                var sequence = [];
                function unsubber( topic, data ) {
                        sequence.push( [ topic, data ] );
index 7f6efa0..bc12642 100644 (file)
 
                result2 = mw.user.generateRandomSessionId();
                assert.notEqual( result, result2, 'different when called multiple times' );
+       } );
 
+       QUnit.test( 'sessionId', function ( assert ) {
+               var result = mw.user.sessionId(),
+                       result2 = mw.user.sessionId();
+               assert.equal( typeof result, 'string', 'type' );
+               assert.equal( $.trim( result ), result, 'no leading or trailing whitespace' );
+               assert.equal( result2, result, 'retained' );
        } );
 }( mediaWiki, jQuery ) );
index 6dd17f1..01665e5 100644 (file)
@@ -29,7 +29,7 @@
                        [ false, ':::' ],
                        [ false, '::0:', 'IPv6 ending in a lone ":"' ],
 
-                       [ true,  '::', 'IPv6 zero address' ],
+                       [ true, '::', 'IPv6 zero address' ],
 
                        [ false, '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' ],
                        [ false, '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' ],
                        [ false, 'fc::100:', 'IPv6 ending with lone ":"' ],
                        [ false, 'fc:::100', 'IPv6 with ":::" in the middle' ],
 
-                       [ true,  'fc::100', 'IPv6 with "::" and 2 words' ],
-                       [ true,  'fc::100:a', 'IPv6 with "::" and 3 words' ],
-                       [ true,  'fc::100:a:d', 'IPv6 with "::" and 4 words' ],
-                       [ true,  'fc::100:a:d:1', 'IPv6 with "::" and 5 words' ],
-                       [ true,  'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' ],
-                       [ true,  'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' ],
-                       [ true,  '2001::df', 'IPv6 with "::" and 2 words' ],
-                       [ true,  '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' ],
-                       [ true,  '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' ],
+                       [ true, 'fc::100', 'IPv6 with "::" and 2 words' ],
+                       [ true, 'fc::100:a', 'IPv6 with "::" and 3 words' ],
+                       [ true, 'fc::100:a:d', 'IPv6 with "::" and 4 words' ],
+                       [ true, 'fc::100:a:d:1', 'IPv6 with "::" and 5 words' ],
+                       [ true, 'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' ],
+                       [ true, 'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' ],
+                       [ true, '2001::df', 'IPv6 with "::" and 2 words' ],
+                       [ true, '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' ],
+                       [ true, '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' ],
 
                        [ false, 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' ],
                        [ false, 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' ]
                }
        } ) );
 
-       QUnit.test( 'rawurlencode', 1, function ( assert ) {
+       QUnit.test( 'rawurlencode', function ( assert ) {
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
-       QUnit.test( 'escapeId', 17, function ( assert ) {
+       QUnit.test( 'escapeId', function ( assert ) {
                mw.config.set( 'wgExperimentalHtmlIds', false );
                $.each( {
                        '+': '.2B',
                } );
        } );
 
-       QUnit.test( 'wikiUrlencode', 11, function ( assert ) {
+       QUnit.test( 'wikiUrlencode', function ( assert ) {
                assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
                $.each( {
                } );
        } );
 
-       QUnit.test( 'getUrl', 14, function ( assert ) {
+       QUnit.test( 'getUrl', function ( assert ) {
                var href;
                mw.config.set( {
                        wgScript: '/w/index.php',
                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' );
        } );
 
-       QUnit.test( 'wikiScript', 4, function ( assert ) {
+       QUnit.test( 'wikiScript', function ( assert ) {
                mw.config.set( {
                        // customized wgScript for T41103
                        wgScript: '/w/i.php',
                assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
        } );
 
-       QUnit.test( 'addCSS', 3, function ( assert ) {
+       QUnit.test( 'addCSS', function ( assert ) {
                var $el, style;
                $el = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
 
                $( style.ownerNode ).remove();
        } );
 
-       QUnit.test( 'getParamValue', 5, function ( assert ) {
+       QUnit.test( 'getParamValue', function ( assert ) {
                var url;
 
                url = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
                assert.strictEqual( mw.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 (bug 27427)' );
+               assert.strictEqual( mw.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', 'Bug 30441: getParamValue must understand "+" encoding of space' );
+               assert.strictEqual( mw.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', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
+               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );
 
-       QUnit.test( '$content', 2, function ( assert ) {
+       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' );
        } );
         * Previously, test elements where invisible to the selector since only
         * one element can have a given id.
         */
-       QUnit.test( 'addPortletLink', 13, function ( assert ) {
+       QUnit.test( 'addPortletLink', function ( assert ) {
                var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
                        addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
 
                assert.equal(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
                        1,
-                       'addPortletLink did not add the item to all <ul> elements in the portlet (bug 35082)'
+                       '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',
                assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
        } );
 
-       QUnit.test( 'validateEmail', 6, function ( assert ) {
+       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( mw.util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
        } );
 
-       QUnit.test( 'isIPv6Address', 40, function ( assert ) {
+       QUnit.test( 'isIPv6Address', function ( assert ) {
                $.each( IPV6_CASES, function ( i, ipCase ) {
                        assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
-       QUnit.test( 'isIPv4Address', 11, function ( assert ) {
+       QUnit.test( 'isIPv4Address', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
                        assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
-       QUnit.test( 'isIPAddress', 51, function ( assert ) {
+       QUnit.test( 'isIPAddress', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
                        assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
index f404294..9864166 100644 (file)
@@ -25,7 +25,7 @@
                }
        } ) );
 
-       QUnit.test( 'isElementInViewport', 6, function ( assert ) {
+       QUnit.test( 'isElementInViewport', function ( assert ) {
                var viewport = $.extend( {}, DEFAULT_VIEWPORT );
                assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
                        'It should return true when the element is fully enclosed in the viewport' );
@@ -60,7 +60,7 @@
                        'It should default to the window object if no viewport is given' );
        } );
 
-       QUnit.test( 'isElementInViewport with scrolled page', 1, function ( assert ) {
+       QUnit.test( 'isElementInViewport with scrolled page', function ( assert ) {
                var viewport = {
                                top: 2000,
                                left: 0,
@@ -83,7 +83,7 @@
                window.scrollTo( 0, 0 );
        } );
 
-       QUnit.test( 'isElementCloseToViewport', 3, function ( assert ) {
+       QUnit.test( 'isElementCloseToViewport', function ( assert ) {
                var
                        viewport = {
                                top: 90,
index e6e798b..02ca243 100644 (file)
@@ -1,4 +1,4 @@
-/*global isCompatible: true */
+/* global isCompatible: true */
 ( function ( $ ) {
        var testcases = {
                tested: [
 
        QUnit.module( 'startup', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'isCompatible( featureTestable )', testcases.tested.length, function ( assert ) {
+       QUnit.test( 'isCompatible( featureTestable )', function ( assert ) {
                $.each( testcases.tested, function ( i, ua ) {
-                               assert.strictEqual( isCompatible( ua ), true, ua );
-                       }
-               );
+                       assert.strictEqual( isCompatible( ua ), true, ua );
+               } );
        } );
 
-       QUnit.test( 'isCompatible( blacklisted )', testcases.blacklisted.length, function ( assert ) {
+       QUnit.test( 'isCompatible( blacklisted )', function ( assert ) {
                $.each( testcases.blacklisted, function ( i, ua ) {
-                               assert.strictEqual( isCompatible( ua ), false, ua );
-                       }
-               );
+                       assert.strictEqual( isCompatible( ua ), false, ua );
+               } );
        } );
 }( jQuery ) );
index c38b89c..de201b9 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -272,7 +272,7 @@ function wfStreamThumb( array $params ) {
        // For 404 handled thumbnails, we only use the base name of the URI
        // for the thumb params and the parent directory for the source file name.
        // Check that the zone relative path matches up so squid caches won't pick
-       // up thumbs that would not be purged on source file deletion (bug 34231).
+       // up thumbs that would not be purged on source file deletion (T36231).
        if ( $rel404 !== null ) { // thumbnail was handled via 404
                if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {
                        // Request for the canonical thumbnail name